Как распечатать точный 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 ? добрый совет

618   12  

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

http://framework.zend.com/manual/en/zend.db.select.html

from > = 2.1.4

echo $select->getSqlString()

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

//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, как предлагается в ссылке)

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

print_r($select->assemble());
$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;

использовать это:-

echo $select->query();

или

Zend_Debug::dump($select->query();

Проверьте 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();

еще короче:

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

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

echo  $select .""; 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

    Ничего не найдено.