当第一次开发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);