PHP弃用:将false自动转换为数组在adodb-mssqlnative.inc.php的第154行。

8
我们正在升级PHP到版本8.1,使用MS Sql Server数据库。所有看起来都正常工作,但是我在日志文件中看到了重复的消息:

[03-Feb-2022 11:51:18 America/New_York] PHP Deprecated: 自动将false转换为数组的行为已过时,在C:...\ includes\adodb\drivers\adodb-mssqlnative.inc.php的第154行

我已经将adodb更新到版本5.22,但仍无法停止这些日志消息。ini文件中有:
extension=php_sqlsrv_81_nts_x64.dll
extension=php_pdo_sqlsrv_81_nts_x64.dll

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


2
这个库支持PHP/8.1吗?https://adodb.org/dokuwiki/doku.php?id=v5:php_compatibility_status - Álvaro González
我没有在他们的列表中看到这个问题。这只是一个临时解决方案,所以我们可能会在错误日志中采用“DEPRECATED”。 - kuru
我将它从使用mssqlnative改为pdo,问题消失了。感谢答案。 - kuru
2
此问题已在 ADOdb 问题跟踪器中报告(https://github.com/ADOdb/ADOdb/issues/829),并将在 ADOdb 发布的 5.22.2 版本中得到修复。 - dregad
1个回答

15

这是一个已知问题,会影响ADOdb库5.22.1版本及更早的版本。PHP 8.1警告您在false-y值上进行自动创建,未来的某个PHP版本将在此时抛出错误。

PHP本地允许自动创建数组(从falsey值),这个特性非常有用并且在很多PHP项目中使用,特别是变量未定义的情况下。然而,存在一种小奇怪的情况,可以从false和null值创建数组。

他们给出了以下示例:

// From false
$arr = false;
$arr[] = 2;

我找到了相关文件, 函数在其中。
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;
}

问题在于它始于:
static $arr = false;

然后尝试自动创建一个非数组对象(在错误的第154行)

$arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];

理论上来说,您应该通过确保它是一个数组(他们本来就应该这样做)来解决这个问题。在它尝试追加之前,请在该行上方添加以下内容以使其成为一个数组。

if(!is_array($arr)) $arr = [];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接