如何禁用PHP报告SQL错误?

How to disable reporting of SQL errors by PHP?

提问人:Michael Legg 提问时间:5/8/2023 最后编辑:DharmanMichael Legg 更新时间:7/6/2023 访问量:79

问:

我有自己的PHP数据类,它使用将MySQL错误记录到txt文件中mysqli_error($this->conn)

一切正常,直到我将PHP错误处理设置为E_ALL。现在PHP拦截了错误,并且我的MySQL错误处理程序没有机会处理它。

这不会有问题,除非 PHP 不会记录出错的完整 SQL 字符串。它只记录前 20 个字符左右,然后是“...”这对调试不是很有用。

所以我的问题是:是否可以告诉PHP在处理PHP错误的同时不理会MySQL错误?

我已经查看了error_reporting()的各个级别,但似乎没有任何特别遗漏MySQL错误的内容。

php mysql 错误处理

评论

1赞 Your Common Sense 5/8/2023
记录 SQL 是没有意义的 - 它已经完全存在于源代码中
0赞 Michael Legg 5/8/2023
MySQL字符串在99%的时间里是动态的,因此它们不在代码中。
0赞 Your Common Sense 5/8/2023
不可能。 总是一样的,不管是什么SELECT * FROM table WHERE id=?
0赞 Chris Haas 5/8/2023
虽然我不一定说这是一个好主意,但你可以以某种方式将你的mysqli变量固定到一个全局区域,注册一个PHP错误/异常处理程序,检测里面的错误类型,看看它是否是你的特殊情况,然后处理它。
1赞 Your Common Sense 5/8/2023
mysqli_report(MYSQLI_REPORT_OFF) 是您正在寻找的设置,但您确实应该集中和统一错误报告,而不是让每个模块以不同的方式处理错误

答:

0赞 Dharman 5/9/2023 #1

您可以通过禁用 mysqli 错误报告来做到这一点,但任何常规项目都不应该这样做。事实上,你似乎以错误的方式处理这个问题!您不应该想禁用错误报告,您应该修复错误!

如前所述,如果错误来自错误构建的动态 SQL 语句,则您的代码不应包含任何逻辑来处理这种可能的情况,因为您不想让 bug 成为设计的一部分。这是PHP代码中的一个错误,就像任何其他错误一样。它表现为MySQL错误这一事实是无关紧要的。您必须修复生成无效 SQL 语句的代码!静音错误无助于修复它们!

假设你的PHP代码从常量SQL部分构建SQL(如果它使用变量,那么你的代码中就会有更大的问题),那么你的任务是确定哪个代码路径导致SQL关键字的错误组合。您可以从SQL错误中部分地了解它。异常消息将告诉您语法错误是什么。如果MySQL错误与语法损坏无关,则过程仍然相似:找到导致错误的原因并修复它。

不要围绕 SQL 代码编写特殊的错误处理逻辑。这是混乱的,绝对没有必要。

评论

0赞 Michael Legg 5/10/2023
我从来没有提到静音错误 - 我的整个问题都围绕着记录错误,以便修复它们!我以这种方式记录错误报告的原因是为了便于访问。我的应用程序中有一个模块,我可以在其中管理来自所有公共和内部应用程序接口的错误。
0赞 Dharman 5/10/2023
@MichaelLegg 要记录错误,您可以使用 PHP 的 ini 指令 。应用程序中不需要任何特殊代码。log_errors
0赞 Michael Legg 7/6/2023 #2

答案是在 SQL 字符串的执行周围使用 Try Catch 块,并在块的 Catch 部分记录错误。这样,我就可以记录我需要的所有详细信息,包括完整的 SQL 字符串。

评论

0赞 Community 7/8/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。