0

最初にPHPアプリを開発したとき(MySQlですが、将来の拡張を可能にするためにODBCインターフェースを使用しています)、SQLを変数に割り当ててを呼び出すだけodbc_exec()でした。

変数を調べるだけでよいので、デバッグが簡単になりました$sql

もちろん、ユーザー入力をサニタイズするには、プリペアドステートメントを使用する必要があることにすぐに気付きました。

私の質問は、プリペアドステートメントをデバッグするために、データベースで実行されている正確なSQLを見つける方法です。

PHPからは実行できないことを再確認しましたが、SQLをインターセプトできる外部モニターツールはありますか?または、コンソールウィンドウを開いたままにしておくと、エコーするMySqlコマンドでさえありますか?

4

3 に答える 3

1

MySQLクエリログを使用します。

于 2011-10-18T03:29:02.033 に答える
1

--log[=file_name]ログファイルを作成することでmysqlサーバーを起動できます。

于 2011-10-18T03:30:47.090 に答える
0

PHPコード内でのデバッグを支援するために私が思いついたコードを次に示します。

ただし、MySqlによって実行されていることを完全に証明するために、他のポスターは正しいです。クエリログを見てください。

function OdbcPrepareAndExecute($sql, $parameter_array)
{
   if (substr_count($sql, '?') != count($parameter_array))
   {
      ob_start();
      var_dump($parameter_array);
      $parameter_array_dump .= ob_get_clean();

      ReportErrorAndDie('Invalid parameters', 
                        'Request to prepare ODBC statement "' . $sql .'" with ' .
                        substr_count($sql, '?') . ' place-holders, but ' . 
                        count($parameter_array) . ' parameters in array : ' .
                        $parameter_array_dump
                       );
   }


   LogDatabaseActivity('Prepare SQL "' . $sql . '"');

   $prepared_statement = @odbc_prepare($_SESSION['connection'], $sql);
   if($prepared_statement === False) 
   {
      ReportErrorAndDie('Database problem', 
                        'Could not prepare ODBC statement "' . $sql .'"');
   }

   LogDatabaseActivity('Execute prepared SQL statement with the following parameters:');
   ob_start();
   var_dump($parameter_array);
   $parameter_array_dump = ob_get_clean();
   LogDatabaseActivity($parameter_array_dump);

   $expanded_sql = $sql;
   for ($i = 0; $i < count($parameter_array); $i++)
   $expanded_sql = substr_replace($expanded_sql, 
                                  $parameter_array[$i], 
                                  strpos($expanded_sql, '?'), 
                                  1);

   LogDatabaseActivity('(preapred statement expands to "' . $expanded_sql . '")');

   $result = @odbc_execute($prepared_statement, $parameter_array);
于 2011-10-19T02:44:10.093 に答える