wake-up-neo.com

Zeilenzählung mit PDO

Es gibt viele widersprüchliche Aussagen. Was ist der beste Weg, um Zeilen mit PDO in PHP zu zählen? Vor der Verwendung von PDO habe ich einfach mysql_num_rows verwendet.

fetchAll möchte ich nicht, weil ich manchmal mit großen Datensätzen zu tun habe, also nicht für meine Verwendung geeignet ist.

Hast du irgendwelche Vorschläge?

167
James
$sql = "SELECT count(*) FROM `table` WHERE foo = bar"; 
$result = $con->prepare($sql); 
$result->execute(); 
$number_of_rows = $result->fetchColumn(); 

Es ist nicht die eleganteste Art, dies zu tun, und es erfordert eine zusätzliche Abfrage.

PDO hat PDOStatement::rowCount(), was anscheinend nicht in MySql funktioniert. Was für ein Schmerz.

Aus dem PDO-Dokument:

Für die meisten Datenbanken ist PDOStatement :: rowCount () hat keine Gibt die Anzahl der Zeilen zurück, die von .__ betroffen sind. eine SELECT-Anweisung. Verwenden Sie stattdessen PDO :: query () zur Ausgabe eines SELECT-Befehls COUNT (*) - Anweisung mit der gleichen Prädikate als Ihr gewünschtes SELECT Anweisung, dann verwenden Sie PDOStatement :: fetchColumn () an Rufen Sie die Anzahl der Zeilen ab, die zurück. Ihre Bewerbung kann dann Führen Sie die richtige Aktion aus.

BEARBEITEN: Das obige Codebeispiel verwendet eine vorbereitete Anweisung, die in vielen Fällen zum Zählen von Zeilen wahrscheinlich nicht erforderlich ist.

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;
236
karim79

Wie ich bereits in einer Antwort auf eine ähnliche Frage geschrieben habe, ist mysql_num_rows() der einzige Grund, weil er intern alle Zeilen abholte, um Ihnen diese Informationen zu geben, selbst wenn Ihnen das nicht so schien.

In PDO sind Ihre Optionen also:

  1. Verwenden Sie die Funktion MySQL FOUND_ROWS() .
  2. Verwenden Sie die PDO-Funktion fetchAll() , um alle Zeilen in ein Array zu laden, und verwenden Sie dann count() darauf.
  3. Stellen Sie eine zusätzliche Abfrage an SELECT COUNT(*), wie von karim79 vorgeschlagen.
81
Chad Birch

Vor der Verwendung von PDO habe ich einfach mysql_num_rows() verwendet.

Sie hätten es eigentlich nicht verwenden sollen .

mysql_num_rows() sowie PDOStatement::rowCount() implizieren, dass Sie bereits Ihre Daten ausgewählt haben. In diesem Fall gibt es nur zwei mögliche Anwendungsfälle für eine solche Funktion:

  1. Sie haben nur Ihre Daten ausgewählt, um die Anzahl zu ermitteln.
  2. Sie möchten wissen, ob Ihre Abfrage Zeilen zurückgegeben hat.

Und die erstere sollte überhaupt nicht verwendet werden. Sie sollten niemals Zeilen auswählen, um sie zu zählen, da Ihr Server tatsächlich aufgrund eines großen zurückgegebenen Datensatzes ersticken kann.

Außerdem macht es keinen Sinn, Zeilen nur zum Zählen auszuwählen. Stattdessen muss eine count(*) - Abfrage ausgeführt werden , wobei nur eine Zeile zurückgegeben wird.

Der zweite Anwendungsfall ist weniger katastrophal, aber eher sinnlos: Wenn Sie wissen möchten, ob Ihre Abfrage Daten zurückgegeben hat, haben Sie immer die Daten selbst!

Wenn Sie nur eine Zeile auswählen, holen Sie sie einfach ab und überprüfen Sie das Ergebnis:

$stmt->execute();
$row = $stmt->fetch();
if ($row) { // here! as simple as that
}

Wenn Sie viele Zeilen benötigen, können Sie fetchAll() verwenden.

fetchAll() ist etwas, das ich nicht möchte, da ich manchmal mit großen Datenmengen zu tun habe

Beachten Sie, dass Sie in einer Webanwendung niemals eine große Anzahl von Zeilen auswählen sollten. Es sollten nur Zeilen ausgewählt werden, die tatsächlich auf einer Webseite verwendet werden. Zu diesem Zweck muss eine LIMIT oder eine ähnliche Klausel in SQL verwendet werden. Und für solch eine moderate Datenmenge ist es in Ordnung, fetchAll() zu verwenden.

In solch einem seltenen Fall müssen Sie eine ngepufferte Abfrage, , aber in diesem Fall ist rowCount() ohnehin nicht verfügbar , daher wird diese Funktion auch nicht verwendet.

Wie Sie sehen, gibt es weder für rowCount() noch für eine zusätzliche Abfrage einen Anwendungsfall, um diese zu ersetzen, wie in der akzeptierten Antwort vorgeschlagen.

