Как распечатать точный sql-запрос в zend framework?
У меня есть следующий фрагмент кода, который я взял из модели,
...
$select = $this->_db->select()
->from($this->_name)
->where('shipping=?',$type)
->where('customer_id=?',$userid);
echo $select; exit; // which gives exact mysql query.
.....
Когда я использую запрос на обновление в zend,
$up_value = array('billing'=> '0');
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);
Здесь я хочу узнать точный запрос mysql. Есть ли возможный способ печати запроса mysql в zend? любезный совет
Ответы
Ответ 1
В Zend Framework объекты select имеют метод __toString().
Из руководства Zend Framework:
$select = $db->select()
->from('products');
$sql = $select->__toString();
echo "$sql\n";
// The output is the string:
// SELECT * FROM "products"
Альтернативным решением будет использование Zend_Db_Profiler.
то есть.
$db->getProfiler()->setEnabled(true);
// your code
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);
http://framework.zend.com/manual/en/zend.db.select.html
Ответ 2
from >= 2.1.4
echo $select->getSqlString()
Ответ 3
Я проехал сотни страниц, много искал, но я не нашел никакого точного решения.
Наконец это сработало для меня. Независимо от того, где вы находитесь в контроллере или модели. Этот код работал у меня везде. Просто используйте это
//Before executing your query
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$db->getProfiler()->setEnabled(true);
$profiler = $db->getProfiler();
// Execute your any of database query here like select, update, insert
//The code below must be after query execution
$query = $profiler->getLastQueryProfile();
$params = $query->getQueryParams();
$querystr = $query->getQuery();
foreach ($params as $par) {
$querystr = preg_replace('/\\?/', "'" . $par . "'", $querystr, 1);
}
echo $querystr;
Наконец, эта работа сработала для меня.
Ответ 4
Вы можете использовать Zend_Debug::Dump($select->assemble());
для получения запроса SQL.
Или вы можете включить Zend DB FirePHP-профайлер, который предоставит вам все запросы в аккуратном формате в Firebug (даже для операторов UPDATE).
ИЗМЕНИТЬ:
Профилирование с помощью FirePHP также работает и в FF6.0 + (не только в FF3.0, как указано в ссылке)
Ответ 5
Теперь на Zend2:
$select->getSqlString();
Отображение сгенерированного SQL из объекта ZendDbSql
Ответ 6
вы можете распечатать..
print_r($select->assemble());
Ответ 7
$statement = $this->sql->getSqlStringForSqlObject( HERE GOES Zend\Db\Sql\SelectSQL object );
echo "SQL statement: $statement";
Пример:
$select = $this->sql->select();
...
$select->from(array( 'u' => 'users' ));
$select->join(...
$select->group('u.id');
...
$statement = $this->sql->getSqlStringForSqlObject($select);
echo $statement;
Ответ 8
Используйте это: -
echo $select->query();
или
Zend_Debug::dump($select->query();
Ответ 9
Проверьте Zend_Db_Profiler. Это позволяет вам регистрировать любой оператор SQL по мере его подготовки и выполнения. Он работает для операторов UPDATE, а также для запросов SELECT.
Ответ 10
Я сделал это таким образом
$sql = new Sql($this->adapter);
$select = $sql->select();
$select->from('mock_paper');
$select->columns(array(
'is_section'
));
$select->where(array('exam_id = ?' => $exam_id,'level_id = ?' => $level_id))->limit(1);
$sqlstring = $sql->buildSqlString($select);
echo $sqlstring;
die();
Ответ 11
еще короче:
echo $select->__toString()."\n";
и больше короче:
echo $select .""; die;
Ответ 12
Запрос, возвращаемый из профилировщика или объекта запроса, будет иметь заполнители, если вы их используете.
Чтобы увидеть точный запрос, выполняемый mysql, вы можете использовать общий журнал запросов.
В этом списке будут перечислены все запросы, которые были выполнены с момента его включения. Не забудьте отключить это, как только вы собрали свой образец. На активном сервере; этот журнал может заполниться очень быстро.
Из терминала MySQL или инструмента запросов, таких как MySQL Workbench, запустите:
SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;
затем запустите ваш запрос. Результаты хранятся в таблице "mysql.general_log".
SELECT * FROM mysql.general_log
Чтобы отключить журнал запросов:
SET GLOBAL general_log = 0;
Чтобы убедиться, что он выключен:
SHOW VARIABLES LIKE 'general%';
Это помогло мне найти запрос, в котором заполнитель не был заменен на Zend DB. Не могу увидеть это с профилировщиком.
Ответ 13
$db->getProfiler()->setEnabled(true);
// your code
$this->update('table', $data, $where);
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);
Ответ 14
Это из документации Zend Framework (т.е. ОБНОВЛЕНИЕ):
echo $update->getSqlString();
(Бонус) Я использую это в моих собственных файлах модели:
echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);
Хорошего дня :)