web-dev-qa-db-ja.com

PDO準備済みステートメントからクエリを取得する

PDO Prepared Statementオブジェクトの生成に使用されたクエリを取得する方法はありますか?

48
ChrisR

$ statement-> queryString を試してください。

32
Arkh

デフォルトの\ PDOおよび\ PDOStatementオブジェクトを拡張することに反対していない場合は、以下を検討することをお勧めします。

github.com/noahheck/E_PDOStatement

このPDOの拡張により、データベースレベルで実行される可能性のある例として、完全なクエリステートメントを表示できます。正規表現を使用して、PDOステートメントのバインドされたパラメーターを補間します。

デフォルトの\ PDOStatement定義を拡張することにより、E_PDOStatementは、通常のワークフローを変更することなく、デフォルトの機能にこの拡張機能を提供できます。

免責事項:この拡張機能を作成しました。

他の人に役立つことを願っています。

10
myesain

この手順は機能します。 debugDumpParams()は出力を返さないため。ここに私がデザインしたちょっとしたトリックがあります。

// get the output before debugDumpParams() get executed 
$before = ob_get_contents();

//start a new buffer
ob_start();

// dump params now
$smt->debugDumpParams();

// save the output in a new variable $data
$data = ob_get_contents();

// clean the output screen
ob_end_clean();

// display what was before debugDumpParams() got executed
printf("%s", $before);

$statement = "";

// Now for prepared statements
if (stristr($data, 'Sent SQL') !== false)
{

// begin extracting from "Sent SQL"
$begin = stristr($data, 'Sent SQL');

// get the first ] square bracket
$square = strpos($begin, "]");

// collect sql
$begin = substr($begin, $square + 1);
$ending = strpos($begin, "Params");

$sql = substr($begin, 0, $ending);
$sql = trim($sql);

  // sql statement here
  $statement = $sql;
}
else
{
  if (stristr($data, 'SQL') !== false)
  {
     $begin = stristr($data, 'SQL');
     // get the first ] square bracket
     $square = strpos($begin, "]");

     // collect sql
     $begin = substr($begin, $square + 1);
     $ending = strpos($begin, "Params");

     $sql = substr($begin, 0, $ending);
     $sql = trim($sql);

     $statement = $sql;
  }

}


// statement here
echo $statement;

お役に立てれば。

0
Ifeanyi Amadi

セルフプロモーション: https://github.com/ellisgl/GeekLab-GLPDO2 デバッグメソッドを使用して、予想されるクエリを出力できます。私は最近それを更新しています。

0
EllisGL