PHP PDO SELECT ... WHERE $var IS NULL

smallwall

Lt. Junior Grade
Registriert
Feb. 2014
Beiträge
446
Dieser Code funktioniert
PHP:
$sel = "SELECT * FROM " . $p->filetable . " WHERE White IS NULL";

$stmt = $p->con->prepare($sel);
$stmt->execute();

Dieser Code funktioniert NICHT

PHP:
$field = "White";

$sel = "SELECT * FROM " . $p->filetable . " WHERE :field IS NULL";

$stmt = $p->con->prepare($sel);
$stmt->bindParam(":field", $field);

$stmt->execute();

Was habe ich bei diesem PDO Query falsch gemacht?
 
Normalerweise kann man bei prepared Statements nur Werte binden, aber keine Feldnamen oder ähnliches. Das dürfte hier das Problem sein. Was aber oft auch ein Hinweis auf ein "kaputtes" DB-Design ist wenn man dynamische Feldnamen benötigt...
 
Nur Werte, ok vielen Dank, so klappt das auch:
PHP:
$sel = "SELECT * FROM " . $p->filetable . " WHERE ".$field." IS NULL";
 
Wenn du Statements per Stringoperationen zusammenbaust solltest du dir aber auf alle Fälle Gedanken über SQL Injection machen und am besten nur eine Whitelist an Werten zulassen.

Das die prepared Statements da so sicher dagegen sind liegt unter anderem daran dass die Parameter grundsätzlich als Werte interpretiert werden und somit ds Statement selbst nicht verändern können.
 
Ja, da hast Du recht, es ist aber nur für eine interne debug funktion, ich wollte mir verschiedene "NULL" Felder anschauen.

Edit: Achso, NULL-Felder anschauen macht natürlich keinen Sinn, sondern den Rest der Zeile wollte ich mir anschauen :P
 
Zuletzt bearbeitet:
Tabelle mit A, B, C als Spalte

SELECT * FROM TABELLE WHERE (A = B = C) IS NULL

Hab ich jetzt nicht ausprobiert, aber Vergleiche von einem Feld mit einem Feld, was NULL ist, sollten NULL zurückliefern, sprich ist eins von den Feldern Null sollte NULL zurückkommen. Da MySQL das relativ frei von der Leber weg castet sollte das eigentlich gehen....
 
Zurück
Oben