Page 1 sur 1

Erreur lecture écrite base de données

Posté : 21 mars 2019, 10:48
par Paurek
Bonjour, voila tout fonctionnait hier cependant aujourd'hui plus rien ne fonctionne et rien n'a été modifié. Je n'arrive plus à écrire sur ma base de données quand un utilisateur s'inscrit et je n'arrive pas non plus à vérifier le mot de passe quand il se connecte.

Je vous fournit le code de la page login et register ainsi que la structure de la bdd, merci.

Fonction pour login:

Code : Tout sélectionner

<?php session_start(); // Info de co. $DATABASE_HOST = 'localhost'; $DATABASE_USER = 'root'; $DATABASE_PASS = '****'; $DATABASE_NAME = 'espace_membre'; // Connection à la base $con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME); if ( mysqli_connect_errno() ) { // En cas d'erreur die ('Erreur connexion BDD: ' . mysqli_connect_error()); } // Voir si les données sont bien reçus if ( !isset($_POST['username'], $_POST['password']) ) { // Données non reçus die ('Veuillez remplir le champ nom utilisateur et mot de passe !'); } // Préparation de la bdd if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) { $stmt->bind_param('s', $_POST['username']); $stmt->execute(); // Stocker le résultat $stmt->store_result(); if ($stmt->num_rows > 0) { $stmt->bind_result($id, $password); $stmt->fetch(); // Vérifier le mot de passe if (password_verify($_POST['password'], $password)) { // Connection de l'utilisateur // Créer la session session_regenerate_id(); $_SESSION['loggedin'] = TRUE; $_SESSION['name'] = $_POST['username']; $_SESSION['id'] = $id; header('Location: home.php'); } else { echo 'Mot de passe incorrect !'; } } else { echo 'Nom utilisateur incorrect !'; } $stmt->close(); }
Page register:

Code : Tout sélectionner

<?php //connexion à la base de données: $BDD = array(); $BDD['host'] = "localhost"; $BDD['user'] = "root"; $BDD['pass'] = "****"; $BDD['db'] = "espace_membre"; $mysqli = mysqli_connect($BDD['host'], $BDD['user'], $BDD['pass'], $BDD['db']); if(!$mysqli) { echo "Connexion non établie."; exit; } //par défaut, on affiche le formulaire (quand il validera le formulaire sans erreur avec l'inscription validée, on l'affichera plus) $AfficherFormulaire=1; //traitement du formulaire: if(isset($_POST['username'],$_POST['password'])){//l'utilisateur à cliqué sur "S'inscrire", on demande donc si les champs sont défini avec "isset" if(empty($_POST['username'])){//le champ username est vide, on arrête l'exécution du script et on affiche un message d'erreur echo "Le champ username est vide."; } elseif(!preg_match("#^[a-zA-Z0-9]+$#",$_POST['username'])){//le champ username est renseigné mais ne convient pas au format qu'on souhaite qu'il soit, soit: que des lettres minuscule + des chiffres (je préfère personnellement enregistrer le username de mes accounts en minuscule afin de ne pas avoir deux username identique mais différents comme par exemple: Admin et admin) echo "Le username doit être renseigné en lettres minuscules sans accents, sans caractères spéciaux."; } elseif(strlen($_POST['username'])>25){//le username est trop long, il dépasse 25 caractères echo "Le username est trop long, il dépasse 25 caractères."; } elseif(empty($_POST['password'])){//le champ mot de passe est vide echo "Le champ Mot de passe est vide."; } elseif(empty($_POST['email'])){//le champ mot de passe est vide echo "Le champ Email est vide."; } elseif(empty($_POST['poids'])){//le champ mot de passe est vide echo "Le champ Poids est vide."; } elseif(mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM accounts WHERE username='".$_POST['username']."'"))==1){//on vérifie que ce username n'est pas déjà utilisé par un autre membre echo "Ce username est déjà utilisé."; } elseif(!preg_match("#^[0-9]+$#",$_POST['poids'])){ echo "Le champ poids doit être uniquement en chiffres."; } else { //toutes les vérifications sont faites, on passe à l'enregistrement dans la base de données: //Bien évidement il s'agit là d'un script simplifié au maximum, libre à vous de rajouter des conditions avant l'enregistrement comme la longueur minimum du mot de passe par exemple if(!mysqli_query($mysqli,"INSERT INTO accounts SET username='".$_POST['username']."', password='".md5($_POST['password'])."', email='".$_POST['email']."', poids='".$_POST['poids']."'")){//on crypte le mot de passe avec la fonction propre à PHP: md5() echo "Une erreur s'est produite: ".mysqli_error($mysqli); } else { echo "Vous êtes inscrit avec succès!"; //on n'affiche plus le formulaire $AfficherFormulaire=0; } } } if($AfficherFormulaire==1){ ?> <head> <link href="register.css" rel="stylesheet" type="text/css"> <meta charset="utf-8"> <title>Inscription - Performance Saut</title> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"> </head> <body> <div class="register"> <form method="post" action="register.php"> <div class="center-text-h-v"> <input type="text" name="username" placeholder="Nom d'utilisateur" required> <input type="password" name="password" placeholder="Mot de passe" required><br> <input type="text" name="email" placeholder="Email" required> <input type="text" name="poids" placeholder="Poids (en KG)" required> </form> <form action="/panel_inscription/home.php" method="get"> <input type="submit" value="S'inscrire"> </form> </div> </body> <?php }
Structure bdd:
Image

