Besoin d une correction pour la page d inscription
53pierre Messages postés 34 Statut Membre -
n'étant pas un spécialiste de php
j'essaye de me débrouiller
que pensez vous de ma page d'inscription
pouvez vous me dire ce que je dois modifier merci
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="NoS1gnal"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>Connexion</title>
</head>
<body>
<div class="login-form">
<?php
if(isset($_GET['reg_err']))
{
$err = htmlspecialchars($_GET['reg_err']);
switch($err)
{
case 'success':
?>
<div class="alert alert-success">
<strong>Succès</strong> inscription réussie !
</div>
<?php
break;
case 'password':
?>
<div class="alert alert-danger">
<strong>Erreur</strong> mot de passe différent
</div>
<?php
break;
case 'email':
?>
<div class="alert alert-danger">
<strong>Erreur</strong> email non valide
</div>
<?php
break;
case 'email_length':
?>
<div class="alert alert-danger">
<strong>Erreur</strong> email trop long
</div>
<?php
break;
case 'pseudo_length':
?>
<div class="alert alert-danger">
<strong>Erreur</strong> pseudo trop long
</div>
<?php
case 'already':
?>
<div class="alert alert-danger">
<strong>Erreur</strong> compte deja existant
</div>
<?php
}
}
?>
<form action="inscription_traitement.php" method="post">
<h2 class="text-center">Inscription</h2>
<div class="form-group">
<input type="text" name="pseudo" class="form-control" placeholder="Pseudo" required="required" autocomplete="off">
</div>
<div class="form-group">
<input type="email" name="email" class="form-control" placeholder="Email" required="required" autocomplete="off">
</div>
<div class="form-group">
<input type="password" name="password" class="form-control" placeholder="Mot de passe" required="required" autocomplete="off">
</div>
<div class="form-group">
<input type="password" name="password_retype" class="form-control" placeholder="Re-tapez le mot de passe" required="required" autocomplete="off">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block">Inscription</button>
</div>
</form>
</div>
<style>
.login-form {
width: 340px;
margin: 50px auto;
}
.login-form form {
margin-bottom: 15px;
background: #f7f7f7;
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
padding: 30px;
}
.login-form h2 {
margin: 0 0 15px;
}
.form-control, .btn {
min-height: 38px;
border-radius: 2px;
}
.btn {
font-size: 15px;
font-weight: bold;
}
</style>
</body>
</html>
la page de traitement
<?php
require_once 'config.php';
if(!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype']))
{
$pseudo = htmlspecialchars($_POST['pseudo']);
$email = htmlspecialchars($_POST['email']);
$password = htmlspecialchars($_POST['password']);
$password_retype = htmlspecialchars($_POST['password_retype']);
$check = $bdd->prepare('SELECT pseudo, email, password FROM utilisateurs WHERE email = ?');
$check->execute(array($email));
$data = $check->fetch();
$row = $check->rowCount();
if($row == 0){
if(strlen($pseudo) <= 100){
if(strlen($email) <= 100){
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
if($password == $password_retype){
$cost = ['cost' => 12];
$password = password_hash($password, PASSWORD_BCRYPT, $cost);
$ip = $_SERVER['REMOTE_ADDR'];
$insert = $bdd->prepare('INSERT INTO utilisateurs(pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)');
$insert->execute(array(
'pseudo' => $pseudo,
'email' => $email,
'password' => $password,
'ip' => $ip,
'token' => bin2hex(openssl_random_pseudo_bytes(24))
));
header('Location:inscription.php?reg_err=success');
die();
}else{ header('Location: inscription.php?reg_err=password'); die();}
}else{ header('Location: inscription.php?reg_err=email'); die();}
}else{ header('Location: inscription.php?reg_err=email_length'); die();}
}else{ header('Location: inscription.php?reg_err=pseudo_length'); die();}
}else{ header('Location: inscription.php?reg_err=already'); die();}
}
23 réponses
- 1
- 2
Le sujet porte sur une page d'inscription en PHP et les vérifications côté serveur, notamment la validation d'email, le contrôle des longueurs et le hachage sécurisé du mot de passe. Des conseils portent sur l'activation des erreurs PDO et l'encadrement des requêtes dans des blocs try/catch, ainsi que sur le respect des longueurs et la comparaison des mots de passe. Plusieurs échanges soulignent des erreurs de logique, comme des conditions mal parenthésées, et insistent sur la sécurité globale, notamment l'usage prudent des cookies et la prévention des injections SQL. Enfin, une proposition évoque une approche sécurisée pour le mot de passe oublié via token et lien de réinitialisation, complétant les discussions sur l'inscription et la gestion des comptes.
-
Bonjour,
Tu sembles utiliser PDO .. donc
- Commence par appliquer ceci : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
- L'instruction rowCount, en PDO, ne doit jamais s'utiliser sur une requête SELECT...
A la place, fait un FETCHALL du résultat de ta requête et un COUNT dessus.
- L'instruction htmlspecialchars ne doit jamais s'utiliser pour l'insertion des données en BDD.. elle ne doit servir que pour l'affichage des données sur une page .
Et pour finir, je t'invite à appliquer également les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
.
-
bonjour
Merci pour la réponse
donc je dois insérer le code pour les erreurs dans mon fichier confi.sys
puisque la connexion a ma base ce trouve dans ce fichier -
merci pour les renseignements de cette facon alors
try{ $check = $bdd->prepare('SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'); // Activation des erreurs PDO $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch(PDOException $e) { die('Erreur : ' . $e->getMessage()); }-
Relis bien le contenu du lien que je t'ai donné.
d'une part tu dois activer les erreurs PDO dans la connexion à ta base de données.
Et d'autre part tu dois exécuter des requêtes chacune dans un bloc try catch
Si tu regardes les exemples de code qui se trouve dans le lien tu verras que ce que tu as écrit n'est pas la même chose...
-
-
merci pour le rappel
donc si je reprends l exemple
c est comme ceci
//Execution de la requete try{ //Execution de la requete try{ $check = $bdd->prepare('SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'); $check->execute(array($email)); $data = $check->fetch(); $row = $check->rowCount(); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " email : " ; print_r($email); }-
Toujours pas....
Essaye ça$sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try{ $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $check->fetch(); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " datas : " ; print_r($datas); }
A noter que le ROWCOUNT ne s'utilise PAS sur une requête SELECT !
En plus, vu que tu ne cherches à récupérer qu'une seule ligne.. ça serait, de toutes façons, inutile.
Si tu veux juste vérifier si ta requête a retournée un résultat, il suffit de regarder si $row n'est pas videif(!empty($row)){ // ici.. $row contient les données issues de ta requête }else{ // ici.. ben.. ta requête n'a rien retourné }
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Merci pour la solution , je vais essayer le tout par la suite
je tente la deuxième requete-
Visiblement... tu vois presque bien... mais pas tout à fait ...
// la requête SQL a executer : $sql = 'INSERT INTO utilisateurs (pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'; //les données qu'il faut passer en paramètres de la requêtes $datas = array( 'pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24)) ); // L'exécution de la requete DANS un try/catch try{ $prep = $bdd->prepare($sql); $prep->execute($datas); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " Les paramètres envoyés à la requete : " ; print_r($datas); }
J'espère qu'avec les commentaires ça sera plus clair ....
-
-
ouppsss
je venais juste de m apercevoir que j avais pas bon
j'ai été pris de court
j'étais en train de corriger
voici ce que je voulais poster
$sql = 'INSERT INTO utilisateurs(pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'; $datas = (array( 'pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24)) )); //Execution de la requete try{ $prep = $bdd -> prepare($sql) ; $prep->execute($datas) ; }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " Les datas : " ; print_r($datas); } -
et donc sauf erreur le code ressemble a ceci au final
<?php require_once 'config.php'; if (!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype'])) { $pseudo = ($_POST['pseudo']); $email = ($_POST['email']); $password = ($_POST['password']); $password_retype = ($_POST['password_retype']); $sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try { $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $check->fetch(); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " datas : "; print_r($datas); } if ($row == 0) { if (strlen($pseudo) <= 100) { if (strlen($email) <= 100) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { if ($password == $password_retype) { $cost = ['cost' => 12]; $password = password_hash($password, PASSWORD_BCRYPT, $cost); $ip = $_SERVER['REMOTE_ADDR']; // la requête SQL a executer : $sql = 'INSERT INTO utilisateurs (pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'; //les données qu'il faut passer en paramètres de la requêtes $datas = array('pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24))); // L'exécution de la requete DANS un try/catch try { $prep = $bdd->prepare($sql); $prep->execute($datas); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les paramètres envoyés à la requete : "; print_r($datas); } header('Location:inscription.php?reg_err=success'); die(); } else { header('Location: inscription.php?reg_err=password'); die(); } } else { header('Location: inscription.php?reg_err=email'); die(); } } else { header('Location: inscription.php?reg_err=email_length'); die(); } } else { header('Location: inscription.php?reg_err=pseudo_length'); die(); } } else { header('Location: inscription.php?reg_err=already'); die(); } } -
ah oui j'avais oublie cela
j'en aurais appris des choses ce jour
donc voici alors<?php require_once 'config.php'; if (!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype'])) { $pseudo = ($_POST['pseudo']); $email = ($_POST['email']); $password = ($_POST['password']); $password_retype = ($_POST['password_retype']); $sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try { $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $check->fetch(); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " datas : "; print_r($datas); } if(!empty($row)) { if (strlen($pseudo) <= 100) { if (strlen($email) <= 100) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { if ($password == $password_retype) { $cost = ['cost' => 12]; $password = password_hash($password, PASSWORD_BCRYPT, $cost); $ip = $_SERVER['REMOTE_ADDR']; // la requête SQL a executer : $sql = 'INSERT INTO utilisateurs (pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'; //les données qu'il faut passer en paramètres de la requêtes $datas = array('pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24))); // L'exécution de la requete DANS un try/catch try { $prep = $bdd->prepare($sql); $prep->execute($datas); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les paramètres envoyés à la requete : "; print_r($datas); } header('Location:inscription.php?reg_err=success'); die(); } else { header('Location: inscription.php?reg_err=password'); die(); } } else { header('Location: inscription.php?reg_err=email'); die(); } } else { header('Location: inscription.php?reg_err=email_length'); die(); } } else { header('Location: inscription.php?reg_err=pseudo_length'); die(); } } else { header('Location: inscription.php?reg_err=already'); die(); } } -
je viens d'essayer ce nouveau code
mais j'ai une erreur qui est retournée
lors de la finalisation de l'inscription
Cette page ne fonctionne pasImpossible de traiter cette demande via accessible-preparat.000webhostapp.com à l'heure actuelle.
HTTP ERROR 500 -
-
ah ben oui ...
merci encore une fois
tiens c'est bizarre il y a une erreur lorsque je rentre un nouvel utilisateur qui n'est pas encore inscrit
il me dit qu'il existe déjà
pourtant je ne vois pas ce qui cloche -
merci pour l'astuce
voila j'en ai mis deux de cette façon
mais rien ne s'affiche
<?php require_once 'config.php'; print_r( $row); if (!empty($_POST['pseudo']) && !empty($_POST['email']) && !empty($_POST['password']) && !empty($_POST['password_retype'])) { $pseudo = ($_POST['pseudo']); $email = ($_POST['email']); $password = ($_POST['password']); $password_retype = ($_POST['password_retype']); $sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try { $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $prep->fetch(); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " datas : "; print_r($datas); } print_r( $row); if(!empty($row)) { if (strlen($pseudo) <= 100) { if (strlen($email) <= 100) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { if ($password == $password_retype) { $cost = ['cost' => 12]; $password = password_hash($password, PASSWORD_BCRYPT, $cost); $ip = $_SERVER['REMOTE_ADDR']; // la requête SQL a executer : $sql = 'INSERT INTO utilisateurs (pseudo, email, password, ip, token) VALUES(:pseudo, :email, :password, :ip, :token)'; //les données qu'il faut passer en paramètres de la requêtes $datas = array('pseudo' => $pseudo, 'email' => $email, 'password' => $password, 'ip' => $ip, 'token' => bin2hex(openssl_random_pseudo_bytes(24))); // L'exécution de la requete DANS un try/catch try { $prep = $bdd->prepare($sql); $prep->execute($datas); } catch(Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les paramètres envoyés à la requete : "; print_r($datas); } header('Location:inscription.php?reg_err=success'); die(); } else { header('Location: inscription.php?reg_err=password'); die(); } } else { header('Location: inscription.php?reg_err=email'); die(); } } else { header('Location: inscription.php?reg_err=email_length'); die(); } } else { header('Location: inscription.php?reg_err=pseudo_length'); die(); } } else { header('Location: inscription.php?reg_err=already'); die(); } } -
oui je me doutais bien que le premier ne servait a rien mais bon
j enlève donc cette partie
header('Location:inscription.php?reg_err=success'); die(); } else { header('Location: inscription.php?reg_err=password'); die(); } } else { header('Location: inscription.php?reg_err=email'); die(); } } else { header('Location: inscription.php?reg_err=email_length'); die(); } } else { header('Location: inscription.php?reg_err=pseudo_length'); die(); } } else { header('Location: inscription.php?reg_err=already'); die(); } -
merci
voila je viens de refaire l'essai
j'ai une page blanche a présent-
Je viens de voir ton erreur...
Je t'avais donné un code avec un IF et un ELSE....
Dans le cas qui te concerne tu dois vérifier que la variable Row est vide ....
La toi tu testes si elle n'est pas vide....
Comprends-tu le mot empty ?
Sais-tu à quoi sert le point d'exclamation ?
C'est un minimum à connaître quand on commence à coder en PHP...
-
-
on vérifie si elle n est pas vide
ah mince c est le ! qui fout le bazar -
ah ben voila cela a fonctionner
un grand merci
pour la connexion c'est pareil avec la gestion des erreurs
<?php session_start(); require_once 'config.php'; if(!empty($_POST['email']) && !empty($_POST['password'])) { $email = htmlspecialchars($_POST['email']); $password = htmlspecialchars($_POST['password']); $sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try{ $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $check->fetch(); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " datas : " ; print_r($datas); } if($row == 1) { if(filter_var($email, FILTER_VALIDATE_EMAIL)) { if(password_verify($password, $data['password'])) { $_SESSION['user'] = $data['email']; header('Location: accueil-.php'); die(); }else{ header('Location: index.php?login_err=password'); die(); } }else{ header('Location: index.php?login_err=email'); die(); } }else{ header('Location: index.php?login_err=already'); die(); } }
et donc est ok dans ce cas reste comme ca ou alors on fait cette fois un !emptyif($row == 1)
-
Dans ma première réponse je t'ai indiqué
- L'instruction htmlspecialchars ne doit jamais s'utiliser pour l'insertion des données en BDD.. elle ne doit servir que pour l'affichage des données sur une page .
Tu as encore une erreur de variable à la ligne 17
A corriger par$prep = $bdd->prepare($sql); $prep->execute($datas); $row = $prep->fetch();
Et pour ton if, là c'estif(!empty($row ))
-
-
merci pour la correction
mais j'ai une erreur
il m'indique que le compte n existe pas -
merci de la réaction
oui le membre est bien inscrit
voici le code
<?php session_start(); require_once 'config.php'; if(!empty($_POST['email']) && !empty($_POST['password'])) { $email = ($_POST['email']); $password = $_POST['password']); $sql = 'SELECT pseudo, email, password FROM utilisateurs WHERE email = ?'; $datas = array($email); //Execution de la requete try{ $prep = $bdd->prepare($sql); $prep->execute($datas); $row = $prep->fetch(); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " datas : " ; print_r($datas); } if(!empty($row )) { if(filter_var($email, FILTER_VALIDATE_EMAIL)) { if(password_verify($password, $data['password'])) { $_SESSION['user'] = $data['email']; header('Location: accueil.php'); die(); }else{ header('Location: index.php?login_err=password'); die(); } }else{ header('Location: index.php?login_err=email'); die(); } }else{ header('Location: index.php?login_err=already'); die(); } }-
Tu ne te relis pas assez....
if(password_verify($password, $data['password']
Ce n'est pas data... mais row..
Si tu penses à activer les erreurs PHP au début de tes script et que tu mets en commentaire les redirection pour vérifier ce qui se passe quand ça ne fonctionne pas tu n'aurais pas besoin que je te relise ton code.
-
-
en effet c'est vrai que je ne me relis pas assez
pourtant c est de la logique
faut absolument que je comprenne ces choses toutes simple
pour protéger mes pages de mon espace membre seul ceci suffit alors
<?php session_start(); if(!isset($_SESSION['user'])){ header('Location:test.php'); die(); } ?> -
merci
car sur un forum j avais vu cela<?php session_start(); if(!empty($_SESSION['id']) AND !empty($_SESSION['pseudo']) OR !empty($_COOKIE['passe']) AND !empty($_COOKIE['pseudo'])) { } else { header('Location: index.php'); exit(); } ?>
- 1
- 2