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

rggaifut  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(43)

我尝试连接到数据库,当我尝试一切正确时,数据库连接,一切正常。但是,当我尝试使用错误的凭据连接时,它抛出错误消息,我正在寻找一种方法来隐藏用户的错误消息。

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

kq4fsx7k

kq4fsx7k1#

看起来你使用的是一些过时的教程,它提供了错误的报告错误的方法:一段代码试图手动检测连接错误并自己输出一些东西。但是你的代码不应该做这样的事情:PDO和mysqli都可以自动引发错误,而且,你的代码的这一部分不应该自己与用户对话。
让我们一步一步地回答你的问题:

如何检测连接错误

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

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

要隐藏网站用户的错误消息,您必须使用一个配置选项,该选项正好用于:display errors。当设置为0时,它将阻止PHP显示 * 任何 * 错误发生。最好在php.ini中设置,但如果您无法控制PHP配置,至少可以在PHP代码中设置它:

ini_set('display_errors', 0);

字符串
最好的部分是,这只是一个设置它的地方。因此,在您的本地PC或测试服务器上,您可以将其设置为1并在线查看所有错误。* 同样,代码中没有任何更改:* 正如你所看到的,一个失败的连接尝试已经提供了一个详细的错误消息,没有if (!$conn) {的东西。但是在一个实时服务器上,display errors必须设置为0,所以没有一个错误消息泄漏给用户,而log_errors必须设置为1。这是一个简单的规则,遗憾的是,在书籍或教程中很少提到。顺便说一下,我推荐Jon Duckett的PHP&MySQL一书,其中详细解释了这种方法。

连接凭证

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

如何处理连接错误

如果你想测试凭证,例如在运行安装脚本时,你可以将连接 Package 在一个try.. catch中。但你不应该在生产代码中这样做。或者如果你有一个备份场景,当连接失败时,你也可以将连接 Package 在一个try.. catch中。简而言之,如果你有一个处理场景,而不仅仅是报告错误,请使用try.. catch,在这种情况下,只需留下连接代码。
因此,剩下的唯一问题是“如何向用户显示关键错误消息?”。

如何向站点用户展示漂亮的错误页面

简单地配置一个 error handler。下面是我在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代码进行响应。

相关问题