226 votes

Nombre de lignes avec AOP

Il y a beaucoup de déclarations contradictoires autour de, quel est le meilleur moyen de compter les lignes en utilisant PDO en PHP? Avant d’utiliser PDO, j’utilisais simplement mysql_num_rows .

fetchAll est quelque chose que je ne voudrai pas, car je peux parfois avoir affaire à de grands ensembles de données, donc ce n'est pas bon pour mon utilisation.

Aucune suggestion?

304voto

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

Pas de la façon la plus élégante de le faire, de plus il s'agit d'une requête supplémentaire.

PDO a PDOStatement::rowCount(), ce qui apparemment n'est pas le travail dans MySql. Quelle douleur.

À partir de l'AOP Doc:

Pour la plupart des bases de données, PDOStatement::rowCount() n'est pas retourne le nombre de lignes affectées par une instruction SELECT. Au lieu de cela, utiliser PDO::query() pour émettre un SELECT COUNT(*) déclaration avec la même les prédicats que votre SÉLECTIONNEZ l'instruction, puis utiliser PDOStatement::fetchColumn() pour récupérer le nombre de lignes être retourné. Votre application peut ensuite effectuer la bonne action.

EDIT: Le code ci-dessus utilise une requête préparée, qui est dans de nombreux cas, est probablement inutile pour le but de compter les lignes, donc:

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

94voto

Chad Birch Points 39087

Comme je l'ai écrit précédemment dans une réponse à une question similaire, la seule raison mysql_num_rows() a fonctionné, c'est parce qu'il était interne de la récupération de toutes les lignes afin de vous donner de l'information, même si elle n'a pas l'air de vous.

Donc, en PDO, vos options sont les suivantes:

  1. Utilisation de MySQL FOUND_ROWS() fonction.
  2. Utiliser PDO l' fetch_all() fonction pour récupérer toutes les lignes dans un tableau, puis utilisez count() .
  3. Faire une requête supplémentaire à l' SELECT COUNT(*), comme karim79 suggéré.

23voto

Eric Warnke Points 199

J'ai fini par utiliser ceci:

 $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>";
}
 

14voto

Dan Points 63

C'est super tard, mais j'ai rencontré le problème et je fais ceci:

 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();
 

C'est vraiment simple et facile. :)

5voto

Eric Points 39

C'est un vieux post, mais frustré à la recherche d'alternatives. Il est très regrettable que PDO ne le permet pas, surtout que le PHP et MySQL ont tendance à aller main dans la main.

Il y a malheureusement une faille dans l'aide fetchColumn() que vous ne pouvez plus utiliser l'ensemble des résultats (dans les faits) que le fetchColumn() déplace l'aiguille à la ligne suivante. Ainsi, par exemple, si vous avez un résultat similaire à celui de

  1. Fruit->Banane
  2. Fruit->Apple
  3. Fruit->Orange

Si vous utilisez fetchColumn (), vous pouvez trouver qu'il y a 3 fruits retourné, mais si maintenant vous faire une boucle par la suite, vous ne disposez que de deux colonnes, Le prix de fetchColumn() est la perte de la première colonne de résultats, juste pour savoir combien de lignes ont été retournés. Qui mène à la bâclée de codage, et totalement erreur en proie à des résultats si sa mise en œuvre.

Alors maintenant, à l'aide de fetchColumn (), vous avez à mettre en œuvre et entièrement nouvelle de l'appel et de la requête MySQL juste pour obtenir une nouvelle travailler ensemble de résultats. (qui je l'espère n'a pas changé depuis votre dernière requête), je sais que, peu probable, mais cela peut arriver. Aussi, la charge de la double requêtes sur toutes les lignes compter de la validation. Qui dans cet exemple est petit, mais l'analyse de 2 millions de lignes sur un joint de la requête, et non pas à un agréable prix à payer.

J'aime le PHP et soutenir tous ceux qui participent à son élaboration ainsi que de l'ensemble de la communauté à l'aide de PHP sur une base quotidienne, mais espère vraiment que c'est résolu dans les prochaines versions. C'est "vraiment" mon seul reproche avec PHP PDO, qui, autrement, est d'une grande classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X