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

c00*_*0fd -1 php mysqli php-8

我维护了一个网站,不久前用 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");
}
Run Code Online (Sandbox Code Playgroud)

现在,共享主机迫使我们将其升级到 PHP 8.2。因此,调用@mysqli_query而不是返回错误的行会抛出异常:

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

并且网站无法加载。

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

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

Dha*_*man 5

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

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

mysqli_report(MYSQLI_REPORT_OFF);
Run Code Online (Sandbox Code Playgroud)

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