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

PHP & Base de données Discussion :

UPDATE dans une boucle


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut UPDATE dans une boucle
    Bonjour,

    Je souhaite faire une requete UPDATE à l'interieur d'une boucle generée par un SELECT.

    Plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    $sql = "SELECT id_enregistrement FROM membres WHERE pseudo = :pseudo";
    $stmt = $dbh->prepare($sql);
    $stmt->BindParam(':pseudo', $pseudo);
    $stmt->execute();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    	{
          //on stocke dans un tableau tous les id de membre devant être modifiés
          $id_membre = $row['id_membre'];
     
     
          print_r($id_membre);
     
          $sql = "UPDATE FROM membres SET score = :score WHERE id_membre = :id_membre";
          $stmt = $dbh->prepare($sql);
          $stmt->BindParam(':score', $score);
          $stmt->BindParam(':id_membre', $id_membre);
          $stmt->execute();
     
     
          }
    ?>
    Le script effectue une première requete en recuperant le pseudo des membres (non visible dans le code ci-dessus).
    puis une seconde pour recuperer une liste d'ID à modifier en fonction du pseudo du membre renvoyé par la première requete (visible ici)...

    En local j'ai créer plusieurs membres etc... print_r($id_membre) me renvoie le numéro des enregistrements à modifier à savoir 27,28,14,15,22,25,10,12,13, '2'1 '16'.

    Si au-lieu d'effectuer réellement une requete sql je remplace le code de la balise $sql par print("UPDATE FROM membres SET score = $core WHERE id_membre = $d_membre") le code s'affiche 11 fois, par contre en laissant la requete UPDATE cette dernière ne modifie que les enregistrements '27' et '2' ce qui correspond au premier enregistrement de chacun des membres.

    Pourquoi ? Que faire pour que la requete soit bien effectuée 11 fois comme si c'était un print ?

    Merci d'avance pour votre réponse....

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    La variable $stmt (PDOStatement) est réutilisée donc écrasée par la seconde requête, d'où conflit.

    HS : bindParam est "mal-utilisée" mais c'est encore autre chose et ça n'a pas forcément d'influence (visible du moins) sur votre code. Il aurait bien mieux valu se contenter de bindValue.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Salut,

    Merci pour ton aide, ca marche maintenant Ca m'aura appris à toujours utiliser les mêmes noms de variable dans mes scripts...

    En ce qui concerne le BindParam / BindValue, j'ai vraiment pris l'habitude de toujours utiliser BindParam mais pourquoi me conseilles-tu d'utiliser BindValue ?

    Merci d'avance pour ta réponse.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Parce que bindParam est destinée à lier un paramètre à une variable. Cette association n'a donc besoin d'être réalisée qu'une seule fois. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $update = $dbh->prepare("UPDATE FROM membres SET score = :score WHERE id_membre = :id_membre");
    $update->bindParam(':score', $score);
    $update->bindParam(':id_membre', $id_membre);
     
    $id_membre = 3;
    $score = 400;
    $update->execute();
     
    $id_membre = 18;
    $score = 5000;
    $update->execute();
    D'autre part, étant donné que c'est une variable qui est associée au paramètre et non une simple valeur (mécanisme de référence ou similaire), s'il y a transtypage derrière par PDO, votre variable sera modifiée. Ainsi dénaturée et sans en avoir conscience, la suite du script pourrait alors produire des erreurs (de simples notices à des erreurs fatales suivant les cas) ou adopter un comportement imprévu si vous cherchiez à réutiliser celle-ci.

    Un exemple possible : une importation XML vers BDD par l'intermédiaire de SimpleXML. L'objet SimpleXMLElement (la variable en elle-même en fait) serait (au moins) converti en chaîne par bindParam. Vous imaginez la suite ... ($sxmle->fils donnerait alors une erreur fatale).

Discussions similaires

  1. Update dans une boucle sur un resultset
    Par ptr83 dans le forum JDBC
    Réponses: 0
    Dernier message: 07/04/2010, 12h38
  2. Update dans une boucle
    Par tazamorte dans le forum PL/SQL
    Réponses: 2
    Dernier message: 04/02/2009, 15h43
  3. [MySQL] Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/10/2008, 18h46
  4. Update dans une boucle avec valeur incrémentale
    Par framus.class dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2008, 12h19
  5. Syntaxe pour un update dans une boucle ..
    Par fmoriet dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 15/11/2007, 10h55

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