22

Das ist super spät, aber ich bin auf das Problem gestoßen und mache das:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

Es ist wirklich einfach und einfach. :)

19
Dan

Ich endete damit:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}
18
Eric Warnke

Dieser Beitrag ist alt, aber das Zählen der Zeilen in PHP mit PDO ist einfach

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
8
TenTen Peter

Dies ist ein alter Beitrag, aber frustriert nach Alternativen zu suchen. Es ist sehr bedauerlich, dass PDO diese Funktion nicht hat, zumal PHP und MySQL dazu neigen, Hand in Hand zu gehen. 

Die Verwendung von fetchColumn () weist einen unglücklichen Fehler auf, da Sie diese Ergebnismenge nicht (effektiv) verwenden können, da fetchColumn () die Nadel in die nächste Zeile bewegt. So zum Beispiel, wenn Sie ein ähnliches Ergebnis haben 

  1. Obst-> Banane
  2. Obst-> Apfel
  3. Frucht-> Orange

Wenn Sie fetchColumn () verwenden, können Sie feststellen, dass 3 Früchte zurückgegeben werden. Wenn Sie nun das Ergebnis durchlaufen, haben Sie nur zwei Spalten. Der Preis von fetchColumn () ist der Verlust der ersten Ergebnisspalte, die nur zu finden ist wie viele Zeilen zurückgegeben wurden. Dies führt zu einer schlampigen Codierung und zu vollständig fehlerbehafteten Ergebnissen, falls implementiert. 

Jetzt müssen Sie mit fetchColumn () einen komplett neuen Aufruf und eine MySQL-Abfrage implementieren, um ein neues Arbeitsergebnis zu erhalten. (was sich hoffentlich seit Ihrer letzten Abfrage nicht geändert hat), ich weiß, unwahrscheinlich, aber es kann passieren. Außerdem wird der Overhead von doppelten Abfragen für die Validierung aller Zeilen gezählt. Was für dieses Beispiel klein ist, aber das Parsing von 2 Millionen Zeilen in einer verbundenen Abfrage ist kein angenehmer Preis. 

Ich liebe PHP und unterstütze jeden, der an seiner Entwicklung beteiligt ist, sowie die gesamte Community mit PHP täglich, hoffe aber, dass dies in zukünftigen Versionen angesprochen wird. Dies ist "wirklich" meine einzige Beschwerde bei PHP PDO, die sonst eine tolle Klasse ist.

5
Eric

Dies zu beantworten, weil ich mich damit gefangen habe, indem ich es jetzt weiß und vielleicht ist es nützlich. 

Denken Sie daran, dass Sie die Ergebnisse nicht zweimal abrufen können. Sie müssen das Abrufergebnis im Array speichern, die Zeilenanzahl durch count($array) abrufen und die Ergebnisse mit foreach..__ ausgeben. Beispiel:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}
2
csharp newbie

Schauen Sie sich diesen Link an: http://php.net/manual/de/pdostatement.rowcount.php Es wird nicht empfohlen, rowCount () in SELECT-Anweisungen zu verwenden!

1
Reza Neghabi

Wenn Sie nur eine Anzahl von Zeilen (nicht die Daten) erhalten möchten, d. Wenn Sie COUNT (*) in einer vorbereiteten Anweisung verwenden, müssen Sie nur das Ergebnis abrufen und den Wert lesen:

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

Das Abrufen aller Zeilen (Daten) zur Durchführung einer einfachen Zählung ist eine Verschwendung von Ressourcen. Wenn die Ergebnismenge groß ist, kann Ihr Server darauf drosseln.

1
madfish

Um Variablen innerhalb der Abfrage zu verwenden, können Sie bindValue() oder bindParam() verwenden. Um Variablen innerhalb einer Abfrage zu verwenden, müssen Sie bindValue() oder bindParam() verwenden. Und nicht Verketten Sie die Variablen mit " . $variable . "

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

GL

0
IT Developers

Wenn es um mysql geht, wie man zählt oder erhält man wie viele Zeilen in einer Tabelle mit PHP PDO ich verwende dies

// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);

// execute query
$stmt->execute();

// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];

credits gehen an Mike @ codeofaninja.com

0
Robert

Es gibt eine einfache Lösung. Wenn Sie PDO verwenden, verbinden Sie sich folgendermaßen mit Ihrer Datenbank:

try {
    $handler = new PDO('mysql:Host=localhost;dbname=name_of_your_db', 'your_login', 'your_password'); 
    $handler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
    catch (PDOException $e) {   
    echo $e->getMessage();
}

Die Abfrage an die Datenbank lautet dann:

$query = $handler->query("SELECT id FROM your_table WHERE ...");

Und schließlich, um die Zeilen zu zählen, die Ihrer Abfrage entsprechen, schreiben Sie so 

$amountOfRows = $query->rowcount();
0
Vlad