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 回答