IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

ne pas faire 2 fois la même chose en PDO


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut ne pas faire 2 fois la même chose en PDO
    Bonsoir,

    j'y connais pas grand chose, mais j'ai quand même l'impression que j'exécute 2 fois la même requête SQL ; peut-on me le confirmer ou non ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $sql='select * from `conf` order by nom';
    $qid = $bdd->prepare($sql);
    $qid->execute();
    while( $ligne=$qid->fetch(PDO::FETCH_ASSOC) )
    	...
    // équivalent PDO de MySQL_num_rows()
    $rowCount = $bdd->exec($sql);
    $nb=$rowCount->rowCount();
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Non, la préparation d'une requête n'a rien à voir avec son exécution quand on utilise les requêtes préparées.

    Ceci dit, quand le requête ne contient aucun paramètre variable (tout est en dur dans la requête), on peut se passer d'utiliser les requêtes préparées en utilisant la méthode query
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Oui tu executes deux fois la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql='select * from `conf` order by nom';
    $qid = $bdd->prepare($sql);
    $qid->execute();
    while( $ligne=$qid->fetch(PDO::FETCH_ASSOC) )
    	...
     
    $nb=$qid->rowCount();
    Attention cependant : rowCount n'est pas prévu pour fonctionner avec une requête SELECT, même si avec Mysql ça marche normalement.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses ; en fait, je suis en train de réactiver un site que j'avais codé début 2011 (http://vercorshandisport.org/conf/conf/index_f.htm) avec les fonctions mysql_xxx ; sans rien changer (sauf le serveur puisqu'entre temps, j'ai changé d'hébergeur) ; j'obtiens un message d'erreur " Table 'nom_base.nom_table' doesn't exist". J'ai donc entrepris de tout basculer en pdo (très peu d'expérience), d'où cette discussion.
    Si je tiens compte de vos 2 interventions, donc que je me passe des requêtes préparées, je voudrais savoir si ce code convient :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $sql='select * from `conf` order by nom';
    $qid = $bdd->query($sql);
    while( $ligne=$qid->fetch(PDO::FETCH_ASSOC) )
    	...
     
    $nb=$qid->rowCount();

    et 2 questions :
    - à la connexion, je crée un objet "$bdd" avec ce constructeur :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	function __construct() {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;//important sur les configs récentes
    	$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_ASSOC;//pour le mode ASSOC
    	$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";//pour l'utf-8
     
    	parent::__construct('mysql:host=' . MyPdo::$HOST . ';dbname=' . MyPdo::$DB_NAME, MyPdo::$USER, MyPdo::$PASS, $pdo_options);
    	}
    donc du coup, passer la constante PDO::FETCH_ASSOC à la méthode fetch est-il utile ?

    - si rowCount ne marche pas avec un select, comment dans ce cas compter les lignes retournées par cette requête ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    je voudrais savoir si ce code convient
    Tout à fait

    donc du coup, passer la constante PDO::FETCH_ASSOC à la méthode fetch est-il utile ?
    Non, car comme tu l'as précisé, c'est le fetch utilisé par défaut.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour ta confirmation Spartacusply, et pour compter les lignes retournées par un select, tu sais ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    La solution la plus "propre" est de faire une autre requête count qui retourne le nombre de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql='select count(*) from conf';
    $qid = $bdd->query($sql);
    Bon ceci dit, un petit compteur dans la boucle du fetch fait également très bien l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $sql='select * from `conf` order by nom';
    $qid = $bdd->query($sql);
    $count = 0;
    while( $ligne=$qid->fetch(PDO::FETCH_ASSOC) )
            $count++;
    	...
     
    echo $count;
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 383
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Non seulement c'est plus propre mais ça coûte moins cher : pas besoin des fetch, quoiqu'un select sans fetch derrière...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Ne pas imprimer deux fois la même chose
    Par Flup dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 24/11/2009, 20h47
  2. Peut on faire avec JDBC la même chose que PDO en PHP ?
    Par arnaudperfect dans le forum JDBC
    Réponses: 1
    Dernier message: 13/09/2007, 08h38
  3. Réponses: 12
    Dernier message: 23/01/2007, 19h07
  4. Réponses: 1
    Dernier message: 23/11/2006, 16h59
  5. empecher d'avoir deux fois la même chose dans une listebox
    Par Seb4657 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/03/2006, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo