PHP „Warning: Undefined array key” – przyczyna i porządne rozwiązanie
Od PHP 8 komunikat nazywa się „Undefined array key” i jest ostrzeżeniem, a nie tylko informacją. Skąd biorą się brakujące klucze i jak porządnie je obsłużyć.
W skrócie: „Warning: Undefined array key” oznacza, że kod sięga po element tablicy, którego nie ma, np. $_GET['strona'], gdy w adresie nie ma parametru strona. Do PHP 7.4 nazywało się to „Notice: Undefined index” i mało kto to zauważał. Od PHP 8.0 to ostrzeżenie. Rozwiązanie: przed odczytem sprawdzić, czy klucz istnieje, zwykle przez ?? albo isset().
Tak wygląda komunikat:
Warning: Undefined array key "strona" in /var/www/html/index.php on line 12
Przy kluczach liczbowych będzie tam np. Undefined array key 3. Pokrewny komunikat „Undefined variable” oznacza to samo dla zmiennych, które nigdy nie zostały ustawione.
Dlaczego komunikat pojawia się po aktualizacji PHP
Kod już wcześniej nie był do końca czysty. W PHP 7 brakujący klucz dawał tylko informację (Notice), której wiele serwerów w ogóle nie zapisywało. PHP 8.0 podniósł ją do rangi ostrzeżenia. Od tej pory widać ją w logach, a na serwerach, które pokazują błędy, na środku strony. Nadal jednak wyrażenie daje null i strona działa dalej. Błędy pojawiają się dopiero potem, gdy z tym null coś się dalej robi.
Typowe źródła
- Parametry adresu i formularze:
$_GET,$_POST,$_REQUEST. Odwiedzający nie wypełnił pola albo otworzył adres bez parametru. - Checkboxy: niezaznaczony checkbox w ogóle nie jest wysyłany przez przeglądarkę.
- Wiersze z bazy: zapytanie nic nie znalazło, a kod i tak czyta
$wiersz['nazwa']. - Dane z zewnątrz: odpowiedzi z API, w których brakuje pola.
- Pętle: odczyt
$lista[$i + 1]przy ostatnim elemencie.
Jak to naprawić
Wartość domyślna przez ??
$strona = $_GET['strona'] ?? 'start';
$newsletter = isset($_POST['newsletter']); // checkbox: true albo false
Sprawdzenie, czy element istnieje
$wiersz = $stmt->fetch();
if ($wiersz === false) {
// brak danych – obsłużyć porządnie
}
isset() czy array_key_exists()?
isset($a['x']) zwraca fałsz, gdy klucza nie ma albo gdy wartość to null. array_key_exists('x', $a) sprawdza tylko, czy klucz istnieje, także gdy wartość to null. Przy formularzach i parametrach adresu prawie zawsze wystarczy ?? albo isset().
Czego unikać
- Wyłączania ostrzeżeń zamiast naprawy. W konsekwencji często powstają prawdziwe błędy, np. gdy liczy się na
nullalbo przekazujenulldo funkcji. Patrz „Passing null to parameter … is deprecated”. - Pokazywania błędów na żywej stronie. Na produkcji
display_errorspowinno być ustawione naOff, a komunikaty trafiać tylko do logu. Inaczej odwiedzający widzą ścieżki serwera. - Dopisywania @ przed każdym odczytem. To ukrywa też przypadki, w których naprawdę czegoś brakuje.
Profesjonalna pomoc
Po przejściu z PHP 7 na PHP 8 takie komunikaty siedzą w logu często setkami, a między nimi chowają się prawdziwe błędy. Porządkuję to systematycznie i przygotowuję aplikację na kolejne wersje PHP. Więcej w usługach naprawa błędów PHP i zmiana PHP na hostingu.