如何监控SQL(使用预处理语句)



当第一次开发PHP应用程序(MySQl,但使用ODBC接口以允许将来扩展)时,我只是将我的SQL分配给一个变量并调用odbc_exec()

这使得调试变得简单,因为我只需要检查变量$sql

当然,我很快意识到我必须使用预处理语句来净化用户输入。

我的问题是如何发现正在数据库中执行的确切SQL,以便调试我的准备语句。

我惊奇地发现,我不能从PHP,但他们的任何外部监控工具,可以拦截SQL?或者甚至是MySql命令回显,如果我让控制台窗口打开?

使用MySQL查询日志

您可以通过--log[=file_name]启动mysql服务器以拥有日志文件

下面是一些我用来帮助调试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);

最新更新