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 :

PDO et UPDATE [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 66
    Points : 43
    Points
    43
    Par défaut PDO et UPDATE
    Bonjour à tous,

    Je ne comprend pas j'ai une méthode, qui me sert pour les 'INSERT, UPDATE et DELETE' et qui fonctionne correctement jusqu’à maintenant:

    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
     
    	public function dbExec($req,$condition) {
    		try {
    			$bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
    			$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		} catch(Exception $log) {
    			echo 'Erreur: '.$log->getMessage().'<br />';
    			echo 'Code: '.$log->getCode();
    		}
    		if (empty($log)) {
    			$requete = $bdd->prepare($req);
    			if (!is_array($condition)) {
    				$condition = array();
    			}
    			try {
    				$do = $requete->execute($condition);
    			} catch(Exception $log) {
    				echo 'Erreur: '.$log->getMessage().'<br />';
    				echo 'Code: '.$log->getCode();
    			}		
    			// Si on trouve une reponse			
    			if ($do != false) {
    				return true;
    			} else {
    				return false;
    			}
    		}
    	}
    Cette méthode fonctionne correctement pour faire des 'UPDATE' mais avec le code suivant le try/catch ne me renvoi aucune erreur et la méthode me renvoi TRUE alors que rien n'est modifié dans la BDD... C'est étrange! Voici le code en question:

    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
     
    	// Mettre à jour une note
    	if ($_POST['updateNote']) {
    		if ( ($_POST['id'] != '') && ($_POST['noteTitre'] != '') && ($_POST['noteContent'] != '') && ($_POST['noteKeywords'] != '') ) {
    			// Recuperer le timestamp
    			$time = time();
    			if (!$Core->dbExec('UPDATE `notes` SET `titre`=?, `note`=?, `keywords`=?, `ts_lastmodif`=? WHERE `id_creator`=? AND `id`=?', array($_POST['noteTitle'], $_POST['noteContent'], $_POST['noteMetaKeywords'], $_SESSION['userid'], $time, $_POST['id'])) ) {
    				$txt = '<p>Erreur lors de l\'enregistrement des modifications...</p>';
    				$Core->newErrorMessage($txt);
    			} else {
    				$txt = '<p>Les modifications sont correctement enregistrés!</p>';
    				$Core->newMessage($txt);
    			}					
    		} else {
    			$txt = '<p>Erreur: Impossible de d\'enregistrer les modifications...</p>';
    			$Core->newErrorMessage($txt);				
    		}	
    	}
    Je ne comprend pas pourtant quand je teste coté serveurs les données que j'enregistre sont bien différentes de celles présentes dans ma DB (ne serai-ce que le timestamp) et pourtant rien ne change dans ma DB....

    J'en perd mon latin et je suis fatigué alors ça n'arrange rien, si quelqu'un peut me filer un coup de main, il est le bienvenu!

    Merci

    Nico

  2. #2
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    dans ta liste de paramètres, tu as inversé $time et $_SESSION['userid'],
    mes $time avant $_SESSION['userid']...
    Développeur informatique contrarié...

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par vorace Voir le message
    dans ta liste de paramètres, tu as inversé $time et $_SESSION['userid'],
    mes $time avant $_SESSION['userid']...
    Un grand merci Vorace, erreur stupide de fatigue... Juste pour la forme pourquoi je n'ai aucun message d'erreur alors que pourtant j’exécutais un UPDATE sur une entrée inexistante dans ma DB?

  4. #4
    Membre confirmé Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Points : 540
    Points
    540
    Par défaut
    Parce que ne requête qui ne retourne pas de résultat n'est pas forcément une requête fausse. Alors il n'affiche pas d'erreur. (:
    Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

    - Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par radicaldreamer Voir le message
    Parce que ne requête qui ne retourne pas de résultat n'est pas forcément une requête fausse. Alors il n'affiche pas d'erreur. (:
    Oui attention ce commentaire est un résidu d'une autre méthode dbQuery() pour faire des SELECT dans la DB, mais dans le cas présent la requête PDO execute() est censé renvoyer un bool point barre.... Je l'ai ré-éecrite avec des opérateurs de type '===' .

    Bonne journée

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    mais dans le cas présent la requête PDO execute() est censé renvoyer un bool point barre
    Tout a fait.

    Il me semble qu'il y aurait plus simple et plus fiable en procédant ainsi :
    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
     
    public function dbExec($req,$condition) {
    	try {
    		$bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
    		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    //
    		$requete = $bdd->prepare($req);
    		if (!is_array($condition)) {
    			$condition = array();
    		}
    		try {
    			return $requete->execute($condition);
    		}
    		catch(Exception $e) {
    			echo 'Erreur: '.$e->getMessage().'<br />';
    			echo 'Code: '.$e->getCode();
    		}
    	}
    	catch(Exception $e) {
    		echo 'Erreur: '.$e->getMessage().'<br />';
    		echo 'Code: '.$e->getCode();
    	}
    	return FALSE;
    }
    Entre autre, il n'est pas utile de continuer le script si le 1er try/catch de connexion échou, du coup une vérif de $log devient par la même occasion inutile.
    La suite du code, de l'exécution de la requête serait bien mieux dans ce 1er try/catch à mon avis.


    Aussi, une vérif est faite sur $do après le 2ème bloc try/catch.
    Là aussi, s'il y a erreur il vaut mieux ne pas poursuivre le script.

    S'il y a une erreur de syntaxe sur la requête par exemple, une exception sera levée et seul le code dans le catch sera exécuté.
    Du coup, $do n'existera pas à la suite du code, et ceci devrait provoquer une toute autre erreur, vois tu ?


    Donc attention au déroulement du code, c'est un peu dommage de mettre en place une gestion des exceptions en recréant d'autres erreurs en cascades, même minimes.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    un seul try...catch suffis :

    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
    public function dbExec($req, $condition)
    {
        try 
        {
            $bdd = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->db, $this->dbuser, $this->dbpass);
            $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
            $requete = $bdd->prepare($req);
     
            if(!is_array($condition))
            {
                $condition = array();
            }
     
            return $requete->execute($condition);
        }
        catch(PDOException $e)
        {
            echo 'Erreur: ', $e->getMessage(), '<br />';
            echo 'Code: ', $e->getCode();
        }
     
        return false;
    }

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    un seul try...catch suffis :
    Oui, parce qu'en cas d'erreur le message est exactement le même, donc pourquoi pas.


    Mais en conservant les 2 try/catch, les 2 niveaux, on peu améliorer le débogage en y rajoutant la requête SQL par exemple dans le 2ème catch.
    On ciblera mieux la nature de l'erreur à mon sens.


    Il me semble qu'il est là l'avantage des try/catch, c'est d'attraper les erreurs le plus tôt possible afin de la gérer autrement ou/et alors informer le codeur/développeur de la vrai nature de l'erreur, et aussi où elle a eu lieu.
    Ces messages d'erreurs risquent d'être peu explicites d'ailleurs, un $e->getMessage() c'est maigre bien souvent, m'enfin.


    D'ailleurs, là j'ai un doute, mais il faudrait voir lorsqu'une exception est levée si le message est enregistré dans les logs (php_errors.log).
    A mon avis ce n'est pas le cas, et ce serait un manque (voir gros manque).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    D'ailleurs, là j'ai un doute, mais il faudrait voir lorsqu'une exception est levée si le message est enregistré dans les logs (php_errors.log).
    A mon avis ce n'est pas le cas, et ce serait un manque (voir gros manque).
    non c'est a toi de faire ça.

  10. #10
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup à tous pour votre aide, oui en effet j'ai bien compris le pourquoi du comment grâce à vos explications.

    Pour le débogage, je vais ajouter une méthode dans mon application pour les logger proprement dans un fichier.

    Bonne continuation

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

Discussions similaires

  1. [MySQL] PDO et update (aucune modification réalisée)
    Par babacan dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 25/06/2012, 12h39
  2. [PostgreSQL] [PHP objet & PDO] Requête UPDATE ne passe pas
    Par lynnaryas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/04/2012, 15h07
  3. [PDO] PDO.sqlite : update non effectué, mais pas d'erreur
    Par Yosko dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/04/2012, 16h55
  4. [PDO] Pdo : bind update avec :var et ? ( ordre d'exécution)
    Par Valkirion dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/03/2012, 17h53
  5. [MySQL] Erreur PDO sur update
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/11/2011, 14h47

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