Erreurs dans mon code
Bonjour,
Voici mon code pour s'identifier sur mon site. "Se connecter" ne marche pas, ça me met toujours "invalid password", même si les informations que j'ai rentrées existent bien dans ma base de données et sont correctes. J'ai tout essayé (l'inscription marche très bien).
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"> <link rel="stylesheet" href="login.css"> <title>MIAMAP Login</title> </head> <body> <header> <nav> <button class="ret" onclick="window.location.href='home.php';">Retour</button> </nav> </header> <div class="container" id="container"> <div class="form-container sign-up"> <form method="POST"> <h1>S'inscrire</h1> <div class="social-icons"> <a href="#" class="icon"><i class="fa-brands fa-google-plus-g"></i></a> <a href="#" class="icon"><i class="fa-brands fa-facebook-f"></i></a> <a href="#" class="icon"><i class="fa-brands fa-github"></i></a> <a href="#" class="icon"><i class="fa-brands fa-linkedin-in"></i></a> </div> <span>utiliser votre email pour s'inscrire</span> <input type="text" name="username" placeholder="Nom d'utilisateur"> <input type="email" name="email" placeholder="Email"> <input type="password" name="password" placeholder="Mot de passe"> <button type="submit" name="register">S'inscrire</button> </form> </div> <div class="form-container sign-in"> <form method='POST'> <h1>Se connecter</h1> <div class="social-icons"> <a href="#" class="icon"><i class="fa-brands fa-google-plus-g"></i></a> <a href="#" class="icon"><i class="fa-brands fa-facebook-f"></i></a> <a href="#" class="icon"><i class="fa-brands fa-github"></i></a> <a href="#" class="icon"><i class="fa-brands fa-linkedin-in"></i></a> </div> <span>utiliser votre email pour vous connecter</span> <input type="email" name="email" placeholder="Email" required> <input type="password" name="password" placeholder="Mot de passe"> <a href="#">Mot de passe oublié?</a> <button type="submit" name="login">Se connecter</button> </form> </div> <div class="toggle-container"> <div class="toggle"> <div class="toggle-panel toggle-left"> <h1>Heureux de vous revoir !</h1> <p>Entrez vos informations personnelles pour utiliser toutes les fonctionnalités du site.</p> <button class="hidden" id="login">Se connecter</button> </div> <div class="toggle-panel toggle-right"> <h1>Bienvenue !</h1> <p>Entrez vos informations personnelles pour utiliser toutes les fonctionnalités du site.</p> <button class="hidden" id="register">S'inscrire</button> </div> </div> </div> </div> <script src="login.js"></script> <?php session_start(); error_reporting(E_ALL); ini_set('display_errors', 1); // Connexion à la base de données $connexion = mysqli_connect("localhost", "root", "", "miamap"); if (!$connexion) { die("Erreur de connexion à la base de données : " . mysqli_connect_error()); } // Inscription if (isset($_POST['register'])) { $username = trim($_POST['username']); $email = trim($_POST['email']); $password = trim($_POST['password']); if (!empty($username) && !empty($email) && !empty($password)) { $hashed_password = password_hash($password, PASSWORD_BCRYPT); $stmt = $connexion->prepare("INSERT INTO user (username, email, password) VALUES (?, ?, ?)"); if (!$stmt) { die("Erreur de préparation : " . $connexion->error); } $stmt->bind_param("sss", $username, $email, $hashed_password); if ($stmt->execute()) { $_SESSION['username'] = $username; $_SESSION['loggedin'] = true; header("Location: home.php"); exit(); } else { die("Erreur SQL : " . $stmt->error); } $stmt->close(); } else { echo "Attention !\nTous les champs sont obligatoires !"; } } // Login if (isset($_POST['login'])) { $email = trim($_POST['email']); $password = trim($_POST['password']); // Using backticks for password column in case it's a reserved word $stmt = $connexion->prepare("SELECT username, `password` FROM user WHERE email = ?"); if (!$stmt) { echo "<script>alert('Prepare failed: " . addslashes($connexion->error) . "');</script>"; die(); } $stmt->bind_param("s", $email); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { $stmt->bind_result($username, $hashed_password); $stmt->fetch(); if (password_verify($password, $hashed_password)) { $_SESSION['username'] = $username; // Store client session $_SESSION['email'] = $email; header("Location: home.php"); // Redirect to home page exit(); } else { echo "<script>alert('Invalid password.');window.location.href='miamaplogin.php';</script>"; } } else { echo "<script>alert('No user found with this email.');window.location.href='miamaplogin.php'</script>"; } $stmt->close(); } // Fermer la connexion $connexion->close(); ?> </body> </html>
- Renvoi d'appel mobilis
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
2 réponses
Bonjour,
Déjà, pense à placer le maximum de ton code php en dehors du html ( en le mettant au début du script par exemple)
Ensuite, place le code de connexion à ta bdd dans un fichier à part que tu n'auras ensuite qu'à inclure dans les pages où tu en auras besoin.
Et enfin, ajoute un peu de débug dans ton code pour voir ce que contient les variables ( en utilisant des var_dump par exemple)
Ce qui donne :
Donc, pour le fichier de connexion ( bdd.php )
<?php // Fichier bdd.php $connexion = new mysqli("localhost","root","","miamap"); // Check connection if ($connexion -> connect_errno) { echo "Erreur de connexion à la base de données: " . $connexion -> connect_error; exit(); } ?>
Puis ton formulaire devient :
<?php session_start(); error_reporting(E_ALL); ini_set('display_errors', 1); // Connexion à la base de données /* $connexion = mysqli_connect("localhost", "root", "", "miamap"); if (!$connexion) { die("Erreur de connexion à la base de données : " . mysqli_connect_error()); } */ // On charge le fichier de connexion à la BDD require_once "bdd.php"; // Inscription if (isset($_POST['register'])) { $username = trim($_POST['username']); $email = trim($_POST['email']); $password = trim($_POST['password']); if (!empty($username) && !empty($email) && !empty($password)) { $hashed_password = password_hash($password, PASSWORD_BCRYPT); $stmt = $connexion->prepare("INSERT INTO user (username, email, password) VALUES (?, ?, ?)"); if (!$stmt) { die("Erreur de préparation : " . $connexion->error); } $stmt->bind_param("sss", $username, $email, $hashed_password); if ($stmt->execute()) { $_SESSION['username'] = $username; $_SESSION['loggedin'] = true; header("Location: home.php"); exit(); } else { die("Erreur SQL : " . $stmt->error); } $stmt->close(); } else { echo "Attention !\nTous les champs sont obligatoires !"; } } // Login if (isset($_POST['login'])) { $email = trim($_POST['email']); $password = trim($_POST['password']); //DEBUG var_dump(['EMAIL'=>$email,'PASSWORD'=>$password,'POST'=>$_POST]); // Using backticks for password column in case it's a reserved word $stmt = $connexion->prepare("SELECT username, `password` FROM user WHERE email = ? "); if (!$stmt) { echo "<script>alert('Prepare failed: " . addslashes($connexion->error) . "');</script>"; die(); } $stmt->bind_param("s", $email); $stmt->execute(); $stmt->store_result(); $nbResults = $stmt->num_rows; if ( $nbResults > 1) { echo "Erreur !!! Il y a plusieurs utilisateurs avec la même adresse mail !!"; exit; } if ( $nbResults > 0) { $stmt->bind_result($username, $hashed_password); $stmt->fetch(); //DEBUG var_dump(['username'=>$username, 'hashed_password'=>$hashed_password]); if (password_verify($password, $hashed_password)) { $_SESSION['username'] = $username; // Store client session $_SESSION['email'] = $email; header("Location: home.php"); // Redirect to home page exit(); } else { echo "<script>alert('Invalid password.');window.location.href='miamaplogin.php';</script>"; exit; } } else { echo "<script>alert('No user found with this email.');window.location.href='miamaplogin.php'</script>"; exit; } $stmt->close(); } // Fermer la connexion $connexion->close(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"> <link rel="stylesheet" href="login.css"> <title>MIAMAP Login</title> </head> <body> <header> <nav> <button class="ret" onclick="window.location.href='home.php';">Retour</button> </nav> </header> <div class="container" id="container"> <div class="form-container sign-up"> <form method="POST"> <h1>S'inscrire</h1> <div class="social-icons"> <a href="#" class="icon"><i class="fa-brands fa-google-plus-g"></i></a> <a href="#" class="icon"><i class="fa-brands fa-facebook-f"></i></a> <a href="#" class="icon"><i class="fa-brands fa-github"></i></a> <a href="#" class="icon"><i class="fa-brands fa-linkedin-in"></i></a> </div> <span>utiliser votre email pour s'inscrire</span> <input type="text" name="username" placeholder="Nom d'utilisateur"> <input type="email" name="email" placeholder="Email"> <input type="password" name="password" placeholder="Mot de passe"> <button type="submit" name="register">S'inscrire</button> </form> </div> <div class="form-container sign-in"> <form method='POST'> <h1>Se connecter</h1> <div class="social-icons"> <a href="#" class="icon"><i class="fa-brands fa-google-plus-g"></i></a> <a href="#" class="icon"><i class="fa-brands fa-facebook-f"></i></a> <a href="#" class="icon"><i class="fa-brands fa-github"></i></a> <a href="#" class="icon"><i class="fa-brands fa-linkedin-in"></i></a> </div> <span>utilisez votre email pour vous connecter</span> <input type="email" name="email" placeholder="Email" required> <input type="password" name="password" placeholder="Mot de passe"> <a href="#">Mot de passe oublié?</a> <button type="submit" name="login">Se connecter</button> </form> </div> <div class="toggle-container"> <div class="toggle"> <div class="toggle-panel toggle-left"> <h1>Heureux de vous revoir !</h1> <p>Entrez vos informations personnelles pour utiliser toutes les fonctionnalités du site.</p> <button class="hidden" id="login">Se connecter</button> </div> <div class="toggle-panel toggle-right"> <h1>Bienvenue !</h1> <p>Entrez vos informations personnelles pour utiliser toutes les fonctionnalités du site.</p> <button class="hidden" id="register">S'inscrire</button> </div> </div> </div> </div> <script src="login.js"></script> </body> </html>
Bonjour,
Je ne vois pas d'erreur flagrante.
Outre les conseils qui t'ont déjà été donnés, essaye toujours de travailler sur un exemple minimal (tu peux sauver ton fichier et supprimer tout ce qui ne sert "à rien" pour reproduire le bug) afin d'avoir moins d'endroits où chercher et avoir un message plus concis, plus clair, et plus facile à reproduire.
Autre approche, tu peux aussi repartir de l'exemple donné password_verify et y déverser petit à petit ton code.
Sinon dernière approche, regarder ce que valent les variables incriminées dans le test qui ne se passe pas comme prévu :
if (password_verify($password, $hashed_password)) {
En effet, tout dépend de que contient $_POST["password"], donc tu devrais ajouter quelques echo pour si ces variables contiennent bien ce qu'il faut.
var_dump($password, $hashed_password); if (password_verify($password, $hashed_password)) {
Si les deux variables semblent correctement initialisées, tu peux également corriger $password en lui assignant juste avant ce test le mot de passe que tu penses être le bon.
Sur le même principe tu devrais vérifier si cette ligne fait ce que tu crois :
$hashed_password = password_hash($password, PASSWORD_BCRYPT);
.. avec :
$hashed_password = password_hash($password, PASSWORD_BCRYPT); var_dump($password, $hashed_password); sleep(5);
Ainsi tu détermineras si c'est $password qui est mal initialisée où si c'est $hashed_password (e.g. parce que tu n'as pas récupéré le bon hash, ou que celui-ci a été mal créé, voir cet exemple).
Bonne chance