我可以强制 mysqli 函数返回错误代码而不是抛出异常吗?

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

我维护了一个网站,不久前用 PHP 编写。它的大多数功能依赖于返回错误,而不是捕获异常。像这样的东西:

(注意:在 PHP 的早期版本中这是完全可以接受的行为。)

$tbl_nm = "table_name";

$link = @mysqli_connect($HOSTNAME, $USERNAME, $PASSWD);
if($link !== false)
{
    if(@mysqli_select_db($link, $DBNAME))
    {
        $query = "CREATE TABLE `".$tbl_nm."` (".
            $COL_ID." INT AUTO_INCREMENT PRIMARY KEY, ".
            $COL_DATE." DATE, ".
            $COL_TIME." TIME, ".
            $COL_MSG." TINYTEXT".
            ")";
            
        $res = @mysqli_query($link, $query);     //** EXCEPTION RAISED HERE! **
        if($res === false)
        {
            if(mysqli_errno($link) != 1050)    //1050 - if table already exists
            {
                logMySQLErrorReport($link, "Error creating table");
            }
        }

        //....
    }
    else
    {
        logMySQLErrorReport($link, "Error setting db");
    }
}
else
{
    logMySQLErrorReport($link, "Error connecting");
}

现在,共享主机迫使我们将其升级到 PHP 8.2。因此,调用

@mysqli_query
而不是返回错误的行会抛出异常:

PHP 致命错误:未捕获 mysqli_sql_Exception:表“table_name”已存在

并且网站无法加载。

是否有设置强制它返回错误代码而不是抛出异常?

PS。有很多代码,就像我上面展示的那样。我不想浪费几周的时间用异常处理来重新编写它,因为这种语言/PHP 对我来说几乎已经死了(因为它的维护者的这种确切行为 - 当他们对仅仅被接受的东西引入根本性的改变时)几个版本回来。)我永远不会再用 PHP 编写任何代码。我只是想让这个网站正常工作,而不用花一个月的时间重构完美工作的代码。

php mysqli php-8
3个回答
5
投票

是的,您仍然可以强制 mysqli 不报告任何错误。多年来这一点没有改变。唯一改变的是默认设置。以前的错误报告默认关闭,自 PHP 8.1 起启用。

可以通过在打开 mysqli 连接之前放置此行来禁用它:

mysqli_report(MYSQLI_REPORT_OFF);

但是请不要沉默错误报告!你应该修复错误,而不是消除错误。在你的情况下,你可以通过在 SQL 中添加“IF NOT EXISTS”来轻松修复错误,尽管我不明白为什么你的代码首先尝试创建一个表。


2
投票

当表不存在时,mysqli_query 函数(https://www.php.net/manual/en/mysqli.query.php)不再返回 false。在 PHP 8.0.16 中,返回 false,但在 PHP 8.1.0 和 PHP 8.1.3 中,默认引发异常。 将其添加到您的 php

mysqli_report(MYSQLI_REPORT_OFF);

0
投票

如果您仍然想要警告但不希望出现异常,请改用:

mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_STRICT);

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