У меня есть, вероятно, очень простая проблема, к которой я не могу найти удовлетворительный (субъективно замеченный) ответ в руководстве Zend Framework или в другом месте …
Есть так много способов, как я могу передать свои PHP-переменные моим запросам sql, которые я потерял в обзоре, и, вероятно, мне не хватает понимания о цитировании в целом.
$sql = "SELECT this, that FROM table WHERE id = ? AND restriction = ?"; $stmt = $this->_db->query($sql, array($myId, $myValue)); $result = $stmt->fetchAll();
Я понимаю, что с этим решением мне не нужно ничего цитировать, потому что db обрабатывает это для меня.
$ users = new Users ();
a) $users->fetchRow('userID = ' . $userID); b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER')); c) $users->fetchRow('userID = ?', $userID); d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));
Я понимаю, что а) не в порядке, потому что это вообще не цитируется. Но как насчет других версий, что лучше? В) рассматривается как заявление и автоматически цитируется или мне нужно использовать d) когда я использую? идентификатор?
Отказ от ответственности: эта информация действительна с даты первоначальной отправки этого ответа. ZF часто меняется, эта информация может устареть от будущих выпусков, однако это останется неизменным для архивных целей.
Если вы передадите строку в метод fetchRow()
подкласса Zend_Db_Table_Abstract
(который вы делаете), он будет рассматриваться как часть экземпляра Zend_Db_Table_Select
.
Другими словами, внутренне, Zend_Db_Table
делает это:
if (!($where instanceof Zend_Db_Table_Select)) { $select = $this->select(); if ($where !== null) { $this->_where($select, $where); }
Так…:
a) $users->fetchRow('userID = ' . $userID);
Не цитируется вообще.
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));
Ручно цитируется как целое число.
c) $users->fetchRow('userID = ?', $userID);
Автоматически цитируется Zend_Db_Adapter_*::quoteInto()
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));
Фактически двойные кавычки, один раз вам, и один раз через автоматическое цитирование.
Что касается «наилучшего», я бы рекомендовал вариант C. Структура автоматически вызывает quoteInto
по параметризованному значению.
Имейте в виду: вы всегда можете передать экземпляр Zend_Db_Table_Select
или Zend_Db_Select
вместо метода fetchRow()
…
Опять же, в подклассе Zend_Db_Table_Abstract
, это будет выглядеть так:
$this->fetchRow($this->select()->where('userID = ?', $userID));
Плюсом этого является то, что вы можете создавать гораздо более сложные запросы, так как вы контролируете гораздо больше, чем просто WHERE
SQL-запроса. Теоретически вы можете легко сделать:
$select = $this->select()->where('userID = ?', $userID) ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn')); $this->fetchRow($select);
Примечание. Если передан экземпляр Zend_Db_Select
, метод fetchRow()
действует точно так же, как fetchAll()
за исключением того, что он внутренне вызывает метод limit()
объекта select с параметром 1
.
я привык
$where = $this->getAdapter()->quoteInto('name = ?', $name); $this->fetchRow($where);