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)