Partage
  • Partager sur Facebook
  • Partager sur Twitter

PDO script modification mot de passe.

    25 mars 2017 à 3:00:31

    Bonsoir à tous,

    J'essai d'adapter un script pour permettre à un utilisateur de modifier son mot de passe en rentrant son mot de passe actuel ainsi que son nouveau mot de passe et pour finir la confirmation de ce dernier.

    <?php
    const MIN_PASSWORD_LEN = 6;
    
    $errors = [];
    mb_internal_encoding('UTF-8');
    if ('POST' == $_SERVER['REQUEST_METHOD']) {
        require('paronel/parofig.php');
    
        if (array_key_exists('old_mdp', $_POST)) {
            $sha_pass_hash_length = mb_strlen($_POST['old_mdp']);
            if ($sha_pass_hash_length < MIN_PASSWORD_LEN) {
                $errors['sha_pass_hash'] = sprintf("La longueur du mot de passe doit être d'au moins %d caractères", MIN_PASSWORD_LEN);
            } else {
    			
                $stmt = $gobdd->prepare('SELECT 1 FROM account WHERE sha_pass_hash = :sha_pass_hash');
                $stmt->execute(['sha_pass_hash' => $_POST['sha_pass_hash']]);
                if (!$errors) {
                   
                }
            }
        } else {
            $errors['sha_pass_hash'] = "Aucun mot de passe";
        }
    
        if (array_key_exists('sha_pass_hash', $_POST)) {
            $sha_pass_hash_length = mb_strlen($_POST['sha_pass_hash']);
            if ($sha_pass_hash_length < MIN_PASSWORD_LEN) {
                $errors['sha_pass_hash'] = sprintf("La longueur du mot de passe doit être d'au moins %d caractères", MIN_PASSWORD_LEN);
            }
            if ($_POST['sha_pass_hash'] != $_POST['sha_pass_hashconfirm']) {
                $errors['sha_pass_hashconfirm'] = "Le mot de passe et sa confirmation ne coïncident pas";
            }
        } else {
            $errors['sha_pass_hash'] = "mot de passe est absent";
        }
    
        if (!$errors) {
    		$id = $_SESSION['id'];
            $insert = $gobdd->prepare("UPDATE account(sha_pass_hash) SET(:sha_pass_hash) WHERE(:id='$id')");
            $insert->execute(['sha_pass_hash' => password_hash($_POST['sha_pass_hash'], $password_options['algo'], $password_options['options'])]);
            echo '<div class="container">
        	<div class="row">
        		<div class="span12 block-title centered">
    			<center>
    			<img src="images/tools/error.png" />
    			</center>
    			<a href="#"/><h1>CREATION DU COMPTE OK !</h1></a>
    			<p>Redirection automatique vers la page de connexion pour g&eacute;rer ton compte.</p>
    			</div>
    			
             <center> 
    		 <img src="images/loader.gif" style="width: 80px"/>
             </center>
    
    			<div class="span12 block-divider"></div>
    <meta http-equiv="refresh" content="5; url=go.php">';
    		exit;
        }
    }
    ?>
    
    
            <div class="container-fluid">
                <div class="row">
                    <div class="col-xs-12">
    <?php
    if ($errors) {
        echo '<div class="alert alert-warning"><p>Veuillez corriger les erreurs ci-dessous afin de réaliser votre inscription :</p><ul><li>', implode('</li><li>', $errors), '</li></ul></div>';
    }
    ?>
                        <form method="post" action="">
                            <fieldset>
                                <div class="form-group <?php if (array_key_exists('old_mdp', $errors)) echo 'has-error'; ?>">
    
                                    <input type="password" id="old_mdp" name="old_mdp" class="form-control" placeholder="Ancien mot de passe" value="<?php if (array_key_exists('old_mdp', $_POST)) echo htmlspecialchars($_POST['old_mdp']); ?>" />
                                </div>
                                
                                <div class="form-group <?php if (array_key_exists('sha_pass_hash', $errors) || array_key_exists('sha_pass_hashconfirm', $errors)) echo 'has-error'; ?>">
    
                                    <input type="password" id="sha_pass_hash" name="sha_pass_hash" placeholder="Nouveau mot de passe" class="form-control" value="" />
                                </div>
                                <div class="form-group <?php if (array_key_exists('sha_pass_hashconfirm', $errors)) echo 'has-error'; ?>">
    
                                    <input type="password" id="sha_pass_hashconfirm" name="sha_pass_hashconfirm" placeholder="Confirmation mot de passe" class="form-control" value="" />
                                </div>
                            </fieldset>
                            <input type="submit" class="button-small" />
                        </form>
                    </div>
                </div>
            </div>
    		
    
    

    Le formulaire fonctionne mais quand je soumets la modification j'ai une erreur par rapport à la ligne 40 (execution de mon script) soit : 

     Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of token

    Si quelqu'un peux m'indiquer ce qui coince, je débute en php, soyez indulgent je me suis inspiré d'un script trouvé sur un site web.

    Merci à vous :)



     

    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2017 à 10:01:45

      Bonjour,

      Ligne 40, il me semble que tu ne passe pas l'id à la requête préparée

      • Partager sur Facebook
      • Partager sur Twitter
      Les erreurs sont les portes de la découverte.
        26 mars 2017 à 0:19:59

        Merci CodecadeMe,

        J'ai pas mal modifié mon script, maintenant il s'éxecute mais il ne modifie pas mon mot de passe :/ je ne comprend ou est l'erreur sans erreur affiché.

        <?php
        const MIN_PASSWORD_LEN = 6;
        
        $errors = [];
        mb_internal_encoding('UTF-8');
        if ('POST' == $_SERVER['REQUEST_METHOD']) {
            require('paronel/parofig.php');
        
            if (array_key_exists('old_mdp', $_POST)) {
                $sha_pass_hash_length = mb_strlen($_POST['old_mdp']);
                if ($sha_pass_hash_length < MIN_PASSWORD_LEN) {
                    $errors['sha_pass_hash'] = sprintf("La longueur du mot de passe doit être d'au moins %d caractères", MIN_PASSWORD_LEN);
                } else {
        			
                    $stmt = $gobdd->prepare('SELECT * FROM account WHERE sha_pass_hash = :sha_pass_hash');
                    $stmt->execute(['sha_pass_hash' => $_POST['old_mdp']]);
                    if ($row = $stmt->fetch(PDO::FETCH_ASSOC))
                    if (!$errors) {
                       
                    }
                }
            } else {
                $errors['sha_pass_hash'] = "Aucun mot de passe";
            }
        
            if (array_key_exists('sha_pass_hash', $_POST)) {
                $sha_pass_hash_length = mb_strlen($_POST['sha_pass_hash']);
                if ($sha_pass_hash_length < MIN_PASSWORD_LEN) {
                    $errors['sha_pass_hash'] = sprintf("La longueur du mot de passe doit être d'au moins %d caractères", MIN_PASSWORD_LEN);
                }
                if ($_POST['sha_pass_hash'] != $_POST['sha_pass_hashconfirm']) {
                    $errors['sha_pass_hashconfirm'] = "Le mot de passe et sa confirmation ne coïncident pas";
                }
            } else {
                $errors['sha_pass_hash'] = "mot de passe est absent";
            }
        
            if (!$errors) {
        		$_SESSION['id'] = $row['id'];
                $stmt = $gobdd->prepare('UPDATE account SET sha_pass_hash = :sha_pass_hash WHERE id = :id');
                $stmt->execute(['id' => $row['id'], 'sha_pass_hash' => password_hash($_POST['sha_pass_hashconfirm'], $password_options['algo'], $password_options['options'])]);
                echo '<div class="container">
            	<div class="row">
            		<div class="span12 block-title centered">
        			<center>
        			<img src="images/tools/error.png" />
        			</center>
        			<a href="#"/><h1>CREATION DU COMPTE OK !</h1></a>
        			<p>Redirection automatique vers la page de connexion pour g&eacute;rer ton compte.</p>
        			</div>
        			
                 <center> 
        		 <img src="images/loader.gif" style="width: 80px"/>
                 </center>
        
        			<div class="span12 block-divider"></div>
        <meta http-equiv="refresh" content="5; url=go.php">';
        		exit;
            }
        }
        ?>
        
        
                <div class="container-fluid">
                    <div class="row">
                        <div class="col-xs-12">
        <?php
        if ($errors) {
            echo '<div class="alert alert-warning"><p>Veuillez corriger les erreurs ci-dessous afin de réaliser votre inscription :</p><ul><li>', implode('</li><li>', $errors), '</li></ul></div>';
        }
        ?>
                            <form method="post" action="">
                                <fieldset>
                                    <div class="form-group <?php if (array_key_exists('old_mdp', $errors)) echo 'has-error'; ?>">
        
                                        <input type="password" id="old_mdp" name="old_mdp" class="form-control" placeholder="Ancien mot de passe" value="<?php if (array_key_exists('old_mdp', $_POST)) echo htmlspecialchars($_POST['old_mdp']); ?>" />
                                    </div>
                                    
                                    <div class="form-group <?php if (array_key_exists('sha_pass_hash', $errors) || array_key_exists('sha_pass_hashconfirm', $errors)) echo 'has-error'; ?>">
        
                                        <input type="password" id="sha_pass_hash" name="sha_pass_hash" placeholder="Nouveau mot de passe" class="form-control" value="" />
                                    </div>
                                    <div class="form-group <?php if (array_key_exists('sha_pass_hashconfirm', $errors)) echo 'has-error'; ?>">
        
                                        <input type="password" id="sha_pass_hashconfirm" name="sha_pass_hashconfirm" placeholder="Confirmation mot de passe" class="form-control" value="" />
                                    </div>
                                </fieldset>
                                <input type="submit" class="button-small" />
                            </form>
                        </div>
                    </div>
                </div>
        		
        
        

        En vous remerciant encore j'ai passé la soirée dessus, je désespère même s'il y a une avancée.
         

        • Partager sur Facebook
        • Partager sur Twitter
          27 mars 2017 à 1:33:18

          essaie dans les paramètre de ta requête préparée d'ajouter des doubles points par exemples : [':id'=> $row['id']
          • Partager sur Facebook
          • Partager sur Twitter
          Les erreurs sont les portes de la découverte.
            27 mars 2017 à 10:42:30

            Salut,

            je ne sais pas si tu te rends compte que tu ne testes JAMAIS si ta requête a aboutie ou non (execute() renvoie un booléen pour ceux qui lisent la doc), donc tu dis à ton interlocuteur que tout s'est bien passé sans même le savoir toi.

            Utilises les fonction correctement et tu verras où passe le code => OK ou KO.

            De plus, sur un INSERT/UPDATE/DELETE je te conseille de faire un rowCount() pour savoir combien de lignes ont été affectées.

            ++

            • Partager sur Facebook
            • Partager sur Twitter

            PDO script modification mot de passe.

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown