Wie kann ich mit PDO prüfen, ob eine Zeile in der Datenbank vorhanden ist?

Lesezeit: 4 Minuten

Benutzer-Avatar
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 als 0 wird nicht helfen – es wird sein gleicht 0 oder weniger als 1

    – 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


Benutzer-Avatar
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

Benutzer-Avatar
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.

Ich würde vorschlagen, das nachzulesen hier.

  • 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

1012060cookie-checkWie kann ich mit PDO prüfen, ob eine Zeile in der Datenbank vorhanden ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy