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]Fonction Update qui ne fonctionne plus


Sujet :

PHP & Base de données

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [PDO]Fonction Update qui ne fonctionne plus
    Bonjour,
    Je suis en ce moment en train de programmer un site web en utilisant le moteur de rendu Twig et le design Bootstrap de Twitter.
    Alors je vais essayé d'être rapide et précis, je gère mes membres avec deux classes : une classe membre destinée à représenter le membre et une deuxième classe membresManager qui gère les membres au niveau SQL (save, update etc...) . D'ailleurs voilà, dans cette fameuse classe (MembresManager) j'ai une fonction "update" visant comme son nom l'indique à "updater" le membre... La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function update($array) {
    		$req=$this->db->prepare('UPDATE membres SET session=:session, passe=:passe, email=:mail WHERE id=:id');
                    $req->bindValue('session', $array['Session']);
    		$req->bindValue('passe', $array['Passe']);
    		$req->bindValue('mail', $array['Email']);
    		$req->bindValue('id', $array['Id']);
    		$req->execute();
     
    		return true;
    	}
    Cette fonction est alimenté par un array qui lui est donné par un getAll() de la part de ma classe membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public function getAll() {
    		return array(
    						'Id'=>$this->Id,
    						'Pseudo' => $this->Pseudo,
    						'Passe'=> $this->Passe,
    						'Email' => $this->Email,
    						'Session' => $this->Session
    						);
    	}]
    Voilà la partie explication. Ce système fonctionnait très bien. Par exemple je l'utilisais pour la modification dont voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pass=md5($pass);
    			$membre->setPasse($pass);
    			$membresM->update($membre->getAll());
    Mais tout à basculé quand j'ai commencé à m'attaquer à la dernière partie de mon site : la récupération de mot de passe (oui je sais je fais les choses à l'envers).
    Pour la récupération de mot de passe, je génère un code aléatoire qui sera enregistré dans une colonne session de la table membres et qui correspondra au membre en question. Je récupère l'email et je lui envois un mail avec 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
    if($verif==false) {
    			echo $twig->render('lost_pass.twig.html', array('error'=>'badMail'));
    		}
    		elseif($verif==true) {
    			$membre= new membre($membresM->getMembreByEmail($mail)); //on récupère le membre grâce à son email.
    			$membre->setsession($manager->random(20)); //on màj sa session en mettant un nouveau code grâce à la fonction random que je donnerais juste après ci-dessous
    			var_dump($membre->getAll()); //ça... C'est rien c'était pour moi quand j'ai cherché d'où venait le problème
    			$membresM->update($membre->getAll()); //PUIS on update enfin... 
     
    			$contenu= $twig->render('lost_pass_email.txt.twig', array('membre'=>$membre->getAll(),
    			'code'=>$membre->getSession())); //on récupère ce qu'il faut et on enregistre le rendu de Twig dans une variable pour...
     
    			mail($membre->getEmail(), '[OST] - Récupération du mot de passe', $contenu); //l'envoyer par mail...
     
    			echo $twig->render('lost_pass.twig.html', array('success'=>'emailSend'));//là on affiche juste une vue pour dire "youpi ça marche"
    	}
    La fonction random est celle qui génère le code, la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public function random($car) {
    $string = "";
    $chaine = "abcdefghijklmnpqrstuvwxy";
    srand((double)microtime()*1000000);
    for($i=0; $i<$car; $i++) {
    $string .= $chaine[rand()%strlen($chaine)];
    }
    return $string;
    }
    Donc le mail reçu il nous envoit sur une page qui se nomme "reset_pass.php" et sur laquelle on vérifie les données et puis on donne l'occasion au membre d'update son pass... Et une fois fais, on vérifie et on update. Voici le code (je zappe les vérifs qui ne servent pas dans mon prob) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $pass=md5($pass); //crypt
    		$membre->setpasse($pass); //on màj le membre
    		$membre->setsession($manager->random(35));//on redonne une autre clé cette fois-ci plus longue (l'autre était une clé de récupération)
    		$membresM->update($membre->getAll()); //HAHA on update
    			echo $twig->render('reset_pass.twig.html', array('success'=>'passUpdate'));//no comment c'est mon template pour dire "youhou t'a changé ton mdp"
    Alors l'envoit de mail se passe bien, je reçois le mail. Je test pour la première fois mon code :
    - je m'envois un email grâce au script : OK
    - je vérifie dans la base de donnée si session à été changé : OK
    - je me rend sur la page reset_pass.php?code=(le code généré) : OK j'ai accès au formulaire...
    - j'update et je reçois la confirmation : OK
    - je regarde dans la BDD si j'ai bien la session qui a changé et le reste : BAD
    Rien à changé, l'UPDATE à zappé. Alors j'ai cherché d'abord partout avant de trouver que c'était l'UPDATE (var_dump de partout, vérif et tout...) mais tout était correct.. Alors je me suis renvoyé des mails encore et encore, je recevais à chaque fois un nouveau code mais dans la base de donnée plus rien ne change... Absolument plus rien. Alors j'ai essayé de changé mon profil : idem ça ne marche plus non plus. Alors je ne comprend pas pourquoi avant ça fonctionnait super bien (enfin bien quoi) et là plus rien. Nada. Niette enfin vous voyez le topo...
    J'ai essayé de la réécrire sous toutes ces formes... J'ai enlevé un point virgules (pour voir si elle allait me répondre) et bah oui j'ai eu une erreur. Mais sinon aucunes erreurs mais pas de modification non plus...

    Si quelqu'un à une idée de ce que je pourrais faire à présent? D'où vient l'erreur?

    Si vous avez des questions concernant mon code je vous en prie, j'y répondrais. Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En gros t'as tout essayait sauf ce qu'il faut faire dans ce cas: augmenter le reporting d'erreurs.

    Mets ça au début de ton script et recommence le processus, s'il y a des erreurs que tu ne sais pas corriger, poste les nous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    ini_set('display_errors', 1);
    error_reporting(-1);
    Ah aussi, cette méthode est légèrement absurde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function update($array) {
    		$req=$this->db->prepare('UPDATE membres SET session=:session, passe=:passe, email=:mail WHERE id=:id');
                    $req->bindValue('session', $array['Session']);
    		$req->bindValue('passe', $array['Passe']);
    		$req->bindValue('mail', $array['Email']);
    		$req->bindValue('id', $array['Id']);
    		$req->execute();
     
    		return true;
    	}
    Pourquoi renvoyer systématiquement true ? Il faudrait au contraire renvoyer le status de la requête pour savoir si tout s'est bien passé non ?

    Bref, j'aurais fait comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public function update(array $array = array()) {
    		$stmt = $this->db->prepare('UPDATE membres SET session=:session, passe=:passe, email=:mail WHERE id=:id');
    		$data += $this->_data; // en supposant que les données de ton instance sont dans _data
                    return $stmt->execute($data);
    	}

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai enlevé le "return true" c'est vrai qu'il servait à rien...

    J'ai mis ce que tu m'as dis de mettre au début de mon script et j'ai à la fin de ma fonction un return $req->execute(); à la place. Ça ne fonctionne toujours pas et je n'ai pas d'erreur..

    EDIT : on dirait que c'est le "bindValue" qui fait défaut. Je dis ça car dans ma fonction save (celle qui sert à enregistrer le membre) j'utilise un simple exec() et une insertion basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->db->exec("INSERT INTO membres VALUES ('', '".$array['session']."', '".$array['pseudo']."', '".$array['mdp']."', '".$array['email']."', '1', '0', '', '')");	//insertion dans la bdd
    Et ça fonctionne. J'ai essayé de faire un array externe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    			$data=array('id'=>$membre->getId(),
    			'session'=>$membre->getSession(),
    			'passe'=>$membre->getPasse(),
    			'email'=>$membre->getEmail());
    			$membresM->update($data);
    Mais ça ne fonctionne quand même pas.

    Pour les erreurs j'ai regardé dans la doc PHP ma fonction ressemble à présent à ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public function update($array) {
    		$sql='UPDATE membres SET session=:session, passe= :passe; email= :email WHERE id=:id';
    		$req=$this->db->prepare($sql)or die($req->errorInfo());
    		$req->bindValue('session', $array['session']);
    		$req->bindValue('id', $array['id']);
    		$req->bindValue('passe', $array['passe']);
    		$req->bindValue('email', $array['email']);
    		$req->execute();
     
    		return($req->errorInfo());
    	}
    J'avoue que je ne suis pas très calé au niveau de la gestion d'erreurs... Je ne demande qu'à apprendre.

Discussions similaires

  1. [XL-2010] Fonction VBA qui ne fonctionne plus sous excel 2010
    Par Outinet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2012, 13h49
  2. Réponses: 9
    Dernier message: 11/11/2011, 04h23
  3. Fonctions javascript qui ne fonctionnent plus
    Par Whombat dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 11/01/2009, 13h32
  4. Réponses: 6
    Dernier message: 04/11/2005, 15h20
  5. [MySQL] UPDATE qui ne fonctionne pas
    Par philippef dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/09/2005, 14h35

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