developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.
Opened 13 years ago
Closed 13 years ago
#614 closed bug (wontfix)
[jDbPDO] rowCount ne devrait pas etre utilisé sur des select
Reported by: | yferp | Owned by: | |
---|---|---|---|
Priority: | low | Milestone: | |
Component: | jelix:db | Version: | 1.0.4 |
Severity: | normal | Keywords: | |
Cc: | Blocked By: | ||
Blocking: | Documentation needed: | no | |
Hosting Provider: | Php version: |
Description
Dans les tutos (et le code) rowcount() est utilisé pour connaitre le nombre de lignes renvoyées par une requête (ex : http://jelix.org/articles/tutoriels/crud-jform-dao).
Or lorsqu'on utilise le driver PDO il faut faire attention car :
<<If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.>>
En l'occurrence sous mysql pas de problèmes mais sous oci, ca ne marche pas.
Une solution est de redéfinir la méthode rowcount du jpdoresultset
public function rowcount(){ return count($this); }
ca marche pour moi mais vu que ça dépend du fetchmode et autres, c'est a revoir
Change History (4)
comment:1 Changed 13 years ago by yferp
- Milestone changed from Jelix 1.1 beta 1 to Jelix 1.0.5
comment:2 Changed 13 years ago by laurentj
- Milestone Jelix 1.0.5 deleted
- Priority changed from normal to low
comment:3 Changed 13 years ago by yferp
En fait je fais le count sur un fetchAll donc sur un tableau, ce qui va compter le nombre d'enregistrements. Par contre ça ne marchera pas pour des requetes autre que select.
je suis tout a fait d'accord, il ne faut pas redéfinir rowcount : normalement le développeur sais si il peut l'utiliser ou pas donc çà ne doit pas poser de problèmes..
Par contre dans les tutos de Jelix rowcount est utilisé sur un select ce qui fait que si quelqu'un essaye de refaire le tuto avec une base oracle, il n'aura pas de bons resultats... donc il faudrait modifier le tuto pour mettre un avertissement
comment:4 Changed 13 years ago by laurentj
- Resolution set to wontfix
- Status changed from new to closed
J'ai mis l'avertissement dans la doc.
Ça ne sert à rien à mon avis de redéfinir un rowcount. Parce qu'à mon avis, quand tu fais un count($recordset), il va faire le vrai rowcount (qui lui même appelle les fonctions spécifiques à chaque base de données, qui elles-mêmes ne sont pas fiables non plus, cf leurs docs).
Il n'y a aucun solution à cette problèmatique, sauf à faire un SELECT COUNT(*), mais cela nécessite de savoir quelle requête a été executée, de la manipuler pour la transformer en SELECT COUNT(). Un truc plutôt lourd...