PHP 已弃用:不推荐将 false 自动转换为数组 adodb-mssqlnative.inc.php 第 154 行

kur*_*uru 8 php sql-server autovivification adodb-php php-8.1

我们正在将 PHP 升级到版本 8.1。使用 MS Sql Server 数据库。一切似乎都正常工作,但我在日志文件中看到重复的消息:

[03-Feb-2022 11:51:18 America/New_York] PHP 已弃用:C:...\includes\adodb\drivers\adodb-mssqlnative.inc.php 第 154 行中已弃用 false 到数组的自动转换

我已将 adodb 更新到版本 5.22,但这并没有阻止消息记录。ini文件有

extension=php_sqlsrv_81_nts_x64.dll
extension=php_pdo_sqlsrv_81_nts_x64.dll
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?

Mac*_*ity 15

这是向后不兼容的已知问题,影响 ADOdb 库版本 5.22.1 及更早版本。PHP 8.1 会警告您有关 false-y 值的自动激活,并且某些未来版本的 PHP 会在您执行此操作时抛出错误。

PHP 本身允许自动生存(根据错误值自动创建数组)。这个功能非常有用,在很多 PHP 项目中都有使用,特别是在变量未定义的情况下。然而,有一点奇怪的是,允许从 false 和 null 值创建数组。

他们举了这个例子

// From false
$arr = false;
$arr[] = 2;
Run Code Online (Sandbox Code Playgroud)

我找到了有问题的文件,这就是它所在的函数

function ServerInfo() {
    global $ADODB_FETCH_MODE;
    static $arr = false;
    if (is_array($arr))
        return $arr;
    if ($this->fetchMode === false) {
        $savem = $ADODB_FETCH_MODE;
        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
    } elseif ($this->fetchMode >=0 && $this->fetchMode <=2) {
        $savem = $this->fetchMode;
    } else
        $savem = $this->SetFetchMode(ADODB_FETCH_NUM);

    $arrServerInfo = sqlsrv_server_info($this->_connectionID);
    $ADODB_FETCH_MODE = $savem;
    $arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
    $arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']);
    return $arr;
}
Run Code Online (Sandbox Code Playgroud)

问题是它开始于

static $arr = false;
Run Code Online (Sandbox Code Playgroud)

然后尝试自动生成非数组(错误中的第 154 行)

$arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
Run Code Online (Sandbox Code Playgroud)

您应该能够通过确保它是一个数组来修复它(理论上)(无论如何他们都应该这样做)。在该行上方添加此行以使其成为一个,然后再尝试附加

if(!is_array($arr)) $arr = [];
Run Code Online (Sandbox Code Playgroud)