Merci à vous pour votre aide.

Re: Erreur lecture écrite base de données

Posté : 21 mars 2019, 18:50
par @rthur
Bonjour,

Il faut que tu avances davantage dans ton debugage, à quel moment ton script ne se comporte pas comme prévu ?
Vérifie avec var_dump() tout au long de ton script le contenu des variables.

Re: Erreur lecture écrite base de données

Posté : 22 mars 2019, 09:11
par Paurek
Seul la variable username retourne un résultat NULL lorsqu’on clique sur connexion.

Re: Erreur lecture écrite base de données

Posté : 22 mars 2019, 12:25
par @rthur
Seul la variable username retourne un résultat NULL lorsqu’on clique sur connexion.
Celle que tu reçois en $_POST ?
Tu peux faire un var_dump($_POST) pour voir toutes les variables renvoyées par ton formulaire.

Re: Erreur lecture écrite base de données

Posté : 22 mars 2019, 12:49
par Paurek
En faisant un var_dump($_POST); il m'indique le nom d'utilisateur et le mot de passe que j'utilise pour me connecté et ils sont correct.

Je ne comprend vraiment pas pourquoi la connexion ne s'effectue pas, merci pour ta réponse.

Re: Erreur lecture écrite base de données

Posté : 22 mars 2019, 13:08
par @rthur
Donc $_POST['username'] n'est pas vide ?
Il faut que tu cherches à quel moment dans ton code ça ne se comporte pas comme prévu.
Affiche tes variables, affiche ta requête SQL et teste là dans phpmyadmin ce n'est que comme ça que tu verras où ça coince

Re: Erreur lecture écrite base de données

Posté : 25 mars 2019, 14:59
par Paurek
Je pense que le problème viens de la ligne 22 du authenticate car je mets un ? au lieu de la valeur username que l'utilisateur à entrer.
Mais comment corriger cela ? Merci.

Re: Erreur lecture écrite base de données

Posté : 25 mars 2019, 15:13
par @rthur
Je pense que le problème viens de la ligne 22 du authenticate car je mets un ? au lieu de la valeur username que l'utilisateur à entrer.
A priori tu fais un bind_param() juste derrière pour remplacer le point interrogation par le nom d'utilisateur, donc ça devrait être bon

Re: Erreur lecture écrite base de données

Posté : 25 mars 2019, 15:16
par Paurek
Toujours le même problème, en exécutant la demande directement depuis phpmyadmin il me retourne bien l'id et le password du username concerné.

Re: Erreur lecture écrite base de données

Posté : 26 mars 2019, 14:39
par Paurek
Pas moyen de trouver le problème, je pense même à recommencer

Re: Erreur lecture écrite base de données

Posté : 26 mars 2019, 15:08
par Spols
vérifie chaque variable et controlant sa valeur.

si rien ne s'affiche, probablement que $stmt->num_rows > 0 retourne false je vérifierai cela en premier

Re: Erreur lecture écrite base de données

Posté : 26 mars 2019, 15:11
par Paurek
Quand j'affiche la variable stmt j'obtiens:

object(mysqli_stmt)[2]
public 'affected_rows' => int 1
public 'insert_id' => int 0
public 'num_rows' => int 1
public 'param_count' => int 1
public 'field_count' => int 2
public 'errno' => int 0
public 'error' => string '' (length=0)
public 'error_list' =>
array (size=0)
empty
public 'sqlstate' => string '00000' (length=5)
public 'id' => int 1

Re: Erreur lecture écrite base de données

Posté : 26 mars 2019, 16:54
par Spols
$id et $password contienent aussi ce qu'il faut ?