大型 PHP 应用程序中的 SQL 调试
Posted
技术标签:
【中文标题】大型 PHP 应用程序中的 SQL 调试【英文标题】:SQL debugging in large PHP app 【发布时间】:2009-05-04 17:05:20 【问题描述】:我正在使用 CodeCharge Studio 完成一个大型 php 应用程序。这个问题实际上与 CCS 无关,但更笼统一些。我有一个 Web 表单,它应该允许对某个 SQL Server 表进行 CRUD 功能,但是插入一直失败而不会引发任何错误。调试这个的最佳方法是什么?
【问题讨论】:
【参考方案1】:当我遇到动态生成的 SQL 查询问题时,我通常会回显查询并尝试在数据库的控制台上运行该查询。或者,您可以编写一个简单的 PHP 函数,将字符串写入文件,这样您就不必直接在页面上显示查询,而是在日志文件中显示。
【讨论】:
【参考方案2】:查看实际查询是什么,然后尝试直接在数据库上执行该查询。然后你就知道是 PHP 问题还是 DB 问题了。
然后从那里开始,取决于结果。
【讨论】:
【参考方案3】:如果查询看起来正常,请仔细检查运行查询的用户是否拥有插入数据库权限。
我之前也被这个发现了。
【讨论】:
【参考方案4】:您可以监控 mysql 中的所有 sql 查询,如 site 所示,启用日志记录后,手动运行查询并查看失败的原因..这应该是一个很好的起点。
【讨论】:
【参考方案5】:除了前面提到的,我可以补充一下我最近的发现:
trigger_error(print_r($your_var,1),E_USER_ERROR);
因此您可以输出和调试您的变量,即使它是一个带有重定向的复杂脚本,简单的回显也无济于事。
德米特里。
【讨论】:
【参考方案6】:您应该尝试使用FirePHP 并将所有 SQL 记录到您的 Firebug:
一个例子是:
$sql = "SELECT * FROM table"
if (!mysql_query($sql))
// In un successfull log to FireBug
FB::error($data, "SQL error: ".mysql_error());
您还可以从您自己的函数中实现 FB::error 调用,因此您可以稍后停用此行为以修改您的函数:
function log_error($data, $msg)
//dont forget to deactivate in case the application goes live!
FB::error($data, $msg);
if (!mysql_query($sql))
// In un successfull log to FireBug
log_error($data, "SQL error: ".mysql_error());
【讨论】:
【参考方案7】:CodeCharge 中的大多数数据库连接类都有一个“调试”标志,它将自动在页面顶部写入所有页面的数据库命令。
例如,在我的一个旧 PHP 项目中,“Common Files”文件“db_mysql.php”(第 27 行):
public $Debug = 0; ## Set to 1 for debugging messages.
更改为“1”并发布该文件。加载网页。完成后改回并重新发布。
我已在 CCS 中将其用于 PHP 和 ASP 项目,并且可能用于其他语言(不确定是否或在哪里可以找到 .NET 项目)。
【讨论】:
以上是关于大型 PHP 应用程序中的 SQL 调试的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中执行大型 SQL 查询字符串时出现“内存不足”错误
使用 SQL Server 处理 WPF 应用程序中的大型数据集