MySQLi の準備済みステートメントをエコーするにはどうすればいいですか? 質問する

MySQLi の準備済みステートメントをエコーするにはどうすればいいですか? 質問する

私は現在、MySQLi をいじって、それがどのように機能するかを理解しようとしています。現在のプロジェクトでは、すべてが正しいことを確認し、コードをすばやくデバッグするために、コーディング中にクエリ文字列をエコー出力することを常に好んでいます。しかし...準備された MySQLi ステートメントでこれを行うにはどうすればよいでしょうか?

例:

$id = 1;
$baz = 'something';

if ($stmt = $mysqli->prepare("SELECT foo FROM bar WHERE id=? AND baz=?")) {
  $stmt->bind_param('is',$id,$baz);
  // how to preview this prepared query before acutally executing it?
  // $stmt->execute();
}

私はこのリストに目を通しました(http://www.php.net/mysqli) だが運がなかった。


編集

さて、MySQLi 内からそれが不可能であれば、次のような方法を採用するかもしれません:

function preparedQuery($sql,$params) {
  for ($i=0; $i<count($params); $i++) {
    $sql = preg_replace('/\?/',$params[$i],$sql,1);
  }
  return $sql;
}

$id = 1;
$baz = 'something';

$sql = "SELECT foo FROM bar WHERE id=? AND baz=?";

echo preparedQuery($sql,array($id,$baz));

// outputs: SELECT foo FROM bar WHERE id=1 AND baz=something

もちろん完璧とは程遠い。まだかなり冗長なため(これは避けたかったことだが)、MySQLiによってデータがどう処理されるかはわからない。しかし、この方法ならすべてのデータが存在し、適切な場所にあるかどうかをすぐに確認できるので、時間の節約になるだろう。いくつかの変数を手動でクエリに組み込む場合に比べて時間がかかりますが、変数が多い場合は面倒な作業になる可能性があります。

ベストアンサー1

少なくとも、あなたが期待していた方法ではできないと思います。クエリ文字列を自分で作成して実行するか(つまり、ステートメントを使用せずに)、その機能をサポートするラッパーを探すか作成する必要があります。私が使用しているのはゼンドDB、私は次のようにします:

$id = 5;
$baz = 'shazam';
$select = $db->select()->from('bar','foo')
                       ->where('id = ?', $id)
                       ->where('baz = ?', $baz); // Zend_Db_Select will properly quote stuff for you
print_r($select->__toString()); // prints SELECT `bar`.`foo` FROM `bar` WHERE (id = 5) AND (baz = 'shazam')

おすすめ記事