2012-08-15 15 views
21

Ich möchte eine Bedingung haben, falls die Zeile überhaupt nicht existiert.PDO/PHP - Überprüfen, ob Zeile existiert

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?'); 
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT); 
$stmt->execute(); 
$row = $stmt->fetch(PDO::FETCH_ASSOC); 

Versuchen if (count($row) == 0) und if($stmt->rowCount() < 0) aber keiner von ihnen arbeitet.

+1

[ '$ stmt-> rowCount()'] (http://php.net/manual/en/pdostatement.rowcount.php) sollte was Sie brauchen, aber überprüfen, ob es * weniger als * '0' ist, wird nicht helfen - es wird * gleich * '0' oder * weniger als *' 1' – DaveRandom

+1

@DaveRandom Die Dokumentation besagt, dass nicht alle Treiber Ursache "SELECT", um ein "rowCount" zu geben. Anscheinend sollten Sie 'columnCount' verwenden. –

+0

@arxanas Ein fairer Punkt, aber offen gesagt, zwei Abfragen auszuführen, nur um die Zeilenanzahl zu erhalten (wie das Handbuch vorschlägt), ist eine sucky Lösung. Sogar '$ rowCount = count ($ rows = $ stmt-> fetchAll())' ist eine bessere Lösung als das, denke ich - und es wird immer noch '0' ergeben, wenn keine Zeilen vorhanden sind. – DaveRandom

Antwort

53

Sie können den Rückgabewert 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) 
{ 
    die('nothing found'); 
} 

/* 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here 
if(! $rows) 
{ 
    die('nothing found'); 
} 
*/ 

Wenn Sie fragen Überprüfung ohne zu holen dann einfach haben MySQL ein 1 (oder verwenden Sie den Befehl COUNT()) zurückzukehren.

$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()) die('found'); 
+8

Ihre Lösung wird funktionieren, aber es ist nicht wahr, dass "PDOStatement :: fetch" ein Array zurückgibt; Es gibt das nächste Ergebnis zurück, oder "false", wenn keine Zeilen mehr vorhanden sind. Und deshalb ist '$ row' falsch, wenn eine leere Ergebnismenge vorhanden ist. –

+0

@ matthias.p, danke für die Korrektur. Ich benutze niemals 'fetch()', also war meine Aussage über ein leeres Array von 'fetchAll()' – Xeoncross

+0

Danke! das ist wonach ich gesucht habe. Da ich wusste, dass das Ergebnis in einem Array zurückgegeben wurde, dachte ich, es könnte der beste Weg sein, die Variable zu überprüfen, anstatt eine Funktion zu verwenden oder eine andere SQL-Abfrage auszuführen. – xperator

7
if($stmt->rowCount() == 0) 

sollte gut funktionieren, da die Anzahl der Zeilen nicht kleiner als Null an alle auf jedem Fall sein kann.

Aus dem Handbuch:

Bei den meisten Datenbanken PDOStatement::rowCount() gibt nicht die Anzahl der durch eine SELECT Anweisung betroffenen Zeilen. Verwenden Sie stattdessen PDO::query() eine SELECT COUNT(*) Aussage mit den gleichen Prädikate wie Ihre beabsichtigte SELECT Anweisung zu erteilen, dann PDOStatement::fetchColumn() verwenden, um die Anzahl der Zeilen abzurufen, die zurückgegeben werden . Ihre Anwendung kann dann die richtige Aktion ausführen.

Ich würde vorschlagen, auf dem here nachzulesen.

+1

Als Arxanas bereits zurück Sie sagten, Sie sollten 'rowCount' nicht verwenden, um die von einer SELECT-Anweisung zurückgegebenen Zeilen zu erkennen. –

+0

Wenn Sie MySQL verwenden, sollte dies kein Problem sein, aber ansonsten sind Sie völlig richtig. – DannyCruzeira

+2

oh dann habe ich das falsche Zeichen benutzt.Ich dachte, wenn es existiert, wenn es größer ist, sollte ich es auf weniger als 0 umkehren! lol – xperator

0

Heres, was ich in meinen Objektklassen verwenden:

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; 
    } 
} 
Verwandte Themen