我维护一个网站,不久前用 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' 已经存在
网站无法加载。
是否有设置强制它返回错误代码而不是抛出异常?
附言。有很多代码就像我上面展示的那样。我不想浪费数周时间用异常处理重写它,因为这种语言/PHP 对我来说几乎已经死了(因为它的维护者的这种确切行为 - 当他们对一些被接受的东西进行彻底的改变时几个版本。)我再也不会用 PHP 编写任何代码了。我只想让这个网站正常工作,而不用花一个月的时间重构完美工作的代码。
当表不存在时,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);