[RESOLU] rowCount() & closeCursor()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] rowCount() & closeCursor()

Re: rowCount() & closeCursor()

par ionesco » 18 sept. 2013, 23:23

Merci Moogli.
Je vais tester ta méthode et voir quels résultats j'obtiens. Pour connaître le nb de lignes supérieur à 0, on procède ainsi:
$reqUsers=$bd->prepare('SELECT COUNT(*) AS nbUsers FROM users WHERE onLine=:onLine'); 
$reqUsers=$bd->execute(array(
                          ':onLine'=>1
                 )); 
$data=$reqUsers->fetch(); 
if($data > 0){
  //code
} 

$reqTextes->closeCursor(); 
Cdlmt,
Ionesco

Et je reviens poster mon impression.
Ionesco

Re: rowCount() & closeCursor()

par moogli » 18 sept. 2013, 23:01

salut,

pour te répondre je commence par te citer la doc de la méthode rowCount()
retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.

Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.
Donc c'est assez clair à ne pas utiliser avec un select si tu n'est pas sur que le SGBD fournisse la donnée ;)

Quand a utiliser fetchColumn c'est une utilisation détournée du fait que cette fonction retournera false s'il n'y a pas de données.
De plus quitte a faire une requête SQL autant faire count pour savoir si la donnée est déjà présente.
par exemple :
 select count(1)  as nb from latable where lechampAtester='la valeur a tester'
et tu test si nb == 0 c'est que la donnée n'est pas dans la table.

J'ai vu plus crade que l'utilisation du fetch, comme utiliser le mécanisme d'exception en executant l'insert (il faut qu'il y ai une contrainte unique sur la colonne ne pouvant être en double) et si la donnée est présente => exeption donc message d'erreur indiquant le doublon ;) (c'est quand même crado hein ;) ).

Perso je préfère le count() plutot que des requêtes qui récupère des données inutiles.

@+

En dehors

rowCount() & closeCursor()

par ionesco » 18 sept. 2013, 22:36

Bonjour,
Question 1:
J'utilise très souvent rowCount() pour savoir si j'ai une ligne déjà créé.
Je prépare une requête, puis execute et ensuite
$resultat=$req->rowCount();
		if($resultat > 0){
                   //etc..}
En fait, je souhaitais savoir si cette utilisation était correcte car j'ai lu sur un forum qu'il était préférable d'employer
if($req->fetchColumn()==0){
//etc..}
Question 2:
Je ne mets pas closeCursor(), est-ce indispensable et où les placer quand on a une requête avec if..else?
Merci par avance
Ionesco