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é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.
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é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.
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.
× 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.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales