在第一次开发 PHP 应用程序(MySQl,但使用 ODBC 接口以允许将来扩展)时,我只是将我的 SQL 分配给一个变量并调用odbc_exec().
这使调试变得简单,因为我只需要检查我的变量$sql。
当然,我很快意识到我必须使用准备好的语句来清理用户输入。
我的问题是如何发现数据库中正在执行的确切 SQL,以便调试我准备好的语句。
我意识到我不能从 PHP 中做到这一点,但是他们有任何可以拦截 SQL 的外部监控工具吗?如果我打开控制台窗口,甚至是一个 MySql 命令来回显?
在第一次开发 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);