Вопрос

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

Я понимаю, что с этим решением мне не нужно ничего цитировать, потому что база данных обрабатывает это за меня.

Запрашивание объектов Zend_Db_Table и _Row через API

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

Вопросы

Я понимаю, что a) - это не нормально, потому что оно вообще не цитируется.Но как насчет других версий, какая самая лучшая?Обрабатывается ли c) как утверждение и автоматически ли оно заключено в кавычки или мне нужно использовать d) когда я использую ?идентификатор?

Это было полезно?

Решение

Отказ от ответственности: Эта информация действительна на первоначальную дату публикации этого ответа.ZF часто меняется, эта информация может устареть в будущих выпусках, однако для архивных целей она останется неизменной.

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

Другие советы

Я привык к

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top