'Warning: Undefined array key' (PHP 8) of 'Notice: Undefined index' (PHP 7) betekent dat code een sleutel leest die niet bestaat. Zo controleer je netjes met isset() of ??.
Code die $_POST['naam'] of $data['prijs'] leest terwijl die sleutel niet bestaat, geeft in PHP 7 een notice (Undefined index) en in PHP 8 een warning (Undefined array key). De waarde is dan null en de code loopt door, maar vaak met verkeerde uitkomsten.
Na een upgrade naar PHP 8 zie je deze meldingen ineens veel vaker, omdat ze een niveau zwaarder zijn geworden en dus eerder in logs of op het scherm verschijnen.
Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
Komt de waarde uit een formulier, URL-parameter of database? Een formulier dat een veld niet meestuurt (bijvoorbeeld een uitgevinkte checkbox) levert die sleutel niet aan.
Met ?? geef je een standaardwaarde als de sleutel ontbreekt, zonder melding.
<?php
$naam = $_POST['naam'] ?? '';
$aantal = (int) ($_GET['aantal'] ?? 1);isset() is onwaar als de sleutel ontbreekt óf null is; array_key_exists() kijkt alleen of de sleutel bestaat.
<?php
if (isset($data['prijs'])) {
$totaal += $data['prijs'];
}Op een live site hoort display_errors uit te staan en log_errors aan. Bezoekers zien dan niets, en jij leest het log.
; php.ini
display_errors = Off
log_errors = OnKom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.
Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.
De site doet het misschien, maar met een lege waarde waar iets hoorde te staan. Bovendien vult een herhaalde warning het log en kan op het scherm uitvoer veroorzaken die headers breekt.
In PHP 7 was het een notice, en die stonden op veel servers uit. In PHP 8 is het een warning en wordt het vaker getoond of gelogd.
Liever niet. De @-operator onderdrukt de melding maar lost niets op en maakt fouten zoeken lastiger. Gebruik ?? of isset().
Hulp nodig van een mens? Website-onderhoud · WordPress-support · Hosting en onderhoud · Alle oplossingen