2013-07-26 3 views
0

Pour afficher mes résultats de PDO, j'utilise toujours le code PHP suivant par exemple:PDO SQL problème affichant plusieurs lignes lorsque vous utilisez COUNT()

$STH = $DBH->prepare("SELECT logo_id, guess_count, guessed, count(id) AS counter FROM guess WHERE user_id=:id"); 
$STH->bindParam(":id",$loginuser['id']); 
$STH->execute(); 
while($row = $STH->fetch()){ 
    print_r($row); 
} 

Maintenant, le problème est que je reçois un seul résultat. J'avais l'habitude d'utiliser $STH->rowCount() pour vérifier le nombre de lignes retournées, mais cette méthode n'est pas vraiment conseillée pour les instructions SELECT car dans certaines bases de données il ne réagit pas correctement. J'ai donc utilisé le count(id) AS counter, mais maintenant je n'ai qu'un seul résultat à chaque fois, même si la valeur de $row['counter'] est supérieure à un.

Quelle est la manière correcte de compter le nombre de résultats dans une requête?

Répondre

1

Si vous souhaitez vérifier le nombre de lignes renvoyées par une requête, vous avez le choix entre plusieurs options.


Vous pourriez faire un ->fetchAll pour obtenir un tableau de toutes les lignes. (Ceci n'est pas recommandé pour les grands ensembles de résultats (c'est-à-dire beaucoup de lignes retournées par la requête), vous pouvez ajouter une clause LIMIT à votre requête pour éviter de renvoyer plus d'un certain nombre de lignes. récupérer plus d'une ligne, vous n'aurez besoin que de récupérer deux lignes.) Vérifier la longueur du tableau est trivial.


Une autre option consiste à exécuter une autre requête distincte pour obtenir le compte séparément, par ex.

SELECT COUNT(1) AS counter FROM guess WHERE user_id=:id 

Mais, cette approche nécessite un autre aller-retour à la base de données.


Et l'ancien SQL_CALC_ROUND_ROWS de secours est une autre option, mais cela aussi peut avoir des performances problématiques avec de grands ensembles.


Vous pouvez aussi simplement ajouter un compteur de boucle dans votre code existant:

$i = 0; 
while($row = $STH->fetch()){ 
    $i++ 
    print_r($row); 
} 
print "fetched row count: ".$i; 

Si ce que vous avez besoin est un nombre exact du nombre de lignes qui satisfont un prédicat particulier AVANT d'exécuter une requête pour renvoyer les lignes, la requête COUNT (1) séparée est probablement l'approche la plus appropriée. Oui, c'est un code supplémentaire dans votre application; Je vous recommande de préfacer le code avec un commentaire qui indique le but du code ... pour obtenir un nombre exact de lignes qui satisfont un ensemble de prédicats, avant d'exécuter une requête qui récupérera les lignes.

Si je devais traiter les lignes de toute façon, et ajouter LIMIT 0,100 à la requête était acceptable, je voudrais aller à la ->fetchAll(), obtenir le nombre de la longueur du tableau, et traiter les lignes du tableau.

+0

Si je comprends bien, pas vraiment de bonne solution.Le premier n'est pas conseillé pour les grandes bases de données, le second nécessite une requête supplémentaire et le dernier, je veux vérifier le nombre de résultats ** avant ** de faire mes trucs avec les résultats individuels puisque ce sont d'autres requêtes. – jdepypere

+1

Si vous avez besoin d'un ** nombre exact ** du nombre de lignes qui satisfont un prédicat particulier AVANT d'exécuter une requête pour renvoyer les lignes, la requête COUNT (1) séparée est probablement l'approche la plus appropriée. Oui, c'est un code supplémentaire dans votre application; Je vous recommande de préfacer le code avec un commentaire qui indique le but du code ... pour obtenir un nombre exact de lignes qui satisfont un ensemble de prédicats, avant d'exécuter une requête qui récupérera les lignes. – spencer7593

+0

En supposant que c'est mysql, il y a une autre option: [PDOStatement :: rowCount] (http://www.php.net/manual/fr/pdostatement.rowcount.php) – Mike

1

Vous devez utiliser GROUP BY. Votre requête doit ressembler à

SELECT logo_id, guess_count, guessed, COUNT(id) AS counter 
    FROM guess 
WHERE user_id=:id 
GROUP BY logo_id, guess_count, guessed 
+0

Vous avez même besoin de 'GROUP BY' même si j'ai besoin de séparer chaque résultat? – jdepypere

Questions connexes