Вызов jQuery AJAX не работает в PHP 8.X (ошибка PHP 8 Uncaught TypeError: array_key_exists())

Я постараюсь быть максимально объяснительным.

У меня есть приложение PHP + jQuery (какая-то текстовая игра), где система постоянно читает и записывает файлы JSON с помощью AJAX. Под PHP 7.4 все абсолютно идеально, однако при обновлении до 8.0 или 8.1 (мой хостинг вынуждает) AJAX ломается.

Проверяя консоль JS, сразу после самого первого вызова AJAX я получаю ОШИБКУ 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();

Я попытался добавить параметр $assoc в функцию PHP json_decode(), но это не помогло. Я действительно понятия не имею, как это решить, кроме как перейти на PHP 7.4... однако я больше не могу этого делать.

EDITED: удален ненужный код, изображение и информация.

EDITED2: Название изменено на более пояснительное предложение.

Ну, если вы изменили версию PHP, код javascript не имеет к этому никакого отношения.

RiggsFolly 30.03.2023 22:28

У вас есть ошибка в функции, так как же вы вызываете функцию! И какие параметры вы передаете

RiggsFolly 30.03.2023 22:31

PHP 8 стал более конкретным в отношении типов данных. Больше нельзя ни во что кидаться и надеяться на лучшее

RiggsFolly 30.03.2023 22:34
Пожалуйста, никогда не публикуйте изображения или сторонние ссылки на код, данные или сообщения об ошибках. Пожалуйста, отредактируйте свой вопрос и скопируйте/вставьте отформатированный текст в вопрос. Это сделано для того, чтобы мы могли попытаться воспроизвести проблему, не вводя все заново, и ваш вопрос мог быть правильно проиндексирован или прочитан программами чтения с экрана.
RiggsFolly 30.03.2023 22:39

Ошибка говорит сама за себя: PHP Fatal error: Uncaught TypeError: array_key_exists():. Вам нужно сосредоточиться на строке 36 в вашем PHP-коде. ПРИМЕЧАНИЕ. Через 30 секунд после того, как я набрал этот комментарий, я заметил отличный ответ: stackoverflow.com/a/75892872/421195. Пожалуйста, «примите» и «проголосуйте».

paulsm4 30.03.2023 22:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов AJAX не потерпел неудачу. Сообщение об ошибке явно указывает на PHP, поэтому весь этот JavaScript не имеет значения.

Глядя на сообщение об ошибке и код PHP, который вы разместили, переменная $data является объектом.

В документации для array_key_exists() сказано следующее:

По соображениям обратной совместимости array_key_exists() также будет вернуть true, если ключ является свойством, определенным в объекте, указанном как множество. Это поведение устарело, начиная с PHP 7.4.0, и удалено с PHP 8.0.0.

Чтобы проверить, существует ли свойство в объекте, property_exists() должен быть использован.

Вы должны обновить строку 36 до этого:

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

Обратите внимание, что порядок параметров обратный от array_key_exists()

Спасибо, Тангенциально. Мне стыдно за себя. Я много работал с «property_exists» в других экземплярах моего кода и пропустил здесь столь тривиальное решение. Спасибо, правда! \м/

Cospefogo 30.03.2023 23:40

@Tangentially Perpendicular: ваш ответ НАМНОГО лучше для этого конкретного «симптома» (ошибка PHP 8 Uncaught TypeError: array_key_exists()), чем для так называемого «дубликата». +1.

paulsm4 31.03.2023 02:34

Другие вопросы по теме