5

mysqli::prepareと でフォーマットされたクエリをエクスポートすることはできます::bind_paramか?

例:

<?php
$mysqli = new mysqli('host', 'user', 'pass', 'table');
if(mysqli_connect_errno()){
    printf('Connect failed: %s\n', mysqli_connect_error());
    exit;
}

$data=7290;

if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){
    $stmt->bind_param('i',$data);
    $stmt->execute();
    $stmt->bind_result($id,$info);
    while($q=$stmt->fetch()){
        echo $id,': ',$info,'<br>';
    }
    $stmt->close();
}
$mysqli->close();
?>

and soQUERYによって実行される関数をエクスポートしたいと思います (これは架空の例です)。mysql::preparebind_param

if ($stmt = $mysqli->prepare('SELECT `id`,`info` FROM `propertys` WHERE id>?')){
    $stmt->bind_param('i',$data);
    $stmt->execute();
    echo $stmt->exportQuery();//Function does not exist, just for example

関数::exportQueryは次のように出力されます。

SELECT `id`,`info` FROM `propertys` WHERE id>7290

解決策はありますか?

ありがとう。

4

3 に答える 3

6

これがデバッグに役立つことはわかっていますが、準備済みステートメントが機能する方法ではありません。パラメーターは、クライアント側の準備済みステートメントと結合されません。PHP は、パラメーターと組み合わせたクエリ文字列にアクセスできません。

prepare() を実行すると SQL ステートメントがデータベース サーバに送信され、execute() を実行するとパラメータが個別に送信されます。MySQL の一般的なクエリ ログには、execute() 後に値が補間された最終的な SQL が表示されます。以下は、私の一般的なクエリ ログからの抜粋です。PHP からではなく、mysql CLI からクエリを実行しましたが、原則は同じです。

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

あなたのコメントについて:

@Baily は正しいです。MySQL には、パラメーターが補間された完全なクエリを返すクライアント側のソリューションがありません。PHP のせいではありません。

上記のログを有効にするには、MySQL クライアントで、または API 経由で PHP から送信された次のコマンドを使用します。

SET GLOBAL general_log = ON;

すべてのクエリをログに記録するにはオーバーヘッドがかかるため、情報の収集が完了したら、ログをオフにする必要があります。

SET GLOBAL general_log = OFF;

PS: ログ設定を動的に変更するには、MySQL 5.1 以降が必要です。以前のバージョンでは、ロギングを変更したときに mysqld を再起動する必要がありました。

于 2013-06-13T22:28:34.790 に答える