Как распечатать точный 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 ? добрый совет
12 ответов
Select объекты имеют метод __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);
Я пересек сто страниц, много гуглил, но я не нашел никакого точного решения. Наконец - то это сработало. Независимо от того, где вы находитесь в контроллере или модели. Этот код работал на меня везде. Просто используйте это
//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;
наконец-то эта штука сработала для меня.
можно использовать Zend_Debug::Dump($select->assemble());
для получения SQL-запроса.
или вы можете включить Zend DB FirePHP profiler который получит все запросы в аккуратном формате в Firebug (даже операторы обновления).
редактировать: Профилирование с FirePHP также работает и в FF6.0+ (не только в FF3.0 как предложено в ссылке)
$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;
Проверьте Zend_Db_Profiler. Это позволяет регистрировать любую инструкцию SQL по мере ее подготовки и выполнения. Он работает для инструкций UPDATE, а также для запросов SELECT.
Я сделал это таким образом
$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();
$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);