2015-10-09 11 views
5

Ich fand heraus, vor kurzem, dass Sie NULL-Werte in PDO binden können:Binden "nicht null" in PDO?

$stmt = $db->prepare('SELECT * FROM foo WHERE bar = :bar'); 
$stmt->execute(array(':bar'=>null)); 
$foo = $stmt->fetchAll(PDO::FETCH_OBJ); 

Dieses erfolgreich alle foo aus der Datenbank holen würde, wo die bar Spalte null ist.

Allerdings würde ich jetzt gerne das Gegenteil tun. Ich würde gerne alle Spalten holen, wo die bar Spalte nicht null ist.

Ich bin mir bewusst, ich könnte einfach bar = :bar durch bar IS NOT NULL ersetzen. Ich möchte das jedoch vermeiden und mache stattdessen vorbereitete Anweisungen, weil ich manchmal den Query-String dynamisch erstellen muss und dies manuell tun müsste, wäre eine Menge zusätzlicher Arbeit.

Ist das möglich?

+0

Sie könnten Abfrage Builder-Bibliothek wie [Pixie] (https://github.com/usmanhalalit/pixie) und dann können Sie dynamische Abfragen einfach erstellen oder erstellen Sie Ihre eigenen Abfrage-Generator – Gal

+0

Sie bauen zwei Anweisungen dann, eine wo Sie Werte übergeben und die andere, wo Sie 'IS NOT NULL' verwenden. PDO wird ** die Parameter angeben **. – Mjh

+0

@Mjh PDO/MySQL * behandelt die Parameter als Werte *. Es kann sein, oder möglicherweise nicht zitiert werden beteiligt; Im Idealfall ist kein Zitat erforderlich, wenn Sie native Prepared-Anweisungen verwenden. Es ist einfach ein Unterschied in der Behandlung von Parametern als Teil der Syntax oder als Werte. – deceze

Antwort

7

Sie können "NOT NULL" nicht binden. Sie können nur Werte binden. "IS NOT NULL" ist kein Wert, es ist eine völlig andere Abfragesyntax. Sie müssen einfach dynamisch Ihre Abfrage erstellen, Wert Bindung kann man nicht helfen:

$query = 'SELECT ... WHERE '; 
if (/* condition is NOT NULL */) { 
    $query .= 'foo IS NOT NULL'; 
    $stmt = $db->prepare($query); 
} else { 
    $query .= 'foo = :foo'; 
    $stmt = $db->prepare($query); 
    $stmt->bindValue('foo', $foo); 
} 
$stmt->execute(); 
+0

Okay, ich schätze, das erledigt es. Ich dachte, das wäre schwieriger als es tatsächlich war. Danke für die Hilfe. –

2

Ich fürchte, Sie mit Ihrer Annahme falsch sind. Obwohl Sie NULL-Werte im Allgemeinen binden können, gibt WHERE bar = NULL Anweisung Sie keine Zeilen zurück, weder mit Raw SQL oder PDO. Diese ganze Anweisung wird auf NULL ausgewertet und entspricht keiner Zeile.

Stattdessen können Sie einen NULL-sicheren Operator gleich <=> verwenden, um Felder abzugleichen, die entweder NULL sind oder einen Wert haben. Um Werte zu erhalten, die nicht null sind, müssen Sie noch eine weitere Abfrage haben.