2009-01-20 4 views
14

Ich habe vor kurzem die Arbeit an einem neuen Projekt mit PHP5 gestartet und möchte ihre PDO-Klassen dafür verwenden. Das Problem ist, dass der MySQL-PDO-Treiber rowCount() nicht unterstützt, so dass es keine Möglichkeit gibt, eine Abfrage auszuführen und dann die Anzahl der betroffenen Zeilen oder Zeilen zu erhalten, was für mich ein ziemlich großes Problem darstellt. Ich habe mich gefragt, ob jemand anderes schon einmal damit umgegangen ist und was Sie getan haben, um damit umzugehen. Wenn ich fetch() oder fetchAll() überprüfe, um zu sehen, ob irgendwelche Zeilen betroffen sind oder zurückgeliefert werden, erscheint mir das wie ein Hack, ich würde lieber $ stmt-> numRows() oder etwas ähnliches machen.Work-around für PHP5 PDO rowCount MySQL-Problem

+0

Dies scheint in PHP 5.4 kein Problem zu sein. Kann jemand bestätigen? – David

Antwort

25

Sie können eine Abfrage direkt nach der ursprünglichen SELECT Abfrage abfragen, um Zeilenanzahl zu erhalten.

$pdo->query("SELECT * FROM users"); 
$foundRows = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn(); 

Siehe auch: MySQL Docs on FOUND_ROWS()

+1

Eine Frage, rowCount() funktioniert gut für mich, auch auf SELECT-Anweisungen. Wurde dies umgesetzt, seit diese Frage beantwortet wurde? – Mattis

+0

@Imran rowCount() funktioniert für mich auch für Select sowie für Abfragen wie 'SHOW TABLES LIKE '' Abfragen. Ich benutze PHP 5.2.6. Ich kenne meine Pecl-Version nicht. Wie man es überprüft? Könnte es ein Problem mit PHP 5.2.6+ sein? Diese Frage gefunden - http://stackoverflow.com/questions/769767/pdos-rowcount-not-working-on-php-5-2-6 –

+0

rowCount() funktioniert nur, wenn Sie zuvor eine fetchAll() ausgeführt, aber nicht, wenn Sie fetch() verwenden (das ist die bessere Ursache verbraucht viel weniger Speicher) – itsjavi

1

Für diejenigen von Ihnen, die MySQL gespeicherte Prozeduren verwenden, diese Lösung nicht wirklich machbar ist. Ich würde vorschlagen, dass Ihre gespeicherte Prozedur zwei Rowsets erstellt. Der erste enthält eine Zeile und eine Spalte mit der Anzahl der Datensätze. Die zweite ist das Recordset, das Sie zum Abrufen dieser Anzahl von Zeilen verwenden.

Die Zahl der unbegrenzten Reihen kann, ohne dass die LIMIT/OFFSET Klauseln ein SELECT COUNT(*) mit der exakt gleichen WHERE Klausel als zweiten rowset sein.

Eine andere Idee könnte sein, eine temporäre Tabelle zu erstellen. Verwenden Sie Ihre SELECT-Anweisung, um die temporäre Tabelle aufzufüllen. Dann können Sie SELECT COUNT(*) FROM tmpTable für Ihr erstes Rowset und SELECT * FROM tmpTable für Ihr zweites verwenden.

+1

Glaubst du nicht, dass die Verwendung einer temporären Tabelle ein wenig übertrieben ist, um eine so nutzlose Nummer zu bekommen? –

0

Diese Frage basiert auf mehreren falschen Annahmen und einer veralteten Aussage.

Zunächst verwechseln Sie nicht die Anzahl der betroffenen und ausgewählten Zeilen. PDO unterstützte das erste sogar '09.

Apropos Anzahl der Zeilen von SELECT-Anweisung zurückgegeben - Sie brauchen nur diese Nummer nicht. Die Daten, die Sie haben, sind genug.

Und ja, heutzutage rowCount() unterstützt auch die Anzahl der Zeilen von mysql ausgewählt. Aber nochmal - Sie brauchen diese Nummer in einer durchschnittlichen Web-Anwendung sowieso nicht.

+0

"Sie brauchen diese Nummer nicht. Die Daten, die Sie haben, sind genug". Oh mein .. Übersetzt zu "Sie brauchen keine E-Mail-Adresse. Eine Website zu haben ist genug!" Ich brauche fast immer diese Nummer, und weg von mehreren COUNT Abfragen, wenn ich nur die Abfrage selbst zählen kann. Es ist immer gut, dem Benutzer zu sagen, dass "keine Einträge gefunden wurden", wenn das der Fall ist, anstatt nur NOTHING zu wiederholen. (Sie können auch nicht überprüfen, ob fetch() auch bei Verwendung einer while-Schleife den Wert true zurückgibt) – mowgli