2013-02-20 3 views
0

При чтении документации Zend Framework 2: http://framework.zend.com/manual/2.0/en/modules/zend.db.sql.html приведены два примера того, как можно запрашивать данные из базы данных. Для справки, они:Zend Framework 2 Zend Db Sql Sql - prepareStatementForSqlObject vs getSqlStringForSqlObject

Для подготовки (с помощью Выбрать объект):

use Zend\Db\Sql\Sql; 
$sql = new Sql($adapter); 
$select = $sql->select(); 
$select->from('foo'); 
$select->where(array('id' => 2)); 

$statement = $sql->prepareStatementForSqlObject($select); 
$results = $statement->execute(); 

Чтобы выполнить (с помощью Выбрать объект)

use Zend\Db\Sql\Sql; 
$sql = new Sql($adapter); 
$select = $sql->select(); 
$select->from('foo'); 
$select->where(array('id' => 2)); 

$selectString = $sql->getSqlStringForSqlObject($select); 
$results = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE); 

Мне не удалось найти какие-либо дальнейшие инструкции в документация о том, какие преимущества/недостатки могут иметь один метод по сравнению с другими в определенных ситуациях. Я вижу, что если нам нужно отлаживать наш SQL-запрос, getSqlStringForSqlObject поможет нам это сделать. Но кроме того, кто-нибудь знает ситуацию, когда один метод может быть лучше другого?

Спасибо.

ответ

3

Я бы, конечно, использовал prepareStatementForSqlObject(), чтобы подготовить ваши заявления для выполнения.

prepareStatementForSqlObject() will return a StatementInterface type object. 

getSqlStringForSqlObject() will get you back an actual raw SQL string. 

prepareStatementForSqlObject() не используется нигде в библиотеке, и, вероятно, не должна использоваться внешне так или иначе. Я бы придерживался использования объекта Statement для выполнения запросов, если можно.

Второй пример, вероятно, просто для иллюстрации, вы можете выполнить необработанные строки SQL, если это необходимо.

+0

Так было бы что второй пример «getSqlStringForSqlObject()» на самом деле не готовит оператор, а просто преобразует его в строку для прямого выполнения с БД. В таком случае, да, я могу легко увидеть разницу между ними. Спасибо за понимание. – Derrick

0

Я думаю, что ваше сомнение напрямую не связано с этими конкретными методами Zend, но приходит больше из того, что вы не понимаете, какие подготовленные SQL-инструкции есть. В Википедии есть good overview.

Подводя итог, я ожидал бы, что prepareStatementForSqlObject() будет использовать поддержку системы баз данных для подготовленных запросов, которые имеют общее преимущество: a) предлагают лучшую производительность в случае множественного выполнения и b) помогают защитить от SQL-инъекции.

+0

Что такое класс ResultSet? – Vasily

0

ZF1 и ZF2 настолько различны и грустная часть путаница, что наиболее публичная документация ZF1

Он платит читать PDO документацию, ZF2 DB сидит в основном в качестве обертки на PDO

Я провел часы отладки, пока не решил проследить SQLs

При использовании MYSQLyou должен проследить SQLs, чтобы понять и отладки ZF2

How can I view live MySQL queries? имеет очень легко

Следующие работы кода $ sql = new Sql (self :: getadapter()); $ select = $ sql-> select(); $ select-> from ('tbl_login');

$select ->where('logincd = ?', $logincd); 
$select ->where('password = ?', $password); 
$select ->where('active = ?', "Y"); 

$statement = $sql->prepareStatementForSqlObject($select); 
// $result = $statement->execute(); // WRONG 
$result = $statement->execute(array($logincd,$password,"Y")); // RIGHT 

$rowset = new ResultSet; 
$rowset->initialize($result); 
$onerow=$rowset->current(); 

я пропустил массив ($ logincd, $ пароль, "Y") и сервер SQL достижения MSQL был ВЫБРАТЬ tbl_login.* FROM tbl_login WHERE logincd = NULL и пароль = NULL и активен = NULL

Когда я поставил параметр массива в выполнить это ВЫБРАТЬ tbl_login. * FROM tbl_login WHERE logincd = 'JNC' и пароль = 'секрет' AND активный =

трассировка Hwever «Y» не помогло мне решить кошмарную ошибку я кодированный

$dbtable=new TableGateway('tbl_event_log',self::getadapter()); 

$dbtable->insert(array(
    'logincd' => $logincd , 
    'eventdttm' => date('Y-m-d H:i:s'), 
    'storecd' => "S01", // $_SESSION["storecd"], 
    'eventcd' => $eventcd , 
    'eventtxt' => $eventtxt) 
); 

НО моя ошибка, которую я имел 1 дополнительное место в «» logincd Получил ярдов от PDO exeption и нет trce!

После много боли изменился адаптер (водитель был Pdo_Mysql) к «водителя» => «Mysqli» Раствором «Неизвестный столбца„logincd“в„списке поля“

В ОБОИХ выборе шуруповёрта SQL INSERT не пришел на Сервер; следа не помогло

Так что мой совет использовать SQL Trace, а также флип-драйвер для решения ZF2 DB вопросы

ZF2 DB очень хорошо, несмотря на эти глюки

Jayanta @Kolkata

Смежные вопросы