A voir également:
- Aide PHP/HTML
- Editeur html - Télécharger - HTML
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Espace html ✓ - Forum HTML
- [**] Balise pour un espace vide en hml. Merci ✓ - Forum Webmastering
6 réponses
Tu devrais utiliser empty plutot que isset je la trouve mieux comme fonction car, elle vérifie aussi si la variable existe MAIS aussi si elle est vide.
Ensuite, tu devrais sécurisé tes $_POST.
Passons à ton code :
ce code
Peux être amélioré comme suit :
Alors pour la partie qui pose problème :
Le souci c'est que dans ta requête tu ne fait aucun comptage de resultat dans ta table il faut que tu utilise la fonction COUNT afin de compter le nombre d'entrée sinon la variable sera toujours invalide.
Essaye d'utiliser des nom de variable différent en fonction de ce que ta requête effectue comme action se sera plus clair .
Essaye de faire toutes ces modifs et reviens vers nous si ton problème persiste ;)
David..
EDIT : oups, j'ai oublié de corriger correctement les empty, désolé.
Ensuite, tu devrais sécurisé tes $_POST.
Passons à ton code :
ce code
if(($login=="")||($mdp1=="")||($mdp2==""))
Peux être amélioré comme suit :
if(empty($login) || empty($mdp1) || empty($mdp2))
Alors pour la partie qui pose problème :
$resultat=mysqli_query($lien,"SELECT * FROM utilisateurs WHERE login='".$login."'"); if(mysqli_num_rows($resultat)!=0)
Le souci c'est que dans ta requête tu ne fait aucun comptage de resultat dans ta table il faut que tu utilise la fonction COUNT afin de compter le nombre d'entrée sinon la variable sera toujours invalide.
Essaye d'utiliser des nom de variable différent en fonction de ce que ta requête effectue comme action se sera plus clair .
Essaye de faire toutes ces modifs et reviens vers nous si ton problème persiste ;)
David..
EDIT : oups, j'ai oublié de corriger correctement les empty, désolé.
Il y aurait plusieurs choses à redire sur ton code...
A commencer par la vérification que mysqli_query n'a pas retourné d'erreur .. et le fait qu'on n'utilise plus le SHA pour "crypter" les mots de passe...
En gros, ton code devrait à minima ressembler à un truc du genre
EDIT : Correction parenthèse en trop ligne 14
A commencer par la vérification que mysqli_query n'a pas retourné d'erreur .. et le fait qu'on n'utilise plus le SHA pour "crypter" les mots de passe...
En gros, ton code devrait à minima ressembler à un truc du genre
<?php //démarrage des sessions session_start(); //Affichage des erreurs PHP error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); //connexion à la bdd if (! $lien = mysqli_connect("localhost", "root", "", "projet")) { echo "Erreur : " . mysqli_connect_error(); exit; } /** * Recherche un user via son login */ function getUserByLogin($login){ global $lien; $sql = "SELECT * FROM utilisateurs WHERE login='".$login."'"; $resultat=mysqli_query($lien,$sql); if(!$resultat){ echo "Error : " . mysqli_error($lien); exit; } return $resultat; } /** * Insertion du user en BDD * par contre, le SHA1 n'est plus utilisé .. à la place je t'invite à te pencher sur la fonction php : password_hash() */ function addUser($login,$mdp){ global $lien; $sql = "INSERT INTO utilisateurs (login,mdp) VALUES ('".$login."',".SHA1($mdp)."')"; $resultat=mysqli_query($lien,$sql); if(!$resultat){ echo "Error : " . mysqli_error($lien); exit; } return $resultat; } //récupération PROPRE des variables AVANT de les utiliser // pour ça, j'utilise l'écriture TERNAIRE ( sorte de IF/ELSE) et vérifie que la variable existe et n'est pas vide // via la fonction empty // j'utilise aussi la fonction TRIM pour supprimer les espaces superflus éventuels.. $insc = !empty($_POST['insc']) ? $_POST['insc'] : NULL; $login = !empty($_POST['login']) ? trim($_POST['login']) : NULL; $mdp = !empty($_POST['mdp']) ? trim($_POST['mdp']) : NULL; $mdp2 = !empty($_POST['mdp2']) ? trim($_POST['mdp2']) : NULL; // Ceci est un fichier qui ne génère pas d'affichage // Est-on passé par l'inscription ? if(!$insc ) { // non, on retourne à l'index header("location:index.php"); exit; } // OK, on vérifie la présence des infos if( !$login || !$mdp || !$mdp2 ) { // Soucis dans la transmission, on renvoie $erreur="Une donnée n'a pas été saisie."; header("location:inscription.php?erreur=".$erreur); exit; } if($mdp1 != $mdp2) { $erreur="Mots de passe différents."; header("location:inscription.php?erreur=".$erreur); exit; } // Vérification de la présence de caractères non désirés if(($login!=strip_tags($login))||($mdp1!=strip_tags($mdp1))) { $erreur="Caractères non autorisés dans le login ou le mot de passe."; header("location:inscription.php?erreur=".$erreur); exit; } // Le login est-il déjà pris ? $resultat = getUserByLogin($login); if(mysqli_num_rows($resultat)!=0) { // Le login est déjà pris ! $erreur="Login%20déjà%20utilisé"; header("location:inscription.php?erreur=".$erreur); exit; } else { if($resultat = addUser($login,$mdp) ) { // Enregistrement OK, on cherche l'id et on crée une session $new_id = mysqli_insert_id($lien); $_SESSION['id'] = $id; // Retour à la page de jeu header("location:jeu.php"); exit; } else { // Problème d'enregistrement $erreur="Problème d'enregistrement"; header("location:inscription.php?erreur=".$erreur); exit; } }
EDIT : Correction parenthèse en trop ligne 14
Bonjour,
Je pense que tu travaille en local donc je suppose que tu n'a pas de nom d'utilisateur personnalisé ni de mot de passe donc au lieu de :
essaye plutôt ça :
Ensuite, est-tu sûr que ta variable $login contient bien quelque chose ?
Tu peux retirer les %20 de ta variable $erreur.
Mais utilise les balises <code> pour mettre ton code ici.
Et se serais mieux si tu pouvais fournir ton code complet car, compliqué vue qu'il manque des informations comme le contenu de la variable $login par exemple.
Ah oui et aussi, tu fait une redirection header() alors fait bien attention à ce qu'il n'y ai aucun code html ni d'espace ni de saut de ligne avant.
Je pense que tu travaille en local donc je suppose que tu n'a pas de nom d'utilisateur personnalisé ni de mot de passe donc au lieu de :
if($lien=mysqli_connect("localhost", "test", "test", "projet"))
essaye plutôt ça :
if($lien=mysqli_connect("localhost", "root", "", "projet"))
Ensuite, est-tu sûr que ta variable $login contient bien quelque chose ?
Tu peux retirer les %20 de ta variable $erreur.
Mais utilise les balises <code> pour mettre ton code ici.
Et se serais mieux si tu pouvais fournir ton code complet car, compliqué vue qu'il manque des informations comme le contenu de la variable $login par exemple.
Ah oui et aussi, tu fait une redirection header() alors fait bien attention à ce qu'il n'y ai aucun code html ni d'espace ni de saut de ligne avant.
Merci de cette réponse rapide,
voici mon code
j'ai modifié la ligne mais pas le header.
voici mon code
<?php
session_start();
// Ceci est un fichier qui ne génère pas d'affichage
// Est-on passé par l'inscription ?
if(!isset($_POST['insc']))
{
// non, on retourne à l'index
header("location:index.php");
}
// OK, on vérifie la présence des infos
if((!isset($_POST['login']))||(!isset($_POST['mdp']))||(!isset($_POST['mdp2'])))
{
// Soucis dans la transmission, on renvoie
$erreur="Problème de transmission.";
header("location:inscription.php?erreur=".$erreur);
}
// Tout est là, on vérifie maintenant que les chaînes sont correctes
$login=$_POST['login'];
$mdp1=$_POST['mdp'];
$mdp2=$_POST['mdp2'];
if(($login=="")||($mdp1=="")||($mdp2==""))
{
$erreur="Une donnée n'a pas été saisie.";
header("location:inscription.php?erreur=".$erreur);
}
if($mdp1!=$mdp2)
{
$erreur="Mots de passe différents.";
header("location:inscription.php?erreur=".$erreur);
}
// Vérification de la présence de caractères non désirés
if(($login!=strip_tags($login))||($mdp1!=strip_tags($mdp1)))
{
$erreur="Caractères non autorisés dans le login ou le mot de passe.";
header("location:inscription.php?erreur=".$erreur);
}
// Tout est OK, on peut enregistrer !
if($lien=mysqli_connect("localhost", "root", "", "projet")) {
// Le login est-il déjà pris ?
$resultat=mysqli_query($lien,"SELECT * FROM utilisateurs WHERE login='".$login."'");
if(mysqli_num_rows($resultat)!=0)
{
// Le login est déjà pris !
$erreur="Login%20déjà%20utilisé";
header("location:inscription.php?erreur=".$erreur);
}
else
{
if($resultat=mysqli_query($lien,"INSERT INTO utilisateurs (login,mdp) VALUES ('".$login."',SHA1('".$mdp1."'))"))
{
// Enregistrement OK, on cherche l'id et on crée une session
$resultat=mysqli_query($lien,"SELECT * FROM utilisateurs WHERE login='".$login."'");
$ligne=mysqli_fetch_array($resultat);
echo "SELECT * INTO utilisateurs WHERE login='".$login."'";
echo $ligne['id'];
$_SESSION['id']=$ligne['id'];
// Retour à la page de jeu
header("location:jeu.php");
}
else
{
// Problème d'enregistrement
$erreur="Problème d'enregistrement";
header("location:inscription.php?erreur=".$erreur);
}
}
}
else
{
// Erreur de connexion à la base !
$erreur="Connexion%20impossible%20à%20la%20base";
header("location:inscription.php?erreur=".$erreur);
}
j'ai modifié la ligne mais pas le header.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
merci de vos réponses.
je souhaite attendre un peu d'attendre de bien connaître le php avant de me mettre au cryptage de mot de passe.
j'ai essayé avec votre code jordane45, et j'ai d'abord eu une erreur me disant que y'avait une ) en trop ligne 12 que j'ai corrigé en supprimant et ensuite quand j'entre un mot de passe dans l'inscription, cela me dit mot de passe incorrect.
merci de vos réponses.
je souhaite attendre un peu d'attendre de bien connaître le php avant de me mettre au cryptage de mot de passe.
j'ai essayé avec votre code jordane45, et j'ai d'abord eu une erreur me disant que y'avait une ) en trop ligne 12 que j'ai corrigé en supprimant et ensuite quand j'entre un mot de passe dans l'inscription, cela me dit mot de passe incorrect.
Voici le message:

