为什么PHP不能隐藏MySQL连接抛出的错误消息?

nnsrf1az  于 2022-12-25  发布在  PHP
关注(0)|答案(1)|浏览(107)

我正在尝试连接到数据库,当我尝试所有内容都正确时,数据库连接,一切正常。但是,当我尝试使用一些错误的凭据进行连接时,它会抛出一条错误消息,我正在寻找一种方法来向用户隐藏该错误消息。

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错误?请让我知道是否有任何方法,或者这个问题是否已经得到回答。
先谢了。

kgsdhlau

kgsdhlau1#

看起来您使用的是一些过时的教程,在报告错误时提供了不正确的方法:一段代码,它试图手动检测连接错误并自行输出一些内容。但您的代码不应该做类似的事情。Mysqli可以自动报告错误,数据库错误与其他错误没有什么不同,因此不需要任何特殊处理。
我们来一步一步回答你的问题:

如何检测连接错误

在古代,大约10年前,PHP使用mysql extension与MySQL数据库对话,但MySQL数据库无法自动处理错误,每个数据库操作都必须手动检查错误。这就是if (!$conn) {的由来。但这个库早就没有了,PHP有了一个新的库mysqli。它具有自动引发错误的能力。就像PHP中的任何其他命令一样,例如includeheader()。您不会手动检查每个includeheader()结果,对吗?* 所以您不应该使用mysqli。*
正如你所看到的,mysqli_connect()会自动产生错误,就像其他函数一样,所以你的代码中不能有if (!$conn) {部分,无论是在connect上,* 还是在query()或其他mysqli函数中 *。
简而言之:你不需要任何代码来检测数据库错误。2它们现在是常见的错误。3而且,如果你想到它,不仅数据库错误必须被隐藏。4任何其他错误,如"标题已发送"或"没有这样的文件或目录"必须对网站用户隐藏。
所以现在的问题更一般化了:

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

要对站点用户隐藏错误消息,必须使用专门用于此目的的配置选项:display errors。当设置为0时,它将阻止PHP显示 * 任何 * 发生的错误。最好在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 error reporting的文章中的一个:

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代码响应。

相关问题