Моя Zend Framework «цитирует» беспорядок

У меня есть, вероятно, очень простая проблема, к которой я не могу найти удовлетворительный (субъективно замеченный) ответ в руководстве 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 обрабатывает это для меня.

Запрос объектов Zend_Db_Table и _Row по API

$ 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);