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 :

[PDO] Update


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut [PDO] Update
    Bonjour,

    Y-a-til une erreur dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach ($this->formExt as $id => $data) {
    	$sql = $this->db->exec(
    		'UPDATE '.$this->tableName.' 
    			SET '.$id.' = "'.$data['data'].'"
    			WHERE '.$field.' = "'.$fieldValue.'"'
    	);
    }
    La requete sql est bonne car en affichant avec echo l'update ca donne :
    UPDATE site_user SET password = "123456789" WHERE id = "1"
    UPDATE site_user SET country = "FR" WHERE id = "1"
    UPDATE site_user SET gender = "F" WHERE id = "1"
    UPDATE site_user SET birthday = "0000-00-00" WHERE id = "1"
    Ce qui est tres juste.

    D'ou pourrais venir le probleme ?!

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    As-tu essayé d'appeler exec() dans un bloc try/catch ?

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Je vient d'essayer apres avoir lu et j'ai tester ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try {
    	$sql = $this->db->exec(
    		'UPDATE '.$this->tableName.' 
    			SET '.$id.' = "'.$data['data'].'"
    			WHERE '.$field.' = "'.$fieldValue.'"'
    	);
    } catch (PDOException $e) {
    	print "Erreur ! : " . $e->getMessage() . "<br/>";
    	die();
    }
    Si le try / catch est bon ca retourne aucune erreur.

  4. #4
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Muarf je vient de tester ca avec mysql je n'ai rien changer juste à la place de $this->db->exec j'ai mis mysql_query

    Et la ca marche ...

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ouaip mais là nous sommes un peu bloqués, tu ne donnes pas assez d'infos sur ta classe.

  6. #6
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Que voudrias tu comme information supplémentaire ?!

    Voici mon __construct()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function __construct($dbConfig, $tableConfig, $formAction = FALSE) {
    	$this->db = $dbConfig;
    	$this->tableName = $tableConfig;
    }
    aux paramètre $dbConfig je passe $db (qui se trouve dans un fichier à part):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    	$db = new PDO("mysql:host=localhost;dbname=ladder", 'root', '');
    } 
    catch( PDOException $e ) {
    	die(ERROR_DB_CONNECT);
    }
    $tableName contient 'site_users'

    Et voici la méthode complete ou est placé le code :
    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
     
    private function editSave($field, $fieldValue) {
    	// On supprime les champ inutile (trash)
    	foreach($this->formExt as $id => $info) {
    		if ($info['trash']) unset($this->formExt[$id]);
    	}
     
    	foreach ($this->formExt as $id => $data) {
    		$sql = $this->db->exec(
    			'UPDATE '.$this->tableName.' 
    				SET '.$id.' = "'.$data['data'].'"
    				WHERE '.$field.' = "'.$fieldValue.'"'
    		);
    	}
     
    	echo 'oki';
    }
    $field et $fieldName contiennent respectivement 'id' et 1

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Je viens d'essayer avec query(), cela fonctionne. Il semble qu'exec() soit prévu pour les transactions : as-tu bien appelé $this->db->beginTransaction() et surtout ton driver supporte-t-il les transactions ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    salut
    vu que tu boucle tu aurai tout interet a utiliser les requetes preparées??

  9. #9
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Si c'est comme ca ca marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    			$sql = $this->db->query(
    				'UPDATE '.$this->tableName.' 
    					SET '.$id.' = "'.$data['data'].'"
    					WHERE '.$field.' = "'.$fieldValue.'"'
    			);
    On ne peux normalement pas utilisé prepare() ici. En tout cas ca marche pas toute facon.

    En débutant une transaction avec exec() j'ai droit a un FATAR ERROR.



    EDIT :
    avec prepare() j'ai ca comme erreur :
    Array ( [0] => HY000 [1] => 2014 [2] => Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. )
    J'ai alors mis setAttribute() avec la valeur PDO::MYSQL_ATTR_USE_BUFFERED_QUERY . Je n'ai plus cette erreur mais cette constante ne semble disponible que pour MySQL. Donc j'aimerais eviter ca.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    private function editSave($field, $fieldValue) {

    $sth = $dbh->prepare("UPDATE '.$this->tableName.'
    SET '.$id.' = :id
    WHERE '.$field.' = :field);
    foreach ($this->formExt as $id => $data) {
    $sth->execute( array( ':id' => $data['data'] , ':field' => $fieldValue);
    //on libere le cursor pour la prochaine requete
    $sth->closeCursor();
    }

    echo 'oki';
    }
    a tester,
    quand tu utilise une methode qui utilise l'objet PreparedStatement il faut libere l'enregistrment pour la prochaine requete ( fetchALL le fait automatiquement)

  11. #11
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Je n'ai pas fait comme tu as dit mais je faisait une requête prepare() puis un fecth() avant cette requête de l'update. Et en plaçant closeCursor() après ça marche bien.

    Merci de votre aide ^^
    Faudrait songer a faire un tuto sur PDO

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Tiens, si ça peut t'aider, voici un exemple :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
     
    function my_exception_handler($exception)
    {
        die('Exception non gérée : '.$exception->getMessage());
    }
     
    class MyDB
    {
        public $db;
        protected $tableName;
     
        public function __construct($dbConfig, $tableConfig, $formAction = FALSE) {
            $this->db = $dbConfig;
            $this->tableName = $tableConfig;
        }
    }
     
     
    set_exception_handler('my_exception_handler');
     
    $pdo = new PDO('mysql:host=localhost;dbname=jeu_de_roles', 'root', '', array(PDO::ERRMODE_EXCEPTION));
    $bdd = new MyDB($pdo, 'test');
     
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
     
    $statements = array(); // Contient tous les statements du script
     
    $sql = 'SELECT id, name
            FROM jdr_player';
    $statements['players'] = $bdd->db->prepare($sql);
     
    $sql = 'SELECT ps.stat_id AS id, s.name
            FROM jdr_player_stat AS ps
            INNER JOIN jdr_stat AS s ON ps.stat_id = s.id
            WHERE ps.player_id = ?';
    $statements['stats'] = $bdd->db->prepare($sql);
     
     
    $statements['players']->execute();
    $players = $statements['players']->fetchAll();
     
    foreach($players as $player)
    {
        $statements['stats']->execute(array($player['id']));
        $stats = array();
        foreach($statements['stats']->fetchAll() as $stat)
        {
            $stats[] = $stat['name'];
        }
     
        echo $player['name'].' : '.implode(', ', $stats).'<br />';
    }
     
    ?>

  13. #13
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Yep la gestion d'erreur va m'aider

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

Discussions similaires

  1. Requête PDO UPDATE ne retourne rien
    Par FozXP dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2014, 19h07
  2. [PDO] PDO Update préparé - non fonctionnel
    Par JayZon12 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/04/2014, 01h28
  3. [PDO] Requête pdo update et le rowcount()
    Par lavm01 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/01/2014, 09h25
  4. PDO : UPDATE
    Par teol91 dans le forum Langage
    Réponses: 3
    Dernier message: 13/10/2011, 20h45
  5. [MySQL] PDO update qui ne fait rien
    Par Irokoi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/09/2011, 16h36

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