PHP LinuxWindows

PHP: Warning: Undefined array key / Undefined index

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

«Warning: Undefined array key» (в PHP 7 — «Undefined index») означает, что код читает элемент массива, которого в нём нет. Проверьте ключ через isset() или оператор ??, а если ключ должен быть всегда — найдите, почему данные не пришли.

В этой статье
  1. Что произошло
  2. Типичные источники
  3. Как исправить в коде
  4. Найти место, откуда пришёл пустой ключ
Undefined array key
Warning: Undefined array key "name" in /var/www/site/index.php on line 12
По-русскиПредупреждение: в массиве нет элемента с ключом «name».

#Что произошло

PHP обратился к элементу $arr['name'], но такого ключа нет. В PHP 7.x это был «Notice: Undefined index», а начиная с PHP 8.0 сообщение стало Warning: Undefined array key, и многие сайты после обновления внезапно заполнились предупреждениями. Страница при этом обычно продолжает работать, а значение подставляется как null, поэтому ошибка часто остаётся незамеченной, пока не вылезет в логе или на экране.

#Типичные источники

Возможная причинаКак узнатьЧто делать
Данных формы нетКод читает $_POST['email'] или $_GET['id'] при первом открытии страницы, когда форму ещё не отправляли.Предупреждение видно только при обычной загрузке, после отправки формы исчезает.Проверяйте isset($_POST['email']) либо берите значение через ??.
Опечатка в имени ключаВ запросе из базы поле называется user_name, а в коде username.Предупреждение на конкретной строке и всегда с тем же ключом.Выведите print_r($row) и сверьте имена.
Пустой результат запросаСтрока не найдена, а код всё равно берёт $row['id'].Ошибка для одних записей и нет для других.Проверьте, что результат не false и не пустой.
Разные регистры или типы ключа'ID' и 'id' — разные ключи, а '5' и 5 PHP считает одним.Ключ вроде бы есть, но в var_dump выглядит иначе.Приведите ключи к одному виду через array_change_key_case.
Обновление PHPКод работал на 7.x, где «Notice» был скрыт настройкой error_reporting.После смены версии на хостинге появился поток предупреждений.Исправьте код, а не прячьте вывод.

#Как исправить в коде

index.php
Три безопасных способа получить значение
// 1. Оператор ?? — самый короткий: значение по умолчанию, если ключа нет или он null
$name = $_POST['name'] ?? '';

// 2. isset() — когда нужно выполнить блок только при наличии ключа
if (isset($_GET['id'])) {
    $id = (int) $_GET['id'];
}

// 3. array_key_exists() — отличает отсутствие ключа от значения null
if (array_key_exists('phone', $user)) {
    echo $user['phone'];
}

Разница между isset() и array_key_exists() важна: isset($a['x']) вернёт false, если ключ есть, но значение равно null, а array_key_exists('x', $a) вернёт true. Для данных форм и параметров адреса хватает ??.

#Найти место, откуда пришёл пустой ключ

  1. Откройте файл и строку из сообщенияВ журнале PHP найдите путь и номер строки Undefined array key (PHP 8) или Undefined index (старые версии), откройте этот файл редактором и посмотрите, какое выражение обращается к индексу массива. Перед изменением сохраните файл; это предупреждение не обязательно означает, что требуется увеличить лимит памяти.
  2. Выведите содержимое массиваПосмотрите содержимое массива в контролируемом тестовом окружении через var_dump либо error_log(print_r($data, true)) с удалением секретных полей. Выясните, действительно ли ключ отсутствует или там ожидается другое имя; на публичном сайте не выводите в браузер персональные данные и пароли.
  3. Найдите, где массив заполняетсяНайдите участок, где массив формируется: запрос БД, $_POST, JSON или API. Для необязательного ключа используйте isset, array_key_exists или оператор ?? по смыслу: например, $value = $data["name"] ?? "";. Если ключ обязателен, валидируйте вход и показывайте понятную ошибку вместо скрытого значения по умолчанию.
  4. Просмотрите журнал ошибокПосле исправления повторите исходный сценарий с ключом и без него, проверьте результат и журнал. Если предупреждение исчезло, но программа использует неверные данные, найдите источник пропущенного ключа; отключение error_reporting не исправляет логику приложения.
  5. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Последние предупреждения PHP-FPM или Apache (путь зависит от дистрибутива)
    Linux · Терминал (Bash)КомандаНужен sudo
    Последние предупреждения PHP-FPM или Apache (путь зависит от дистрибутива)
    sudo tail -n 50 /var/log/php8.3-fpm.log
    sudo grep -h "Undefined array key" /var/log/apache2/error.log | tail
    Вариант 2Через php -l проверяется синтаксис, а через -r можно быстро проверить поведение ??
    Linux · Терминал (Bash)Команда
    Через php -l проверяется синтаксис, а через -r можно быстро проверить поведение ??
    php -l index.php
    php -r '$a = []; var_dump($a["x"] ?? "нет ключа");'

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.