Как напечатать точный SQL-запрос в Zend Framework? - PullRequest
68 голосов
/ 11 октября 2011

У меня есть следующий фрагмент кода, который я взял из модели,

    ...
                  $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?добрый совет

Ответы [ 14 ]

117 голосов
/ 12 октября 2011

У выбранных объектов есть метод __toString () в Zend Framework.

Из руководства 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

23 голосов
/ 13 мая 2013

из> = 2.1.4

echo $select->getSqlString()
15 голосов
/ 01 марта 2012

Я просмотрел сотни страниц, много погуглил, но не нашел точного решения. Наконец это сработало для меня. Независимо от того, где вы находитесь в контроллере или модели. Этот код работал для меня везде. Просто используйте это

//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;

Наконец-то эта штука сработала для меня.

6 голосов
/ 11 октября 2011

Вы можете использовать Zend_Debug::Dump($select->assemble());, чтобы получить запрос SQL.

Или вы можете включить Zend DB FirePHP profiler , который будет получать все запросы в чистом формате в Firebug (даже операторы UPDATE).

EDIT : Профилирование с FirePHP также работает и в FF6.0 + (не только в FF3.0, как предлагается в ссылке)

3 голосов
/ 26 декабря 2014
2 голосов
/ 22 февраля 2013

вы можете распечатать ..

print_r($select->assemble());
1 голос
/ 25 ноября 2016

еще короче:

echo $select->__toString()."\n";

и больше короче:

echo  $select .""; die;
1 голос
/ 22 ноября 2013
$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;
0 голосов
/ 21 июня 2019

Запрос, возвращаемый из профилировщика или объекта запроса, будет иметь заполнители, если вы их используете.

Чтобы увидеть точный запрос, выполняемый 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. Не удалось увидеть это с помощью профилировщика.

0 голосов
/ 10 января 2019

Это из документации Zend Framework (т.е. ОБНОВЛЕНИЕ):

echo $update->getSqlString();

(Бонус) Я использую это в моих собственных файлах модели:

echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);

Хорошего дня:)

...