HowTo: PHP 8 - Undefinded array/variable/key/index ...

Allgemeine Infos zu ConPressoPlus.
Zweck, Änderungen, etc.
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7214
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 920 Mal

HowTo: PHP 8 - Undefinded array/variable/key/index ...

Beitrag von MarkusR »

Aus viewtopic.php?p=29485#p29485
MarkusR hat geschrieben:PHP hat seine Beliebtheit dadurch gewonnen, dass es im Vergleich zu anderen Programmiersprachen sehr einfach zu Ergebnissen führte und man sich um Dinge wie Variablendeklaration nicht kümmern musste, die einfach "On-the-fly" genutzt wurden. Das führte aber auch zu zahlreichen Sicherheitsrisiken, daher werden hier zunehmend die Zügel angezogen, was eine konsequentere Code-Entwicklung bedingt.
Dies wird eigentlich schon seit Jahren mittels "Notice"-Ausgaben den Nutzern mitgeteilt und hätte zum Handeln führen können, aber in der Regel werden diese lästigen Hinweise (standardmäßig) abgeschaltet statt beachtet, bis diese in aktuellen PHP-Versionen zu "Warnings" werden und die Seiten nicht mehr funktionieren.
MarkusR hat geschrieben:"Undefined array key", "Undefined variable" oder "Undefined index" sind typische Fehler, die durch PHP >= 8 auftreten.
In diesem Fall wurde versucht ein Cookie auszulesen, dass noch gar nicht gesetzt ist.

Lösung: Bei Prüfungen nicht direkt auf den zu erwartenden Wert prüfen sondern zuerst die Existenz des/der Arrays/Keys/Variable prüfen!
Diese Probleme werden uns in nächster Zeit noch häufig begegnen und begleiten, bis PHP 5 und PHP 7 endlich vollständig abgeschaltet sind, also bis November 2022. Bis dahin sind hoffentlich alle Codes korrigiert.


Problem:
Die Prüfung auf den Inhalt von Variablen/Keys, die gar nicht gesetzt wurden

Code: Alles auswählen

if ($variable)  {
oder

Code: Alles auswählen

if ($variable == "inhalt")  {
oder

Code: Alles auswählen

if ($array['key'] == "inhalt")  {
bzw.

Code: Alles auswählen

if ($array['key'])  {
findet sich hundertfach in ConPresso und den Modulen, weil es bis PHP 8 prima funktionierte und den Code sehr schlank hielt.

Grundsätzliche Lösung: Variablen etc. immer ordentlich deklarieren. Das ist aber recht schwer, weil man oft nicht weiß, dass sie überhaupt benötigt werden und insbesondere Array-Keys auch dynamisch gebildet werden.

Also die fallbezogene Lösung:
Bei Prüfungen wie oben gelistet vor der Prüfung auf Inhalt IMMER erst auf Existenz prüfen, wenn man nicht weiß, ob die Variable im Vorfeld deklariert wurde bzw. "undefined"-Meldungen erhält, also z.B.

Code: Alles auswählen

if (isset($variable))  {
oder

Code: Alles auswählen

if (isset($variable) && $variable == "inhalt")  {
oder

Code: Alles auswählen

if (isset($array['key']) && $array['key'] == "inhalt")  {
bzw.

Code: Alles auswählen

if (isset($array['key']))  {


Lediglich Boolsche Werte (true/false) sollten genauer betrachtet werden, weil diese ggf. eine Variable füllen, aber die Prüfung aufgrund des Wertes negativ ausfällt.

Code: Alles auswählen

if ($variableBool)  {
muss dann mit

Code: Alles auswählen

if (isset($variableBool) && $variableBool === true)  {
geprüft werden, da $variableBool=false bei

Code: Alles auswählen

if (isset($variableBool))  {
ein False-Positive liefern würde!
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7214
Registriert: 01.01.1970 02:00
Hat sich bedankt: 104 Mal
Danksagung erhalten: 920 Mal

Re: HowTo: PHP 8 - Undefinded array/variable/key/index ...

Beitrag von MarkusR »

Vielleicht macht es Sinn analog zur Funktion initVar() eine Funktion getVar() in CPO zu integrieren, die z.B. sowas macht:

Code: Alles auswählen

function getVar($var)  {
    if (isset($var))  {
        return $var;
    } else {
        return null;
    }
}
so daß

Code: Alles auswählen

if (getVar($variable))  {
keinen Fehler erzeugt, auch wenn $variable nicht existiert.

Das ist aber erst mal nur gedacht und nicht geprüft... erst mal in den Handbüchern stöbern...

edit: mit etwas Abstand betrachtet wird klar, dass dies so nicht funktionieren kann, da getVar($var) schon einen Fehler erzeugen wird noch bevor die Funktion selbst aufgerufen wird... :oops: :wall:
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle