2012-11-02 6 views
11

Ich habe eine einfache gU vorbereitet Abfrage:erhalten Anzahl der Zeilen mit gU

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->fetch(PDO::FETCH_NUM); 
echo $rows[0]; 

das Echo scheint den ID-Wert des Datensatzes zu zurückkommen, nicht die Anzahl der Datensätze von der Abfrage zurückgegeben?

eine Idee oder eine Erklärung dafür?

Antwort

7

PDO::FETCH_NUM: gibt ein Array von Spaltennummer indiziert, wie in der Ergebnismenge zurück, beginnend in Spalte 0

Sie holen nicht die Zeilenzählung überhaupt.

SELECT COUNT(*) FROM coursescompleted where person=:p 

Diese Abfrage würde zurückkehren Gesamt Reihen in $rows[0];

EDIT: Bitte @ ray Antwort sehen. Verwenden von count(id) ist besser als count(*) für InnoDB.


Sie können Zeilenanzahl in der folgenden Weise aus Ihrer früheren Abfrage abrufen.

$row_count = $result->rowCount(); 

Aber seien Sie gewarnt:

Wenn die letzte SQL-Anweisung durch den zugehörigen PDOStatement ausgeführt war eine SELECT-Anweisung, einige Datenbanken mit dieser Aussage die Anzahl der Zeilen zurück zurückkehren. Dieses Verhalten ist jedoch nicht für alle Datenbanken garantiert und sollte nicht für tragbare Anwendungen verwendet werden.

+0

Danke, funktioniert perfekt. Mein Problem ist in meinem Körper Ich hole die zurückgegebenen Ergebnisse mit 'while ($ row = $ result-> fetch (PDO :: FETCH_ASSOC))' wie kann ich beides mit einer einzigen mysql-Abfrage erreichen oder brauche ich zwei für jede Funktion? Danke noch einmal. – Smudger

+0

Ich bin mir nicht sicher. Könnten Sie '$ row_count = $ result-> rowCount();' mit Ihrer alten Abfrage versuchen? Einige berichten, dass der PDO_MySQL-Treiber dies ermöglicht, obwohl die Dokumentation etwas anderes sagt. –

+0

Wenn das nicht funktioniert, denke ich, dass Sie die Zeilen in PHP noch zählen können, während Sie durch die Zeilen "fetch" iterieren. Nicht sicher, wie schlimm das ist. –

2

Versuchen Sie echo count($rows); als $rows ist ein Array.

Edit:

Um die Ergebnisse zu verwenden

$rows = $result->fetchAll(/* nothing here */); 
if(count($rows) > 0) { 
    // Show results, perhaps using a foreach($rows as $row) 
} else { 
echo "Sorry, no results found"; 
} 
+1

Dies würde ihm die Anzahl der Spalten geben geholt, das heißt 2, jedes Mal. PDOStatement :: fetch() gibt eine einzelne Zeile zurück. PDOStatement :: fetchAll() gibt die gesamte Ergebnismenge als Array zurück – Stephen

+1

Das ist die Frage, die lautet: "Das Echo scheint den ID-Wert des Datensatzes zurückzugeben, nicht die Anzahl der von der Abfrage zurückgegebenen Datensätze?" –

+0

Ich nehme an, es sieht nicht so aus, als ob er tatsächlich den Inhalt der Abfrage benötigt, also ist ein SQL 'count()' vorzuziehen. –

16

Sie eine Abfrage ausgeführt haben, die Zeilen aus der Datenbank zurück, holte die erste Zeile aus dem Ergebnis in eine Variable und echo'd dann die erste Spalte dieser Zeile.

Wenn Sie zählen möchten, tun Sie eine SQL-Zählung()

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rowCount = $result->fetchColumn(0); 
echo $rowCount; 
3

id ist der Primärschlüssel Verwendung Unter der Annahme: eine Zählung (*)

SELECT COUNT(id) FROM coursescompleted WHERE person=:p; 

vermeiden. Wenn Ihre Speicher-Engine InnoDB ist (möglicherweise andere außer MyIsam), werden Sie einen Leistungseinbruch erleiden.

+0

Sind Sie sicher, dass es einen Leistungseinbruch gibt? [Diese Antwort] (http://stackoverflow.com/a/1697144/759019) sagt das Gegenteil für mysql. –

+1

@Cthulhu Ich bin mir sicher. MyISAM kann zählen (*) und zählen (id), wenn ID eine PK in der gleichen Zeit ist (Speicher Tabellen sind auch gut mit count (*)), aber wenn Ihre Tabelle Innodb Speicher-Engine ist, gehen Sie um deinen Fuß zu schießen: http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – Ray

-2

können Sie verwenden diese

<?php 
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->rowCount(); 
echo $rows; 
?> 

Dies kann manchmal nicht auf SELECT Abfragen funktioniert. Aber basierend auf persönlicher Erfahrung, und da Sie nicht erwähnt haben, dass Sie es auf andere Datenbanksysteme portieren, sollte es auf MySQL funktionieren.

Mehr Informationen sind in PHP-Handbuch here