Die Flagge des Marasek

Dekostreifen

English

Aktuell Texte Der Comic Impressum Kalender Suche PHP-Klassen Container-Wizard main.s21

Kategorien

Buch
Computer
Computerspiele
Film
Geschichte
Gesellschaft
Idee
Kunst
Natur
Persönlich
Politik
Programmieren
Religion & Philosophie
Weblog
Weltpolitik
Weltsicht
{{login}}

PHP und Typen

Permalink
Vorheriger: Der Flamewar-ComicNächster: Grafische Oberflächen
Eingeordnet in: Programmieren

Ein Fehler, über den ich in PHP immer mal wieder gestolpert bin, ist die Behandlung von 0. Das zugrundeliegende Problem sind Typen in PHP: PHP hat als Typen die üblichen Verdächtigen integer, float, string, boolean, ressource und object, was was ist wird von PHP aber weitgehend selbst bestimmt. Anders als z. B. in Java muss ich nicht vor einer Verwendung eine Variable mit Hinweis auf ihren Typ deklarieren, ich kann es aber auch nicht.

Java hat in dieser Hinsicht den Nachteil, dass ich mir sehr viel Gedanken über Typen machen muss. Beispielsweise habe ich in einem Programm eine Variable als Float initialisiert, leider lieferte eine andere Funktion unvorhergesehen Doublefloat zurück, was den Compiler aussteigen liess. Das hat aber auch den Vorteil, dass unvorhergesehene Dinge nicht passieren können. Wenn ich beispielsweise - durch einen Flüchtigkeitsfehler - versuche, eine Variable vom Typ string um eins zu erhöhen, steigt der Compiler aus, und ich werde an der Ausstiegsstelle vermutlich einen Flüchtigkeitsfehler finden. PHP wird in diesem Fall irgendwas machen, dieses irgendwas führt aber meist zu unvorhergesehenen Ergebnissen.

Ganz fatal ist die Behandlung von 0. 0 kann, je nachdem, was man PHP fragt, NULL (kein Wert), FALSE (boolean) oder string "0" sein. Wendet man empty() auf eine Variable an, die auf 0 gesetzt ist, gibt empty TRUE zurück - so wie bei einer leeren Variablen auch.
Umgehen kann man dies, in dem man z. B. einen Typvergleich macht:
($foo===$bar) anstelle von ($foo==$bar). Der Typvergleich ist aber unter Umständen wieder ungewohnt streng: wenn $foo NULL enthält, $bar aber "" (also eine leere Zeichenkette), dann ergibt der Vergleich False.

Konkreter Fall des Stolperns war folgender: Ich hatte ein Formular, in das man einen Wert eintragen konnte. Das Formular ergibt einen Array, aus dem letzlich eine INSERT/UPDATE-Anfrage für eine Datenbank generiert wird. Leere Felder sollen natürlich gar nicht erst eingetragen oder bei UPDATE auf NULL (Datenbank-NULL!) gesetzt werden.
In das Formular war 0 eingegeben, in die Datenbank wurde aber nichts eingetragen - der Wert wurde von der entsprechenden Funktion als nicht vorhanden interpretiert. Einfache Konstruktion:

if(empty($foo))
{continue;}

Also habe ich daraus ein

if($foo===NULL)
{continue;}

gemacht. Keine gute Idee - wenn ich das Feld leer gelassen habe, hat die Funktion versucht, "" einzutragen. Besonders PostgreSQL reagiert da weniger tolerant. Also muss folgende Konstruktion her:

if($foo==NULL and $foo!=0)
{continue;}

Nur wenn $foo im losen Sinne NULL ist, aber nicht im losen Sinne "0", dann übergehe den Wert. PHP...!

NULL und 0 sind aber, gerade im Datenbankbereich, nicht miteinander zu verwechseln. 0 ist eine Aussage, NULL bedeutet, dass keine Aussage getroffen ist, der Feldinhalt leer ist. Angenommen, ich habe eine Tabelle, in der ich Personen mit Geschlecht (Mädchen/Kerl) erfasse. Ich habe 8 Mädchen, 10 Kerle und drei, bei denen ich es nicht weiss (Feld ist NULL).
Eine Abfrage "Zeige mir alle Datensätze, bei denen Geschlecht Mädchen ist", ergibt erwartungsgemäss 8 Datensätze. Wenn ich aber nach allen Datensätzen frage, bei denen das Geschlecht NICHT Mädchen ist, erhalte ich keineswegs 13, sondern 10 Datensatz, nämlich nur die Kerle. Die Datenbank ist genau und gibt nur die Datensätze zurück, über die sie eine sichere Aussage treffen kann. NULL ist ohne Aussage.

Ein weiteres konkretes Beispiel sind Kontostände. Angenommen, ich habe drei Konten, auf dem einen 12, dem zweiten 13,05 und auf dem dritten 0 €. Mein Gesamtguthaben kann ich herausfinden, in dem ich alle zusammenzähle. Wenn das dritte Konto als "Wert" aber NULL enthält, kann keine Aussage über das Konto getroffen werden. Mithin können alle Konten streng genommen solange nicht aufsummiert werden, bis dieser Wert bekannt ist, da auf dem dritten Konto von +/- Unendlich alles sein kann.

Kommentieren

Bitte beachten: Kommentare sind nicht sofort sichtbar, sondern werden erst nach einer kurzen Prüfung freigegeben, sofern keine rechtliche Beanstandung vorliegt.
Rechtlich bedenkliche Inhalte werden entweder entschärft oder nicht veröffentlicht.

* Titel  
* Nickname  
* Kommentar