Bahnhofstraße 22, 52134 Herzogenrath Poniedziałek - piątek: 8:00 - 16:30 kontakt@milnersoftware.de 0176 66798849

Aktualności · PHP · · 3 min czytania

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ć.

Bildschirm mit Programmcode in einem Editor

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 null albo przekazuje null do funkcji. Patrz „Passing null to parameter … is deprecated”.
  • Pokazywania błędów na żywej stronie. Na produkcji display_errors powinno być ustawione na Off, 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.

Autor: Przemysław Milner

Pozostałe wpisy