je pense que c'est dû à cette partie:

je pense que c'est dû à cette partie:
if($mdp1 = $mdp2) {
$erreur="Mots de passe différents.";
header("location:inscription.php?erreur=".$erreur);
exit;
}
Salut comment traduiriez vous en français ce bloc de code?
L' opérateur de comparaison est faux au passage, pour une égalité il faut utiliser le symbole "=="(ou " ===" pour une égalité stricte) et non "="(qui est un symbole d'attribution de variable, exemple $a='ma variable' va créer la variable $a avec pour contenu le texte 'ma variable')
mais dans tous les cas ça semble plutôt faire le contraire de ce qui serait logique:
Si le mot de passe et sa confirmation sont égaux alors indiquer une erreur.
Rien ne vous choque, quel est le but de la vérification? et comment le programme doit utiliser la confirmation du mot de passe(dernière ligne qui doit correspondre à la variable $mdp2 si $mdp1 provient du second champ de formulaire ou inversement si c'est codé avec les pieds)
C'est plutôt l'inverse qui devrait indiquer une erreur:
Si le mot de passe et sa confirmation sont différents alors c'est une erreur.
Ici la liste des opérateurs de comparaison en PHP:
https://www.php.net/manual/fr/language.operators.comparison.php
Au passage je ne sais pas où vous avez récupéré ce PHP où les exercices mais ça semble pas vraiment terrible, par exemple mysqli_query est à proscrire pour utiliser PDO(notation objet)
L' opérateur de comparaison est faux au passage, pour une égalité il faut utiliser le symbole "=="(ou " ===" pour une égalité stricte) et non "="(qui est un symbole d'attribution de variable, exemple $a='ma variable' va créer la variable $a avec pour contenu le texte 'ma variable')
mais dans tous les cas ça semble plutôt faire le contraire de ce qui serait logique:
Si le mot de passe et sa confirmation sont égaux alors indiquer une erreur.
Rien ne vous choque, quel est le but de la vérification? et comment le programme doit utiliser la confirmation du mot de passe(dernière ligne qui doit correspondre à la variable $mdp2 si $mdp1 provient du second champ de formulaire ou inversement si c'est codé avec les pieds)
C'est plutôt l'inverse qui devrait indiquer une erreur:
Si le mot de passe et sa confirmation sont différents alors c'est une erreur.
Ici la liste des opérateurs de comparaison en PHP:
https://www.php.net/manual/fr/language.operators.comparison.php
Au passage je ne sais pas où vous avez récupéré ce PHP où les exercices mais ça semble pas vraiment terrible, par exemple mysqli_query est à proscrire pour utiliser PDO(notation objet)
À corriger par
Aucun intérêt..