Michi: WHERE Abfrage trotzdem Ausführen auch wenn der zu suchende Wert NULL ist

Meine Suche für meine MYSQL Abfrage sieht so aus.


$statement = $pdo->prepare("SELECT a.id, a.ort FROM table1 a, table2 b WHERE a.id = b.id AND b.typ =12");
$result = $statement->execute(array('typ' =>$nummer ));	

Die Ausgabe erfolgt wenn der Wert typ identisch mit der Var $nummer ist.

Ist es möglich es so zu schreiben, das wenn die Var $nummer= 0 ist in der Select Abfrage dann

b.typ >0 statt b.typ =12 steht.

  1. Tach!

    Ist es möglich es so zu schreiben, das wenn die Var $nummer= 0 ist in der Select Abfrage dann

    b.typ >0 statt b.typ =12 steht.

    Ja, mit if-else in PHP. Du kannst entweder den Statement-String anpassen oder auch deine "$statement=..."-Zeile jeweils angepasst in if und else schreiben.

    Ich würde nicht versuchen, eine Fallunterscheidung ins Statement selbst einzubauen. Aus Sicht des DBMS ist $nummer ein konstanter Wert und dafür für jeden Datensatz die Fallunterscheidung zu bearbeiten, ist aufwendiger als 4 Zeilen mehr PHP-Code zu schreiben.

    dedlfix.

    1. Verstehe ich das so, das du meinst ich soll meine Select Anweisung in PHP zusammenbauen?

      1. Tach!

        Verstehe ich das so, das du meinst ich soll meine Select Anweisung in PHP zusammenbauen?

        Ja, oder eine von beiden vorgefertigten Anweisungen absenden. Es lohnt nicht wirklich, erst noch die Strings zusammenzubauen.

        dedlfix.

  2. Hallo Michi,

    Warum bindest Du im fetch-Aufruf einen Parameter, wenn er nicht da ist? Das nützt nichts. Wenn Du schon einen bindest, kannst Du ihn auch nutzen. Darüber hinaus könnte es sinnvoller sein, den Parameter typgerecht zu binden - das, was im fetch übergeben wird, wird immer als String gebunden.

    Welchen Wertebereich hat b.typ? Immer positiv? In dem Fall solltest Du diesen Teil des WHERE komplett weglassen.

    Also sowas:

    $sql = "SELECT a.id, a.ort FROM table1 a, table2 b WHERE a.id = b.id";
    if ($nummer > 0)
       $sql .= " AND t.typ = :typ";
    
    $statement = $pdo->prepare($sql);
    if ($statement === FALSE) {
       // Fehlerbehandlung
    }
    if ($nummer > 0) {
       if (!$statement->bindValue(':typ', $nummer, PDO::PARAM_INT)) {  // oder bindParam
          // Fehlerbehandlung (sollte aber nur bei blöden Programmierfehlern schief gehen)
       }
    }
    if (!$statement->execute()) {
       // Fehlerbehandlung
    }
    // Ergebnisse lesen
    

    Beachte die Fehlerbehandlung! Falls Du bei Fehlern ohnehin abbrichst, kansnt Du, statt eine Abfrage nach der anderen zu programmieren, PDO auch in den Exception-Modus schalten und den Zugriffscode in try/catch einbetten.

    Statt einen Parameter zu nutzen und ihn an eine Variable oder einen Wert zu binden, kannst Du in einfachen Fällen wie diesen auch den Inhalt - kontextgerecht! - direkt ins SQL einbauen. Der Overhead von prepare lohnt sich bei einmaliger Ausführung des Statements ohnehin nicht. Es hilft Dir bei der kontextgerechten Behandlung der Parameterwerte, aber kostet auch einen zusätzlichen Roundtrip zur SQL Datenbank.

    $sql = "SELECT a.id, a.ort FROM table1 a, table2 b WHERE a.id = b.id";
    if ($nummer > 0)
       $sql .= " AND t.typ = " . intval($nummer);
    
    $statement = $pdo->query($sql);
    if ($statement === FALSE) {
       // Fehlerbehandlung
    }
    // Ergebnisse lesen
    

    Rolf

    --
    sumpsi - posui - clusi
  3. Hallo Michi,

    wo wird denn hier …

    $statement = $pdo->prepare("SELECT a.id, a.ort FROM table1 a, table2 b WHERE a.id = b.id AND b.typ =12");
    $result = $statement->execute(array('typ' =>$nummer ));	
    

    … also in deinem SELECT eigentlich $nummer an typ gebunden? Da fehlt doch der Platzhalter.

    Viele Grüße
    Robert