大型 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 语句

使用 SQL Server 处理 WPF 应用程序中的大型数据集

大型 PHP 会话减慢 Web 应用程序

大型、可扩展和可维护的 Web 应用程序中的 ORM 或 SQL?

代码审计PHP项目注入&搜索&调试&SQL监控