web-dev-qa-db-ja.com

Zend Frameworkで正確なSQLクエリを印刷するにはどうすればよいですか?

私はモデルから取った次のコードを持っています、

    ...
                  $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で出力する方法はありますか?親切にアドバイス

69
mymotherland

Zend Frameworkには、選択オブジェクトに__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

121
Mark Basmayor

2.1.4以上から

echo $select->getSqlString()
23
Whisher

私は何百ページも横断し、グーグルで検索しましたが、正確な解決策は見つかりませんでした。最終的にこれは私のために働いた。コントローラーまたはモデルのどこにいても。このコードはどこでも機能しました。これを使うだけ

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

最後に、このことは私のために働いた。

15
Rajan Rawal

Zend_Debug::Dump($select->assemble());を使用して、SQLクエリを取得できます。

または、 Zend DB FirePHPプロファイラー を有効にすると、Firebugですべてのクエリを適切な形式で取得できます(UPDATEステートメントも含む)。

EDIT:FirePHPによるプロファイリングはFF6.0 +でも機能します(リンクで提案されているFF3.0だけでなく)

6
Christian P
3
Walter Caraza

印刷できます。

print_r($select->assemble());
2
AvMishra

さらに短く:

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

およびmore短縮:

echo  $select .""; die;
1
Vladimir Ch
$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;
1
Username

これは Zend Framework documentation (つまりUPDATE)からのものです:

echo $update->getSqlString();

(ボーナス)私は自分のモデルファイルでこれを使用します。

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

ごきげんよう :)

0
KevDev

これを使って:-

echo $select->query();

または

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

プロファイラーまたはクエリオブジェクトから返されたクエリには、それらを使用している場合、プレースホルダーがあります。

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
txyoji

Zend_Db_Profiler を確認してください。これにより、SQLステートメントが準備および実行されるときに、それをログに記録できます。 UPDATEステートメントとSELECTクエリで機能します。

0
Bill Karwin

私はこの方法でこれをやった

$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();
0
Rajesh Patel