[RESOLU] Formulaire d'inscription : n'affiche pas les erreurs

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Formulaire d'inscription : n'affiche pas les erreurs

Re: Formulaire d'inscription : n'affiche pas les erreurs

par twnguy » 28 oct. 2023, 13:03

Hello, y’avait de ça et quelques autres bricoles que j’ai pu arranger cette nuit, tout fonctionne! Merci :D

Re: Formulaire d'inscription : n'affiche pas les erreurs

par @rthur » 28 oct. 2023, 11:15

il manque des strlen

Re: Formulaire d'inscription : n'affiche pas les erreurs

par twnguy » 28 oct. 2023, 01:22

Première version :
if (mb_strlen($password) <= 8 && mb_strlen($passwordConfirm) <= 8) { 
        $errorPasswordLength = 'Le mot de passe doit comporter au moins 9 caractères.'; 
    }
Deuxième version :

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/>';
    }

Re: Formulaire d'inscription : n'affiche pas les erreurs

par or 1 » 28 oct. 2023, 00:35

pouvez-vous nous faire un copier de la ligne de la première version, de la seconde version ?

Re: Formulaire d'inscription : n'affiche pas les erreurs

par twnguy » 27 oct. 2023, 23:57

Dans la première version du code, elle fonctionne puisque seules les variables $errorPseudo et $errorEmail ne s’affichent pas.

Dans la deuxième, elle ne fonctionne pas puisqu’il n’y a que les variables $error[‘pseudoCheck’] et $error[´emailCheck’] qui s’affichent.

Sachant que dans les deux versions, les variables :
$errorPseudo est sensé faire la même chose que $error[‘pseudoCheck’]
$errorEmail est sensé faire la même chose que $error[‘emailCheck’]

Désolé si je ne comprends pas tout ou si je suis vague #-o

:roll:

Re: Formulaire d'inscription : n'affiche pas les erreurs

par or 1 » 27 oct. 2023, 21:17

Cette ligne est censé vérifier que le mot de passe et la confirmation du mot de passe ne doivent pas être inférieurs à 9 caractères.
et en vrai, que fait-elle ?

Re: Formulaire d'inscription : n'affiche pas les erreurs

par twnguy » 27 oct. 2023, 21:00

Salut or1 !

Cette ligne est censé vérifier que le mot de passe et la confirmation du mot de passe ne doivent pas être inférieurs à 9 caractères.

Pour la longueur du pseudo je suis pas sensé continuer à vérifier les autres conditions pour le pseudo avec elseif() ?
Sinon oui je suis d’accord, si cette condition n’est pas remplie, on n’insère pas la ligne dans la BDD mais on stocke l’erreur dans une variable pour l’afficher après que le formulaire ait été envoyé.

J’utilise echo dans la partie HTML, sous chaque champs du formulaire par ex:

<?php if(isset($errorPseudo)): ?>
<div class="error-container">
<?php echo $errorPseudo; ?>
</div>
<?php endif; ?>

(Si cette erreur a été stockée, on l’affiche en gros)

Re: Formulaire d'inscription : n'affiche pas les erreurs

par or 1 » 27 oct. 2023, 20:29

qu'est censé faire cette ligne ?
if ($password <= 8 && $passwordConfirm <= 8) {

if (mb_strlen($pseudo) >= 15) {
$errorPseudoLength = 'Le pseudo doit contenir 15 caractères au maximum.';
}
faut-il continuer si cette condition n'est pas remplie ? non, alors que votre code continu.

à aucun moment les messages d'erreurs ne sont affichés avec un echo.

Formulaire d'inscription : n'affiche pas les erreurs

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 :oops: )

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 ! 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 !