НЕОБРАБОТАННЫЙ SQL-запрос с Zend Framework

#php #mysql #sql #zend-framework

#php #mysql #sql #zend-framework

Вопрос:

Есть ли способ выполнить строку SQL в качестве запроса в Zend Framework?

У меня есть строка, подобная этой:

 $sql = "SELECT * FROM testTable WHERE myColumn = 5"
  

теперь я хочу выполнить эту строку напрямую, предварительно проанализировав ее и создав из нее Zend_Db_Table_Select объект «вручную». Или, если это возможно, создайте Zend_Db_Table_Select объект из этой строки, чтобы выполнить этот объект.

Как я могу это сделать? Я не нашел решения для этого в документе Zend.

Ответ №1:

Если вы создаете объект Zend_Db в начале, вы можете создать запрос, используя его. Взгляните на эту запись в руководстве : https://framework.zend.com/manual/1.12/en/zend.db.statement.html

 $stmt = $db->query(
            'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
            array('goofy', 'FIXED')
        );
  

Или

 $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
$stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  

Комментарии:

1. $db->query($sql, array()) также работает? потому что у меня действительно есть параметры, уже введенные в строку!? И должен ли я извлекать результирующий набор с помощью $stmt->fetchAll() ?

2. Для полноты картины: да, $stmt->fetchAll() получит результаты.

3. В большинстве случаев лучше использовать фреймворк, поскольку в нем много автоматических защит. Но иногда вы хотите оптимизировать запрос или получить некоторые очень специфические данные. В таких случаях нет никаких способов обойти написание пользовательских запросов. Просто убедитесь, что ваш запрос обработан должным образом.

4. Я объявляю $ db =Zend_Db_Table_Abstract::getDefaultAdapter(); внутри функции моей модели

Ответ №2:

Если вы используете TableGateway, вы можете запустить свой необработанный SQL-запрос, используя эту инструкцию,

 $this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);
  

где $ sql относится к вашему необработанному запросу. Это может быть полезно для запросов, у которых нет собственного аналога ZF2, такого как операторы TRUNCATE / INSERT SELECT.

Ответ №3:

Вы можете использовать тот же запрос в формате Zend, что и

 $select = db->select()->from(array('t' => 'testTable'))
                     ->$where= $this->getAdapter()->quoteInto('myColumn = ?', $s);
$stmt = $select->query();
$result = $stmt->fetchAll();
  

Комментарии:

1. Здесь вам не нужно использовать quoteInto(). where () сделает это за вас автоматически.

Ответ №4:

Вот пример для ZF1:

 $db =Zend_Db_Table_Abstract::getDefaultAdapter();
$sql =    "select * from user"
$stmt = $db->query($sql);
$users =  $stmt->fetchAll();
  

Комментарии:

1. для меня это не работает, кстати, где я должен определить переменную $ db, упомянутую выше, в моем классе, который расширяется от Zend_Db_Table_Abstract или в моем контроллере?

2. @adm вы можете использовать $db =Zend_Db_Table_Abstract::getDefaultAdapter(); где угодно. Приведенный выше код взят с моего контроллера.

3. Это выдает мне ошибку, подобную этой: Неустранимая ошибка: вызов функции-члена query() для не-объекта в /home/tmtmedia/public_html/trakmysafari/application/models/trip.php в строке 199

4. вы можете использовать приведенный выше код в контроллере. Если у вас есть класс (например, MyModel), который расширяется с помощью Zend_Db_Table_Abstract , попробуйте проверить все общедоступные функции с помощью «get_class_methods», и если вы найдете getDefaultAdapter(), то вы можете использовать этот код в классе (MyModel): $rows = $this-> getDefaultAdapter()-> query(«выбрать * из mytable»)-> fetchAll();