Как распечатать точный 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 (даже заявления об обновлении).
EDIT: Профилирование с 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);
Comments