Undefined variable и Undefined array key
Warning: Undefined variable $name in /var/www/html/index.php on line 5
Warning: Undefined array key "email" in /var/www/html/index.php on line 8Первое значит: на строке 5 читается переменная $name, которой ещё не присвоили значение. Второе: в массиве нет ключа email. PHP подставит вместо значения null и продолжит работу, но результат почти наверняка не тот, что задуман.
В PHP 7 те же сообщения выглядели как Notice: Undefined variable: name, Notice: Undefined index: email и Undefined offset: 3. В PHP 8 это предупреждения (Warning) с новым текстом, а смысл тот же.
Поле формы или параметр адреса
Самый частый случай — форма ещё не отправлена или поле не пришло. Задайте значение по умолчанию оператором ??:
<?php
$email = $_POST['email'] ?? '';
$page = (int) ($_GET['page'] ?? 1);
$agree = isset($_POST['agree']);?? берёт левое значение, если оно существует и не null, иначе — правое, и при этом не выдаёт предупреждения. Неотмеченный флажок (checkbox) браузер не отправляет вовсе, поэтому его проверяют через isset.
Переменная не создана
<?php
$total = 0;
foreach ([5, 10, 15] as $price) {
$total += $price;
}
echo $total . "\n";30Без строки $total = 0; первая же попытка прибавить к $total дала бы Undefined variable $total. Создавайте переменную до цикла или условия, где она меняется. То же с переменной, которая задаётся только внутри if: если условие не выполнилось, переменной нет.
Другие причины
- Опечатка.
$usernameи$userName— разные переменные. Коварный случай — русская буква в имени:$сityс русской «с» выглядит как$city, но это другая переменная. - Переменная снаружи функции. Функция не видит переменных, созданных вне её, — передайте значение параметром (урок Функции).
- Ключ из базы. Столбца нет в
SELECTили он назван иначе — проверьте массив строки черезvar_dump($row). - Номер за пределами списка. У массива из трёх элементов есть ключи 0, 1, 2 —
$a[3]дастUndefined array key 3.
Если забыт знак $
Fatal error: Uncaught Error: Undefined constant "name"Это другая ошибка: echo name; без $ PHP читает как константу. В PHP 8 такая ошибка останавливает программу.
isset или array_key_exists
isset($a['key']) возвращает false, если ключа нет или значение равно null. Если важно отличить «ключа нет» от «ключ есть, значение null», нужна array_key_exists('key', $a). Подробнее о проверках — в справке isset, empty и ??.
Не прячьте предупреждение
Знак @ перед выражением (@$_POST['email']) или error_reporting(0) уберут сообщение, но не ошибку: в переменной всё равно окажется null, и программа будет работать неправильно молча. Исправляйте причину — так сэкономите часы поиска странного поведения потом.