2009-01-20 9 views
14

J'ai récemment commencé à travailler sur un nouveau projet utilisant PHP5 et je veux utiliser leurs classes PDO pour cela. Le problème est que le pilote MySQL PDO ne supporte pas rowCount(), donc il n'y a aucun moyen d'exécuter une requête et ensuite obtenir le nombre de lignes affectées, ou les lignes retournées, ce qui est un gros problème en ce qui me concerne. Je me demandais si quelqu'un d'autre a traité de cela auparavant et de ce que vous avez fait pour contourner le problème. Avoir à faire un fetch() ou fetchAll() pour vérifier si des lignes ont été affectées ou retournées me semble être un hack, je préfère faire $ stmt-> numRows() ou quelque chose de similaire.Solution de contournement pour le problème PDO rowCount de PHP5

+0

Cela ne semble pas être un problème dans PHP 5.4. Quelqu'un peut-il confirmer? – David

Répondre

25

Vous pouvez émettre une requête SELECT FOUND_ROWS() juste après la requête initiale SELECT pour obtenir le nombre de lignes.

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

Voir aussi: MySQL Docs on FOUND_ROWS()

+1

Une question, rowCount() fonctionne bien pour moi, également sur les instructions SELECT. Cela a-t-il été mis en œuvre depuis que cette question a été répondue? – Mattis

+0

@Imran rowCount() fonctionne pour moi aussi pour select ainsi que pour les requêtes comme 'SHOW TABLES LIKE ''' requêtes. J'utilise PHP 5.2.6. Je ne connais pas ma version de Pecl. Comment le vérifier? Serait-ce un problème avec PHP 5.2.6+? Trouvé cette question - http://stackoverflow.com/questions/769767/pdos-rowcount-not-working-on-php-5-2-6 –

+0

rowCount() ne fonctionne que si vous avez déjà effectué un fetchAll(), mais pas si vous utilisez fetch() (c'est une meilleure cause consomme beaucoup moins de mémoire) – itsjavi

1

Pour ceux d'entre vous qui utilisent des procédures stockées MySQL, cette solution n'est pas vraiment possible. Ce que je suggérerais que vous fassiez, c'est que votre procédure stockée crée deux ensembles de lignes. Le premier contiendra une ligne et une colonne, contenant le nombre d'enregistrements. Le second sera le jeu d'enregistrements que vous utiliserez pour récupérer ce nombre de lignes.

Le nombre de lignes illimités peut être un SELECT COUNT(*) avec exactement le même WHERE clause que le deuxième ensemble de lignes sans les clauses LIMIT/OFFSET.

Une autre idée pourrait être de créer une table temporaire. Utilisez votre instruction SELECT pour remplir la table temporaire. Ensuite, vous pouvez utiliser SELECT COUNT(*) FROM tmpTable pour votre premier jeu de lignes et SELECT * FROM tmpTable pour votre second.

+1

Ne pensez-vous pas que l'utilisation d'une table temporaire est un peu exagérée pour obtenir un nombre aussi inutile? –

0

Cette question est basée sur plusieurs fausses hypothèses et une déclaration périmée.

Tout d'abord, ne confondez pas le numéro de affecté et sélectionné lignes. PDO a soutenu le premier même en '09.

En parlant du nombre de lignes retournées par l'instruction SELECT - vous n'avez pas besoin de ce nombre. Les données que vous avez sont suffisantes. Et oui, de nos jours rowCount() prend également en charge le nombre de lignes sélectionnées à partir de mysql. Mais encore une fois - vous n'avez pas besoin de ce numéro dans une application web moyenne de toute façon.

+0

"Vous n'avez pas besoin de ce numéro, les données que vous avez sont suffisantes". Oh my .. Traduit en "Vous n'avez pas besoin d'une adresse e-mail, il suffit d'avoir un site web!" J'ai presque TOUJOURS besoin de ce numéro, et éviter d'avoir plusieurs requêtes COUNT quand je peux juste compter la requête elle-même. Il est toujours bon de dire à l'utilisateur que "aucune entrée n'a été trouvée" si c'est le cas, au lieu de simplement boucler NOTHING. (En outre, vous ne pouvez pas vérifier si fetch() renvoie true si vous utilisez également une boucle while) – mowgli

Questions connexes