jQuery AJAX 调用在PHP 8.X下被破坏(PHP 8 Uncaught TypeError:array_key_exists()错误)[重复]

vjhs03f7  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(278)

此问题在此处已有答案

PHP check whether property exists in object or class(10个答案)
4天前关闭。
我会尽可能多地解释。
我有一个PHP+jQuery应用程序(某种文本游戏),系统一直在用 AJAX 阅读JSON文件。在PHP 7.4下一切都非常完美,然而,当我升级到8.0或8.1时(我的主机强迫我)AJAX崩溃了。
检查JS控制台,就在第一次 AJAX 调用之后,我得到了一个ERROR 500。所以,我假设它发生在PHP端,并且我是对的。我确实看了一下Apache日志,发现那里发生了一个PHP致命错误-但请注意,在PHP7.4下,根本没有问题。

我的Apache日志错误:

PHP Fatal error:  Uncaught TypeError: array_key_exists():
Argument #2 ($array) must be of type array,
stdClass given in /home/xxx/zzz.com/motor/FileDriver.php:36,
referer: https://zzz.com/yyy/xxx/

这是发生错误的PHP文件,第36行:

function save() {
    $n = func_num_args();
    $g = func_get_args();

    $data = json_decode(file_get_contents($g[0]));
    
    if (!array_key_exists($g[1], $data))
        $data->{$g[1]} = new StdClass();

    if (($n == 4) && (!array_key_exists($g[2], $data->{$g[1]})))
        $data->{$g[1]}->{$g[2]} = new StdClass();

    if ($n == 3)
        $data->{$g[1]} = $g[2];
    else if ($n == 4)
        $data->{$g[1]}->{$g[2]} = $g[3];

    unlink($g[0]);
    file_put_contents($g[0], json_encode($data, JSON_PRETTY_PRINT));
}

错误发生在这里:

$data = json_decode(file_get_contents($g[0]));
    // THE ERROR BELOW!
    if (!array_key_exists($g[1], $data))
        $data->{$g[1]} = new StdClass();

我尝试在PHPjson_decode()函数中添加**$assoc**参数,但没有任何帮助。我真的不知道该如何解决这个问题,除了降级到PHP 7.4......然而,再也做不到了。
已编辑:删除了不相关的代码、图像和信息。
编辑2:将标题调整为更详细的句子。

jdgnovmf

jdgnovmf1#

AJAX 调用并没有失败,错误消息明确指向PHP,所以所有这些JavaScript都是无关紧要的。
查看错误消息和您发布的PHP代码,变量$data是一个对象。
array_key_exists()的文档是这样说的:
由于向后兼容的原因,如果key是一个定义在数组中的属性,array_key_exists()也将返回true。这种行为从PHP 7.4.0开始就不推荐使用,从PHP 8.0.0开始被删除。
要检查对象中是否存在属性,应使用property_exists()。
你应该把第36行更新为:

if (!property_exists($data,$g[1]))

请注意,参数的顺序与array_key_exists()相反

相关问题