Extrait du manuel de l'AOP :
PDOStatement::rowCount() retourne la valeur de nombre de lignes touchés par la dernière DELETE, INSERT, ou UPDATE déclaration exécutée par l'objet PDOStatement correspondant.
Si la dernière instruction SQL exécutée par l'instruction PDOS associée était un SÉLECTIONNER déclaration, certaines bases de données peuvent retourner le nombre de lignes retournées par cette instruction . Cependant, ce comportement est non garanti pour toutes les bases de données et ne doit pas être utilisé pour des applications portables.
Je ne l'ai découvert que très récemment. Je venais juste de changer ma couche d'abstraction de données pour ne pas utiliser SELECT COUNT(1) ...
car il serait beaucoup plus efficace d'interroger les rangées actuelles et de compter le résultat. Et maintenant PDO ne supporte pas ça ! ?
Je n'utilise pas PDO pour MySQL et PgSQL, mais je le fais pour SQLite. Existe-t-il un moyen (sans modifier complètement le dbal) de compter les lignes comme ceci dans PDO ? En MySQL, ce serait quelque chose comme ceci :
$q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele');
$rows = $q->num_rows;
// and now use $q to get actual data
Avec les pilotes MySQLi et PgSQL, c'est possible. Avec tous les PDO, ça ne l'est pas !?
PS. Ma solution initiale était d'étendre la méthode SQLResult->count (ma propre méthode) pour remplacer SELECT ... FROM
par SELECT COUNT(1) FROM
et renvoyer simplement ce nombre (très inefficace, mais seulement pour SQLite PDO). Ce n'est cependant pas suffisant, car dans l'exemple de requête ci-dessus, il y a un fichier GROUP BY
ce qui modifierait le sens/la fonction de l'expression COUNT(1)
.
0 votes
J'ai déjà été victime de cette situation par le passé, mais il en a toujours été ainsi, cela n'a pas changé soudainement. Postgres vous donnera le compte, MySQL ne le fera pas. Vous supposez que l'exécution de la requête et le comptage des résultats seraient plus efficaces, mais que se passe-t-il si vous avez des dizaines de milliers de lignes ?
0 votes
MySQL vous donnera le compte. Le client SQLlite "natif" de PHP le fait aussi. Mais pas PDO. Avec n'importe quel pilote.
0 votes
Si vous avez besoin d'une solution en dehors de PDO (s'il ne supporte pas countRows), vous pouvez essayer quelque chose comme : "select SUM(1) as count from ... "Je sais que cela fonctionne dans mySQL, il faut juste ajouter 1 pour chaque ligne retournée dans la requête (je n'ai pas testé cela dans sqlLite), à la fin la valeur de "count" = count(*).