Rolf B: PDO Problem mit LIMIT

Beitrag lesen

Hallo Franz,

bevor DU lange suchst, eine ganz blöde Frage: Bist Du überzeugt und hast Du es überprüft, dass die Datenbank, die Du am benutzt, überhaupt Einträge in der city-Tabelle hat?

Grundsätzlich sieht dein SQL korrekt aus, und der Umstand, dass der Array-Parameter von execute zur Bindung eines String-Parameters führt, scheint auf deiner Entwicklerkiste nichts auszumachen, daher hoffe ich mal, dass das nicht das Problem ist. Unsauber ist es schon, weil LIMIT eine Zahl erwartet und keinen String. Die sauberere Lösung ist, mit bindValue oder bindParam zu arbeiten. Ich schreib's unten mal als Beispiel mit hinein. Wenn man sowas macht, übergibt man die Parameter nicht mehr an execute(). Aber wie gesagt: ich glaube nicht dass es nötig ist. Der Unterschied zwischen bindParam und bindValue ist, dass bindParam beim execute in die Variable schaut, d.h. wenn Du 5 execute machst und jedesmal der Variablen einen anderen Wert gibst, wird auch jedesmal ein anderer Wert benutzt. Bei bindValue bindest Du einmal einen festen Wert.

Und error_reporting genügt bei SQL Abfragen nicht. Du musst nach den prepare und nach dem fetch prüfen, ob das Ergebnis FALSE ist.

// prepare liefert ein Statement oder FALSE

$statement 	= $pdo->prepare("SELECT * FROM city ORDER BY id ASC LIMIT :nummer ,1");
if ($statement === FALSE) {
   $errInfo = $pdo->errorInfo();
   echo "Prepare-Fehler! SQLSTATE=$errInfo[0], Driver Errorcode $errInfo[1]<br>Driver message: $errInfo[2]<br>";
}

// Beispiel für explizite Bindung
$statement->bindParam(':nummer', $nummer, PDO::PARAM_INT);
$statement->bindValue(':nummer', $nummer, PDO::PARAM_INT);

// execute liefert immer nur TRUE oder FALSE
if (!$statement->execute(array('nummer'=>$nummer )))	
   $errInfo = $pdo->errorInfo();
   echo "Execute-Fehler! SQLSTATE=$errInfo[0], Driver Errorcode $errInfo[1]<br>Driver message: $errInfo[2]<br>";
}
$ergebnis	= $statement->fetch();
if ($ergebnis === FALSE) {
   $errInfo = $pdo->errorInfo();
   echo "Fetch-Fehler! SQLSTATE=$errInfo[0], Driver Errorcode $errInfo[1]<br>Driver message: $errInfo[2]<br>";
}

Der Vergleich auf FALSE muss mit === erfolgen, um ausschließlich das boolsche FALSE zu erwischen und nicht irgendeinen möglichen falsy-Wert.

Eine solche Fehlerbehandlung kann man auch in eine Funktion auslagern, und ob echo für dich der richtige Weg ist oder ob Du ein anderes Logging verwendest, hängt von deiner Webseite ab. Der echo ist nur ein Beispiel (und kann je nach Bauweise deiner Seite auch zu Problemen führen).

Rolf

--
sumpsi - posui - obstruxi