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

Beitrag lesen

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