PHP: Warning: Undefined variable и Undefined array key — что делать
Скрипт берёт переменную или элемент массива, которых нет. Это предупреждение: страница продолжает работать, а вместо значения PHP подставляет null. На рабочем сайте такие строки должны уходить в журнал, а не на страницу.
Содержание 8
Как выглядит ошибка
PHP Warning: Undefined variable $name in /var/www/example.com/index.php on line 12
PHP Warning: Undefined array key "id" in /var/www/example.com/product.php on line 5Undefined variable $name— скрипт обратился к переменной $name, которой ничего не присвоено.Undefined array key "id"— в массиве нет элемента с ключом id. Если ключ — число, он пишется без кавычек:Undefined array key 3.in … on line 12— файл и строка, где это случилось.
Рядом бывает третье предупреждение — Trying to access array offset on null: скрипт берёт элемент массива из переменной, в которой вообще нет массива, а лежит null.
Это Warning — предупреждение, а не фатальная ошибка: скрипт не останавливается. Ломается сайт не от самого предупреждения, а от того, что дальше код работает с пустым значением: товар не находится, форма не сохраняется.
Почему это появилось после обновления PHP
До PHP 8.0 те же случаи давали уведомление Notice — уровень ниже предупреждения, и текст был другой: Undefined variable: name, Undefined index: id, Undefined offset: 3. В PHP 8.0 их сделали предупреждениями Warning и переписали текст. Код сайта при этом не изменился — изменилось то, как PHP о нём сообщает.
Какая версия PHP стоит у вас — как узнать. В Ubuntu 24.04 — PHP 8.3.
Если сообщение видно прямо на странице
На рабочем сайте посетители не должны видеть сообщения PHP: показ на страницах включают только для отладки. Если строки Warning видны на сайте — показ включён. Кроме того, такая строка, выведенная до заголовков, ломает перенаправления и вход: появляется Cannot modify header information.
WordPress. Откройте wp-config.php (как открыть и сохранить) и найдите строку WP_DEBUG. Если там true, добавьте под ней строку, которая запрещает выводить ошибки на страницы:
define( 'WP_DEBUG_DISPLAY', false );Если WP_DEBUG включали для поиска ошибки и он больше не нужен — поставьте false.
Другой сайт на PHP. Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне. Посмотрите настройку показа ошибок:
grep -n '^display_errors' /etc/php/8.3/fpm/php.iniВ Ubuntu там стоит display_errors = Off. Если у вас On — откройте файл:
sudo nano /etc/php/8.3/fpm/php.iniНажмите Ctrl+W, введите display_errors = и нажмите Enter — курсор встанет на строку с этой настройкой. Поставьте Off, сохраните файл: Ctrl+O, Enter, Ctrl+X. Перезапустите PHP:
sudo systemctl restart php8.3-fpmЕсли команда ничего не ответила, PHP перезапущен. Если показ не пропал, его включает сам сайт — поищите в его настройках режим отладки.
Сообщения при этом никуда не денутся: на сайте под nginx они попадают в журнал nginx — sudo tail -n 30 /var/log/nginx/error.log. В такой строке есть слова FastCGI sent in stderr и PHP message: PHP Warning:.
Как исправить в своём коде
Проверяйте, что значение есть, прежде чем его брать. Для данных из адреса и форм удобен оператор ??: он берёт значение справа, если слева ничего нет, и не выдаёт предупреждения:
$id = $_GET['id'] ?? 0;
$name = $_POST['name'] ?? '';Проверить, что переменная задана, можно через isset:
if (isset($user['email'])) {
echo $user['email'];
}Для переменных, которые заполняются только при каком-то условии, задайте значение заранее, до условия: $name = '';.
Если ошибка в плагине или теме
Путь в сообщении подскажет, чей это файл: в WordPress это папки wp-content/plugins/имя-плагина/ и wp-content/themes/имя-темы/.
- Обновите плагин или тему — в новых версиях такие места исправляют.
- Если обновления нет — передайте разработчику сообщение целиком: текст, файл и строку.
- Пока исправления нет, уберите показ на страницах, как написано выше: сайт будет работать, а предупреждения останутся в журнале.
Не правьте файлы плагина сами: при обновлении плагина правки пропадут.
Ошибки рядом
| Что видите | Что делать |
|---|---|
Cannot modify header information - headers already sent | вывод до заголовков |
Call to undefined function | функции нет или не стоит модуль |
Class "…" not found | не подключён класс |
| в WordPress «На сайте возникла критическая ошибка» | разбор |
| другая ошибка PHP | найдите её в списке |
Источники
- Исходный код PHP 8.3.6: zend_execute.c — тексты Undefined variable, Undefined array key и Call to undefined function.
- Справка PHP: изменения в PHP 8.0 — обращение к несуществующей переменной и ключу массива стало предупреждением Warning.
- Справка PHP: isset() — проверяет, что переменная задана и не равна null.
- Справка PHP: оператор ?? — берёт значение справа, если слева null или переменной нет, без предупреждения.
- Справка PHP: настройки ошибок — display_errors на рабочем сервере выключают, журнал включает log_errors.
- Файл php.ini-production из PHP 8.3.6 — значения для рабочих серверов: display_errors Off, log_errors On, max_execution_time 30, post_max_size 8M, upload_max_filesize 2M.
- Исходный код PHP 7.4: Zend/zend_execute.c — прежние тексты Undefined variable, Undefined index и Undefined offset уровня Notice.
Сверено 14 октября 2026 года.
Что почитать дальше
- Ошибки PHPкак читать сообщение и где журнал.
- WordPress: Updating failedкогда предупреждения ломают редактор.
- Ошибка 500если страница не открывается совсем.