Wie kann ich mit PDO prüfen, ob eine Zeile in der Datenbank vorhanden ist?
Lesezeit: 4 Minuten
Xperator
Ich möchte eine Bedingung haben, die eine Aktion ausführt, wenn die Zeile überhaupt nicht vorhanden ist.
$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
Versucht if (count($row) == 0) und if($stmt->rowCount() < 0) aber keiner von ihnen funktioniert.
$stmt->rowCount() sollte das sein, was Sie brauchen, aber prüfen Sie, ob es das ist weniger als0 wird nicht helfen – es wird sein gleicht0 oder weniger als1
– DaveRandom
15. August 2012 um 18:05 Uhr
@DaveRandom Die Dokumentation besagt, dass nicht alle Treiber verursachen SELECT ein geben rowCount. Anscheinend sollten Sie tatsächlich verwenden columnCount.
– Waleed Khan
15. August 2012 um 18:07 Uhr
@arxanas Ein fairer Punkt, aber ehrlich gesagt ist es eine schlechte Lösung, zwei Abfragen auszuführen, nur um die Zeilenanzahl zu erhalten (wie das Handbuch vorschlägt). Sogar $rowCount = count($rows = $stmt->fetchAll()) ist eine bessere Lösung als das, denke ich – und es wird immer noch dazu führen 0 wenn es keine Zeilen gibt.
– DaveRandom
15. August 2012 um 18:13 Uhr
Xeoncross
Sie können den Rückgabewert einfach direkt überprüfen.
$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if( ! $row)
{
echo 'nothing found';
}
/*
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here
if( ! $rows)
{
echo 'nothing found';
}
*/
Wenn Sie nach einer Überprüfung fragen ohne zu holen dann lassen Sie MySQL einfach a zurückgeben 1 (Oder verwenden Sie die COUNT() Befehl).
$sql="SELECT 1 from table WHERE id = ? LIMIT 1";
//$sql="SELECT COUNT(*) from table WHERE param = ?"; // for checking >1 records
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
if($stmt->fetchColumn()) echo 'found';
Ihre Lösung wird funktionieren, aber das stimmt nicht PDOStatement::fetch gibt ein Array zurück; es gibt das nächste Ergebnis oder zurück false wenn es keine Reihen mehr gibt. Und deshalb $row ist falsch, wenn eine leere Ergebnismenge vorhanden ist.
– matthias.p
15. August 2012 um 18:10 Uhr
@matthias.p, danke für die Korrektur. Ich benutze nie fetch() also war meine Aussage über ein leeres Array von fetchAll()
– Xeoncross
15. August 2012 um 18:12 Uhr
Vielen Dank! das habe ich gesucht. Da ich wusste, dass das Ergebnis in einem Array zurückgegeben wird, dachte ich, dass dies der beste Weg sein könnte, die Variable zu überprüfen, anstatt eine Funktion zu verwenden oder eine andere SQL-Abfrage durchzuführen.
– Xperator
15. August 2012 um 19:21 Uhr
Kann ich benutzen rowCount() anstatt fetchColumn() in dem if Zustand?
– Shafizadeh
28. September 2015 um 12:52 Uhr
@Sajad der Handbuch sagt nein: “Gibt die Anzahl der Zeilen zurück betroffen durch die letzte SQL-Anweisung”
– Xeoncross
29. September 2015 um 15:28 Uhr
Danny Cruzeira
if($stmt->rowCount() == 0)
sollte gut funktionieren, da die Anzahl der Zeilen auf keinen Fall kleiner als Null sein kann.
Aus dem Handbuch:
Für die meisten Datenbanken PDOStatement::rowCount() gibt nicht die Anzahl der Zeilen zurück, die von a betroffen sind SELECT Erklärung. Verwenden Sie stattdessen PDO::query() ein ausstellen SELECT COUNT(*) Anweisung mit denselben Prädikaten wie beabsichtigt SELECT Anweisung, dann verwenden PDOStatement::fetchColumn() um die Anzahl der Zeilen abzurufen, die zurückgegeben werden. Ihre Anwendung kann dann die richtige Aktion ausführen.
Wie Arxanas schon sagte, sollte man es nicht verwenden rowCount um die von einer select-Anweisung zurückgegebenen Zeilen zu erkennen.
– matthias.p
15. August 2012 um 18:14 Uhr
Wenn Sie MySQL verwenden, sollte es kein Problem sein, aber ansonsten haben Sie völlig recht.
– Danny Cruzeira
15. August 2012 um 18:24 Uhr
Oh, dann habe ich das falsche Zeichen verwendet. Ich dachte, wenn es existiert, wenn es größer ist, sollte ich es einfach auf weniger als 0 umkehren! lol
– Xperator
15. August 2012 um 19:23 Uhr
Hier ist, was ich in meinen Objektklassen verwende:
function exists_by_id () {
// check if object exists by id
$stm = DB::$pdo->prepare('select count(*) from `table` where `column`=:column');
$stm->bindParam(':column', $this->column);
$stm->execute();
$res = $stm->fetchColumn();
if ($res > 0) {
return true;
}
else {
return false;
}
}
Interessante Funktion.
– TuralAsgar
3. Juni 2019 um 8:05 Uhr
Rückkehr (bool)$stm->fetchColumn(); um die Größe zu halbieren
– Ihr gesunder Menschenverstand
21. August 2021 um 7:52 Uhr
10120600cookie-checkWie kann ich mit PDO prüfen, ob eine Zeile in der Datenbank vorhanden ist?yes
$stmt->rowCount()
sollte das sein, was Sie brauchen, aber prüfen Sie, ob es das ist weniger als0
wird nicht helfen – es wird sein gleicht0
oder weniger als1
– DaveRandom
15. August 2012 um 18:05 Uhr
@DaveRandom Die Dokumentation besagt, dass nicht alle Treiber verursachen
SELECT
ein gebenrowCount
. Anscheinend sollten Sie tatsächlich verwendencolumnCount
.– Waleed Khan
15. August 2012 um 18:07 Uhr
@arxanas Ein fairer Punkt, aber ehrlich gesagt ist es eine schlechte Lösung, zwei Abfragen auszuführen, nur um die Zeilenanzahl zu erhalten (wie das Handbuch vorschlägt). Sogar
$rowCount = count($rows = $stmt->fetchAll())
ist eine bessere Lösung als das, denke ich – und es wird immer noch dazu führen0
wenn es keine Zeilen gibt.– DaveRandom
15. August 2012 um 18:13 Uhr