par
twnguy » 27 oct. 2023, 20:09
Hello à tous !
Je viens de finir un cours sur PHP/MySQL et je me suis lancé comme défi de réaliser un petit blog en PHP comme premier projet. Seulement voilà, je suis bloqué sur mon formulaire d'inscription qui ne me retourne pas les erreurs, si erreurs il y a dans la saisie du formulaire.
Les erreurs sont :
- Pseudo déjà existant / Pseudo trop long / Pseudo avec des caractères interdits
- Mot de passe trop court / Confirmation mot de passe non identique
- E-mail déjà existant / E-mail invalide
Je m'arrache les cheveux depuis 3 jours, je quitte et j'y reviens avec d'autres méthodes (if embriqués, contenir les erreurs dans un tableau...), mais ne marche pas.
(La page de connexion et créer une session c'est plus simple visiblement

)
Voici ma première version :
<?php
include_once('session.php');
if(isset($userLogged)) {
header("Location: client.php");
}
// On demande si le formulaire a été envoyé
// Si oui, on récupère les données en variables
if (isset($_POST['signin'])) {
$pseudo = $_POST['pseudo'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
$passwordConfirm = $_POST['password2'];
// On vérifie le respect des conditions des champs
if (mb_strlen($pseudo) >= 15) {
$errorPseudoLength = 'Le pseudo doit contenir 15 caractères au maximum.';
}
if (!preg_match("~^[a-z0-9 '-]+$~i",$pseudo)) {
$errorPseudoStruct = 'Le pseudo contient des caractères interdits.';
}
if (mb_strlen($password) <= 8 && mb_strlen($passwordConfirm) <= 8) {
$errorPasswordLength = 'Le mot de passe doit comporter au moins 9 caractères.';
}
if (isset($email)) {
filter_var($email, FILTER_VALIDATE_EMAIL);
}
else {
$errorEmailStruct = 'L\'email n\'est pas valide.';
}
// Si le mdp n'est pas identique, erreur
// Sinon, on hash le mdp
if ($password != $passwordConfirm) {
$errorPasswordConfirm = 'Les mots de passe ne sont pas identiques.';
}
else {
$hashpass = password_hash($password, PASSWORD_DEFAULT);
// On vérifie si le pseudo ou l'email et le pseudo existe dans la BD
$query = $bdd->prepare("SELECT pseudo, email FROM users WHERE pseudo = :pseudo AND email = :email");
$query->execute(compact('pseudo', 'email'));
$exist = $query->fetch();
if ($exist['email'] == $email) {
$errorEmail = 'Vous vous êtes déjà inscrit avec cet e-mail.';
}
if ($exist['pseudo'] == $pseudo) {
$errorPseudo = 'Il semblerait que votre pseudo soit très apprécié... Il faudrait en choisir un autre !';
}
if (!isset($errorEmail) && !isset($errorPseudo)) {
// On crée la ligne dans users
$sth = $bdd->prepare("INSERT INTO users VALUES(DEFAULT, :pseudo, :firstname, :lastname, :email, :password, NOW())");
$sth->bindParam(':pseudo',$pseudo);
$sth->bindParam(':firstname',$firstname);
$sth->bindParam(':lastname',$lastname);
$sth->bindParam(':email',$email);
$sth->bindParam(':password',$hashpass);
$sth->execute();
// On renvoie l'utilisateur vers la page de connexion
header("Location: login.php");
}
}
}
?>
Cette version insère bien la ligne dans la DB lorsque toutes les informations sont bien remplies et que l'email et le pseudo n'existent pas, MAIS elle n'affiche pas les messages d'erreurs, enfin elle les affiche mais il me manque juste les erreurs $errorPseudo et $errorEmail.
Je ne peux pas vous fournir d'image puisqu'on ne peut pas poster de lien externe à ce forum ???
Here is la deuxième version :
<?php
include_once('mysql.php');
// Si le formulaire a été validé, on collecte les variables
// On crée un tableau d'erreurs
if (isset($_POST['submit'])) {
$pseudo = $_POST['pseudo'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
$passwordConfirm = $_POST['password2'];
$error = array();
// On remplit le tableau si les conditions ne sont pas remplies
if (mb_strlen($pseudo) >= 15) {
$error['pseudoLength'] = 'Le pseudo doit contenir 15 caractères au maximum.<br/>';
}
elseif (!preg_match("~^[a-z0-9 '-]+$~i",$pseudo)) {
$error['pseudoStruct'] = 'Le pseudo contient des caractères interdits.<br/>';
}
else {
$q = $bdd->prepare("SELECT user_id FROM users WHERE pseudo = :pseudo");
$q->bindParam("pseudo",$pseudo);
$q->execute();
$pseudoCheck = $q->fetch();
if($pseudoCheck) {
$error['pseudoCheck'] = 'Il semblerait que votre pseudo soit très apprécié... Il faudrait en choisir un autre !<br/>';
}
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error['emailStruct'] = 'Veuillez renseigner un e-mail valide.<br/>';
}
else {
$q = $bdd->prepare("SELECT user_id FROM users WHERE email = :email");
$q->bindParam("email",$email);
$q->execute();
$emailCheck = $q->fetch();
if($emailCheck) {
$error['emailCheck'] = 'Cet e-mail a déjà été utilisé.<br/>';
}
}
if ($password <= 8 && $passwordConfirm <= 8) {
$error['passwordLength'] = 'Votre mot de passe doit contenir au moins 9 caractères.<br/>';
}
elseif ($password != $passwordConfirm) {
$error['passwordConfirm'] = 'Les mots de passe ne sont pas identiques.<br/>';
}
// S'il n'y a aucune erreur dans le tableau
// On hash le mdp et on insère la ligne dans la DB
if (empty($error)) {
$hashpass = password_hash($password, PASSWORD_DEFAULT);
$sth = $bdd->prepare("INSERT INTO users VALUES(DEFAULT, :pseudo, :firstname, :lastname, :email, :password, NOW()");
$sth->bindParam("pseudo",$pseudo);
$sth->bindParam("firstname",$firstname);
$sth->bindParam("lastname",$lastname);
$sth->bindParam("email",$email);
$sth->bindParam("password",$hashpass);
$sth->execute();
// On redirige vers la page de connexion
header("Location: login.php");
exit();
}
}
?>
Celle-ci me renseigne bien les erreurs de pseudo et d'email déjà existants (alléluia !

), mais ne me renseigne pas tout le reste... D'ailleurs, même en renseignant un password de plus de 9 caractères, il m'indique l'erreur comme quoi mon password ne remplit pas la condition...
Lorsque je crée un compte non existant et qui remplit tous les critères, l'inscription en BDD ne se fait pas.
Des pistes? Exemples?
Merci beaucoup à ceux qui vont essayer de m'aider

, car je suis en train de devenir chèvre...
Bonne soirée !
[b]Hello à tous ! [/b]
Je viens de finir un cours sur PHP/MySQL et je me suis lancé comme défi de réaliser un petit blog en PHP comme premier projet. Seulement voilà, je suis bloqué sur mon formulaire d'inscription qui ne me retourne pas les erreurs, si erreurs il y a dans la saisie du formulaire.
Les erreurs sont :
- Pseudo déjà existant / Pseudo trop long / Pseudo avec des caractères interdits
- Mot de passe trop court / Confirmation mot de passe non identique
- E-mail déjà existant / E-mail invalide
Je m'arrache les cheveux depuis 3 jours, je quitte et j'y reviens avec d'autres méthodes (if embriqués, contenir les erreurs dans un tableau...), mais ne marche pas.
(La page de connexion et créer une session c'est plus simple visiblement :oops: )
Voici ma première version :
[PHP]
<?php
include_once('session.php');
if(isset($userLogged)) {
header("Location: client.php");
}
// On demande si le formulaire a été envoyé
// Si oui, on récupère les données en variables
if (isset($_POST['signin'])) {
$pseudo = $_POST['pseudo'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
$passwordConfirm = $_POST['password2'];
// On vérifie le respect des conditions des champs
if (mb_strlen($pseudo) >= 15) {
$errorPseudoLength = 'Le pseudo doit contenir 15 caractères au maximum.';
}
if (!preg_match("~^[a-z0-9 '-]+$~i",$pseudo)) {
$errorPseudoStruct = 'Le pseudo contient des caractères interdits.';
}
if (mb_strlen($password) <= 8 && mb_strlen($passwordConfirm) <= 8) {
$errorPasswordLength = 'Le mot de passe doit comporter au moins 9 caractères.';
}
if (isset($email)) {
filter_var($email, FILTER_VALIDATE_EMAIL);
}
else {
$errorEmailStruct = 'L\'email n\'est pas valide.';
}
// Si le mdp n'est pas identique, erreur
// Sinon, on hash le mdp
if ($password != $passwordConfirm) {
$errorPasswordConfirm = 'Les mots de passe ne sont pas identiques.';
}
else {
$hashpass = password_hash($password, PASSWORD_DEFAULT);
// On vérifie si le pseudo ou l'email et le pseudo existe dans la BD
$query = $bdd->prepare("SELECT pseudo, email FROM users WHERE pseudo = :pseudo AND email = :email");
$query->execute(compact('pseudo', 'email'));
$exist = $query->fetch();
if ($exist['email'] == $email) {
$errorEmail = 'Vous vous êtes déjà inscrit avec cet e-mail.';
}
if ($exist['pseudo'] == $pseudo) {
$errorPseudo = 'Il semblerait que votre pseudo soit très apprécié... Il faudrait en choisir un autre !';
}
if (!isset($errorEmail) && !isset($errorPseudo)) {
// On crée la ligne dans users
$sth = $bdd->prepare("INSERT INTO users VALUES(DEFAULT, :pseudo, :firstname, :lastname, :email, :password, NOW())");
$sth->bindParam(':pseudo',$pseudo);
$sth->bindParam(':firstname',$firstname);
$sth->bindParam(':lastname',$lastname);
$sth->bindParam(':email',$email);
$sth->bindParam(':password',$hashpass);
$sth->execute();
// On renvoie l'utilisateur vers la page de connexion
header("Location: login.php");
}
}
}
?>
[/PHP]
Cette version insère bien la ligne dans la DB lorsque toutes les informations sont bien remplies et que l'email et le pseudo n'existent pas, MAIS elle n'affiche pas les messages d'erreurs, enfin elle les affiche mais il me manque juste les erreurs $errorPseudo et $errorEmail.
Je ne peux pas vous fournir d'image puisqu'on ne peut pas poster de lien externe à ce forum ???
Here is la deuxième version :
[PHP]
<?php
include_once('mysql.php');
// Si le formulaire a été validé, on collecte les variables
// On crée un tableau d'erreurs
if (isset($_POST['submit'])) {
$pseudo = $_POST['pseudo'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
$passwordConfirm = $_POST['password2'];
$error = array();
// On remplit le tableau si les conditions ne sont pas remplies
if (mb_strlen($pseudo) >= 15) {
$error['pseudoLength'] = 'Le pseudo doit contenir 15 caractères au maximum.<br/>';
}
elseif (!preg_match("~^[a-z0-9 '-]+$~i",$pseudo)) {
$error['pseudoStruct'] = 'Le pseudo contient des caractères interdits.<br/>';
}
else {
$q = $bdd->prepare("SELECT user_id FROM users WHERE pseudo = :pseudo");
$q->bindParam("pseudo",$pseudo);
$q->execute();
$pseudoCheck = $q->fetch();
if($pseudoCheck) {
$error['pseudoCheck'] = 'Il semblerait que votre pseudo soit très apprécié... Il faudrait en choisir un autre !<br/>';
}
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error['emailStruct'] = 'Veuillez renseigner un e-mail valide.<br/>';
}
else {
$q = $bdd->prepare("SELECT user_id FROM users WHERE email = :email");
$q->bindParam("email",$email);
$q->execute();
$emailCheck = $q->fetch();
if($emailCheck) {
$error['emailCheck'] = 'Cet e-mail a déjà été utilisé.<br/>';
}
}
if ($password <= 8 && $passwordConfirm <= 8) {
$error['passwordLength'] = 'Votre mot de passe doit contenir au moins 9 caractères.<br/>';
}
elseif ($password != $passwordConfirm) {
$error['passwordConfirm'] = 'Les mots de passe ne sont pas identiques.<br/>';
}
// S'il n'y a aucune erreur dans le tableau
// On hash le mdp et on insère la ligne dans la DB
if (empty($error)) {
$hashpass = password_hash($password, PASSWORD_DEFAULT);
$sth = $bdd->prepare("INSERT INTO users VALUES(DEFAULT, :pseudo, :firstname, :lastname, :email, :password, NOW()");
$sth->bindParam("pseudo",$pseudo);
$sth->bindParam("firstname",$firstname);
$sth->bindParam("lastname",$lastname);
$sth->bindParam("email",$email);
$sth->bindParam("password",$hashpass);
$sth->execute();
// On redirige vers la page de connexion
header("Location: login.php");
exit();
}
}
?>
[/PHP]
Celle-ci me renseigne bien les erreurs de pseudo et d'email déjà existants (alléluia ! 8-) ), mais ne me renseigne pas tout le reste... D'ailleurs, même en renseignant un password de plus de 9 caractères, il m'indique l'erreur comme quoi mon password ne remplit pas la condition...
Lorsque je crée un compte non existant et qui remplit tous les critères, l'inscription en BDD ne se fait pas.
Des pistes? Exemples? 8-|
Merci beaucoup à ceux qui vont essayer de m'aider O:) , car je suis en train de devenir chèvre...
Bonne soirée !