我维护了一个网站,不久前用 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 编写任何代码。我只是想让这个网站正常工作,而不用花一个月的时间重构完美工作的代码。
是的,您仍然可以强制 mysqli 不报告任何错误。多年来这一点没有改变。唯一改变的是默认设置。以前的错误报告默认关闭,自 PHP 8.1 起启用。
可以通过在打开 mysqli 连接之前放置此行来禁用它:
mysqli_report(MYSQLI_REPORT_OFF);
但是请不要沉默错误报告!你应该修复错误,而不是消除错误。在你的情况下,你可以通过在 SQL 中添加“IF NOT EXISTS”来轻松修复错误,尽管我不明白为什么你的代码首先尝试创建一个表。
当表不存在时,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);
如果您仍然想要警告但不希望出现异常,请改用:
mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_STRICT);