developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 12 years ago

Closed 12 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 12 years ago by yferp

  • Milestone changed from Jelix 1.1 beta 1 to Jelix 1.0.5

comment:2 Changed 12 years ago by laurentj

  • Milestone Jelix 1.0.5 deleted
  • Priority changed from normal to low

Ç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...

comment:3 Changed 12 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 12 years ago by laurentj

  • Resolution set to wontfix
  • Status changed from new to closed

J'ai mis l'avertissement dans la doc.

Note: See TracTickets for help on using tickets.