提问人:Kishor Neupane 提问时间:12/21/2022 最后编辑:Your Common SenseKishor Neupane 更新时间:9/18/2023 访问量:646
为什么 PHP 在mysqli_connect失败时不显示我的自定义错误消息?
Why PHP doesn't show my custom error message when mysqli_connect fails?
问:
我正在尝试连接到数据库,当我尝试一切正确时,数据库连接,一切正常。但是,当我尝试使用一些错误的凭据进行连接时,它会抛出一条错误消息,我正在想办法向用户隐藏错误消息。
function connectDatabase(){
$dbServerName = 'local_host';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'kishor_me';
$conn = mysqli_connect($dbServerName, $dbUsername, $dbPassword, $dbName);
if (!$conn) {
echo "error message";
}else{
echo "success message";
}
}
有没有办法向用户显示严重错误消息,而不是由语言生成的其他错误描述,并且也不会给出 HTTP 500 错误?如果有任何方法或此问题是否已经得到解答,请告诉我。
答:
您似乎正在使用一些过时的教程,该教程提供了不正确的报告错误方法:尝试手动检测连接错误并自行输出某些内容的代码。但是你的代码不应该做这样的事情:mysqli可以自动引发错误,你的代码的这一部分不应该单独与用户对话。
让我们一步一步地回答您的问题:
如何检测连接错误
在古代,大约10年前,PHP使用mysql扩展与MySQL数据库进行通信,无法自动处理错误,每个数据库操作都必须手动检查错误。这就是这些东西的来源。但是这个库早就不复存在了,PHP有了一个新的库,mysqli。它能够自动引发错误,就像PHP中的任何其他命令一样。您没有手动检查每个结果,是吗?所以你不应该使用 mysqli。if (!$conn) {
include
header()
include
header()
如您所见,它会自动产生错误,就像任何其他函数一样。因此,您的代码中不得有任何部分。既不在连接上,也不使用 query()
或任何其他 mysqli 函数。mysqli_connect()
if (!$conn) {
简而言之:您不需要任何代码来检测数据库错误。它们现在是常规错误。而且,如果您考虑一下,不仅必须隐藏数据库错误。任何其他错误,如“已发送标头”或“没有此类文件或目录”,也必须对站点用户隐藏。
所以现在的问题更普遍了:
如何隐藏网站用户的所有错误消息
要隐藏站点用户的错误消息,必须使用专门用于此目的的配置选项:。设置为它将阻止 PHP 显示发生的任何错误。最好在php.ini中设置,但如果你无法控制PHP配置,至少你可以在PHP代码中直接设置它:display errors
0
ini_set('display_errors', 0);
最好的部分是,这只是它设置的一个地方。因此,在本地 PC 或测试服务器上,您可以将其设置为 1 并在线查看所有错误。同样,代码中没有任何更改:如您所见,mysqli 已经提供了详细的错误消息,但没有那些东西!但是在实时服务器上,必须设置为 0,因此不会向用户泄露任何错误消息,而必须设置为 1。这是一个简单的规则,可悲的是,在书籍或教程中很少提到。顺便说一句,我推荐Jon Duckett的PHP&MySQL一书,其中详细解释了这种方法。if (!$conn) {
display errors
log_errors
连接凭据
即使不显示凭据,当敏感信息被记录时,有些人也会感到不舒服。更新 PHP 版本。从 8.2 开始,它会从堆栈跟踪中隐藏数据库密码。
如何处理连接错误
如果要测试凭据,例如在运行安装脚本时,可以将连接包装在 try 中。抓住。但你不应该在生产代码中这样做。或者,如果您有连接失败的备份方案,您也可以尝试将连接包装起来。抓住。简而言之,使用 try..如果您有处理方案,而不仅仅是报告错误,则捕获,在这种情况下,只需将连接代码保留原样。
因此,剩下的唯一问题是“如何向用户显示严重错误消息?
如何向网站用户显示一个漂亮的错误页面
只需配置错误处理程序即可。这是我关于PHP错误报告的文章中的一篇:
set_exception_handler(function ($e)
{
error_log($e);
http_response_code(500);
if (ini_get('display_errors')) {
echo $e;
} else {
echo "<h1>500 Internal Server Error</h1>
An internal server error has been occurred.<br>
Please try again later.";
}
});
取决于值,它要么显示错误本身,要么只显示一般消息。display_errors
请注意,它“给出 HTTP 500 错误”,与您的请求相反,这是实际必须执行的操作。当您的页面由于服务器错误而无法提供实际内容时,它必须以 5xx HTTP 代码进行响应。
评论
ini_set('display_errors', '0');