#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();