为什么 PHP 在 mysqli_connect 失败时不显示我的自定义错误消息?

问题描述 投票:0回答:1

我正在尝试连接到数据库,当我尝试一切正确时,数据库会连接,一切都很好。但是,当我尝试使用一些错误的凭据进行连接时,它会抛出一条错误消息,我正在想办法向用户隐藏错误消息。

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";
        }
    }

我尝试使用 mysqli_connect_errno() 和 mysqli_connect_error(),但这也返回了相同的错误。

我现在并不想通过更正错误来消除此错误,即将“local_host”更改为“localhost”。

我现在收到以下错误消息。

Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo for local_host failed: No such host is known. in C:\Xampp\htdocs\test.php on line 17

Fatal error: Uncaught mysqli_sql_exception: php_network_getaddresses: getaddrinfo for local_host failed: No such host is known. in C:\Xampp\htdocs\test.php:17 Stack trace: #0 C:\Xampp\htdocs\test.php(17): mysqli_connect('local_host', 'root', '', 'kishor_me') #1 C:\Xampp\htdocs\test.php(28): connectDatabase() #2 {main} thrown in C:\Xampp\htdocs\test.php on line 17

我也尝试过

    mysqli_report(MYSQLI_REPORT_OFF);

现在显示以下错误:

Warning: mysqli_connect(): php_network_getaddresses: getaddrinfo for local_host failed: No such host is known. In C:\Xampp\htdocs\test.php on line 17

Warning: mysqli_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo for local_host failed: No such host is known. in C:\Xampp\htdocs\test.php on line 17
error message

现在我使用以下命令来隐藏错误消息:

ini_set('display_errors','0');

现在抛出 HTTP 500 错误。

有没有办法可以向用户显示严重错误消息,而不是该语言生成的其他错误描述,并且不给出 HTTP 500 错误?如果有什么办法或者这个问题是否已经得到解答,请告诉我。

php mysql mysqli
1个回答
4
投票

您似乎正在使用一些过时的教程,该教程在报告错误时提供了不正确的方法:尝试手动检测连接错误并自行输出某些内容的代码。但你的代码不应该做这样的事情。 Mysqli 可以自动报告错误,数据库错误与其他错误没有什么不同,因此不需要任何特殊处理。

让我们一步一步回答你的问题:

如何检测连接错误

在远古时代,大约10年前,PHP使用mysql扩展与MySQL数据库对话,它无法自动处理错误,每次数据库操作都必须手动检查错误。这就是这些

if (!$conn) {
东西的来源。但这个库早已不复存在,PHP 得到了一个新库,mysqli。它能够自动引发错误,就像 PHP 中的任何其他命令一样,例如
include
header()
。您不会手动检查每个
include
header()
结果,是吗? 所以你不应该使用 mysqli。

如您所见,

mysqli_connect()
会自动产生错误,就像任何其他函数一样。所以你的代码中一定不能有
if (!$conn) {
部分。无论是在连接上,还是使用 query()
 或任何其他 mysqli 函数

简而言之:您不需要任何代码来检测数据库错误。现在它们已成为常规错误。而且,如果您想一想,不仅需要隐藏数据库错误。任何其他错误,例如“标头已发送”或“没有此类文件或目录”也必须对站点用户隐藏。

所以现在问题更加普遍了:

如何向站点用户隐藏所有错误消息

要向站点用户隐藏错误消息,您必须使用专门用于此目的的配置选项:

display errors

。当设置为 
0
 时,它将阻止 PHP 显示发生 
any 错误。最好在 php.ini 中设置,但如果您无法控制 PHP 配置,至少可以在 PHP 代码中正确设置:

ini_set('display_errors', 0);
最棒的部分是,这只是一个设置的地方。因此,在本地 PC 或测试服务器上,您可以将其设置为 1 并在线查看所有错误。 

再次,无需对代码进行任何更改:如您所见,mysqli 已经提供了详细的错误消息,没有那些 if (!$conn) {

 的东西!但在实时服务器上,
display errors
必须设置为0,这样就不会向用户泄露任何错误消息,而
log_errors
必须设置为1。遗憾的是,这是一个简单的规则,但在书中很少提及或教程。顺便说一句,我推荐 Jon Duckett 写的《PHP&MySQL》一书,其中详细解释了这种方法。

连接凭证

即使不显示凭据,当敏感信息被记录时,有些人也会感到不舒服。更新您的 PHP 版本。从 8.2 开始,它从堆栈跟踪中隐藏数据库密码。

连接错误如何处理

如果您想测试凭据,例如在运行安装脚本时,您可以将连接包装为 try..catch。但您不应该使用生产代码来执行此操作。

所以剩下的唯一问题是“如何向用户显示严重错误消息?”。

如何向网站用户显示漂亮的错误页面

只需配置一个

错误处理程序。这是我关于 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 代码响应。

© www.soinside.com 2019 - 2024. All rights reserved.