Partage
  • Partager sur Facebook
  • Partager sur Twitter

Echo d'une variable ne fonctionne pas.

14 octobre 2020 à 20:58:00

Bonjour à tous,

Je suis actuellement en train de créer un système d'inscription mais j'ai un problème, lorsque j'essaye d'afficher "l'erreur" lors de l'inscription (ex: adresse mail incorrecte...), elle ne s'affiche pas, je vous montre mon code: 

if(isset($_POST['submit'])){
    if(isset($_POST['username']) AND isset($_POST['email']) AND isset($_POST['password']) AND isset($_POST['password_confirm'])){
        if(!empty($_POST['username']) AND !empty($_POST['email']) AND !empty($_POST['password']) AND !empty($_POST['password_confirm'])){
            
            $username = trim(htmlspecialchars($_POST['username']));
            $email = trim(htmlspecialchars($_POST['email']));
            $password = trim(htmlspecialchars($_POST['password']));
            $password_confirm = trim(htmlspecialchars($_POST['password_confirm']));

            if(strlen($email) <= 255){
                if(filter_var($email, FILTER_VALIDATE_EMAIL)){
                    if(strlen($username) >= 3 AND strlen($username) <= 255){
                        if(strlen($password) >= 4 AND strlen($password) <= 100){
                            if($password == $password_confirm){

                                $req = $db->prepare("INSERT INTO users (username, email, password) VALUES (?,?,?)");
                                $req->execute(array($username,$email,$password));

                                $error = "Inscription validée !";

                            } else {
                                $error = "Vos mots de passes de correspondent pas.";
                            }
                        } else {
                            $error = "Votre mot de passe doit contenir au moins 4 caractères.";
                        }
                    } else {
                        $error = "Votre pseudonyme doit entre 3 et 255 caractères.";
                    }
                } else {
                    $error = "Veuillez saisir une adresse e-mail correcte.";
                }
            } else {
                $error = "Veuillez saisir une adresse e-mail correcte.";
            }

        }
    }
}

Et la ligne qui permet d'afficher l'erreur: 

<p><?php if(isset($error)){echo $error;} ?></p>

J'utilise une architecture MVC, c'est-à-dire que les fichiers sont reliés (permet d'optimiser le code et sépare le html du php..), même si je suppose que cela n'a rien à voir car j'ai fais plusieurs test, j'ai déclaré une variable puis ai essayé de l'afficher, et là , cela fonctionnait.. Quelqu'un aurait-il une idée du problème et saurait comment le résoudre :o ? Merci d'avance, bonne soirée !


  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 21:09:14

Bonsoir,

ça veut surement dire que tu ne rentres mêmes pas dans les 1er if qui eux n'ont pas de else

d'ailleurs

- tu peux supprimer la ligne 2 car la fonction isset est comprise dans la fonction empty

- pas de htmlspecialchars sur les données entrée en BDD (cf signature)

- pas de "trim" sur le password car l'espace peut faire parti du MDP

- un mdp en clair, ce n'est pas bon. Il faut utiliser "password_hash" pour l'encodage et "password_verify" pour la vérification

- Le problème avec ton code c'est que l'utilisateur verra seulement une erreur à fois. Donc s'il doit les corriger une à une, ça va être long

-
Edité par Aurélien10! 14 octobre 2020 à 21:10:42

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 21:16:05

Salut

Aurélien.C a écrit:

ça veut surement dire que tu ne rentres mêmes pas dans les 1er if qui eux n'ont pas de else

Je serais d'ailleurs peu surpris que le formulaire "envoie en GET" parce que la méthode a été oubliée ou comporte une coquille  ;)

-
Edité par Ymox 14 octobre 2020 à 21:16:18

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 21:36:38

Merci de votre aide, j'ai bien conscience de certaines de mes erreurs, mais donc, que faudrait-il que je change pour régler ce problème en clair ?
  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2020 à 22:31:32

commence par appliquer à minima les 3 premiers conseils que je te donne, pour les 2 autres il faudra le faire après

ensuite mets un else à chaque if avec dans ce dernier un "echo" pour indiquer où tu passes, cela permet de débugger son code

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2020 à 20:31:43

Bonjour de nouveau,

J'ai appliqué vos conseils comme j'ai pu.

Voilà ce que j'ai pour le moment:

<?php

require "../network.php";
require "register/register.php";

if(isset($_POST['submit'])){
    if(!empty($_POST['username']) AND !empty($_POST['email']) AND !empty($_POST['password']) AND !empty($_POST['password_confirm'])){

        $username = trim($_POST['username']);
        $email = trim($_POST['email']);
        $password = $_POST['password'];
        $pasword_confirm = $_POST['password_confirm'];

        if(filter_var($email, FILTER_VALIDATE_EMAIL)){

        } else {
            $error = "Veuillez entrer une adresse e-mail correcte.";
        }

    } else { 
        $error = "Veuillez remplir tous les champs.";
    }
}

Mais lorsque j'essaye d'afficher l'erreur de nouveau, rien..

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2020 à 20:50:43

il nous faut aussi le code du formulaire

et donne nous le code complet de la page, en cachant bien sur les données sensibles (email, mdp ...)

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2020 à 21:09:20

Avec plaisir,

<?php

require "../network.php";
require "register/register.php";

if(isset($_POST['submit'])){
    if(!empty($_POST['username']) AND !empty($_POST['email']) AND !empty($_POST['password']) AND !empty($_POST['password_confirm'])){

        $username = trim($_POST['username']);
        $email = trim($_POST['email']);
        $password = $_POST['password'];
        $pasword_confirm = $_POST['password_confirm'];

        if(filter_var($email, FILTER_VALIDATE_EMAIL)){
            if(strlen($username <= 20) AND strlen($username >= 3)){
                if(strlen($password <= 50) AND strlen($password >= 5)){

                } else {
                    
                }
            } else {
                $error = "Votre nom d'utilisateur doit comporter entre 3 et 20 caractères.";
            }
        } else {
            $error = "Veuillez entrer une adresse e-mail correcte.";
        }

    } else { 
        $error = "Veuillez remplir tous les champs.";
    }
}

Et le HTML: 

<?php include('../main.php') ?>

<html>
<head>
        <title>Inscription - Nemosia</title>
        <meta name="viewport" content="width=device-width, inital-scale-1.0">
        <link rel="stylesheet" href="../css/register.css">
        <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet">
    </head>
<body>
    <div class="box-center">
        <h1 class="box-title">Inscription</h1>
        <form method="POST" class="box-form">
            <div class="form-field">
                <input name="username" type="text" required>
                <span></span>
                <label>Nom d'utilisateur</label>
            </div>
            <div class="form-field">
                <input name="email" type="text" required>
                <span></span>
                <label>Adresse e-mail</label>
            </div>
            <div class="form-field">
                <input name="password" type="password" required>
                <span></span>
                <label>Mot de passe</label>
            </div>
            <div class="form-field">
                <input name="password_confirm" type="password" required>
                <span></span>
                <label>Répétez le mot de passe</label>
            </div>
            <p class="confidentiality">En continuant, vous acceptez la<a href="#" class="confidentiality"> charte de confidentialité.</a></p>
            <button type="submit" class="button-register" name="submit">S'inscrire !</button>
        </form>
    </div>

    <p><?php if(isset($error)){echo $error;} ?></p>

</body>
</html>




  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2020 à 21:25:29

donc ton code php est contenu dans le fichier "main.php" ?

donc un "var_dump($_POST);" à la ligne 5 du php devrait donner quelque choses après soumission du formulaire

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2020 à 21:39:57

Tous tes strlen sont tous faux, les ) sont mal placées.

Et si le if comme le else n'ont pas de corps, alors tous deux ne servent à rien.

PS : j'ai oublié de dire que strlen c'est le nombre d'octets, pas forcément de caractères (exemple : é c'est un caractère mais il est codé sur 2 octets en UTF-8)

Tu dis utiliser le principe MVC mais comment ? Parce que si ça implique des fonctions/méthodes, il y a peut être la question du scope de $error qui se pose.

-
Edité par julp 16 octobre 2020 à 1:21:41

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2020 à 17:42:48

Apparemment j'ai du mal à reprendre PhP :lol:.

Je ne comprend pas votre histoire de corps de else etc, possible d'être plus clair ;D ?

Sinon je n'utilise pas de fonction pour le moment.

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2020 à 17:47:57

alors le corps vide = ligne 17 & 19 vide

ah si vous utilisez plein de fonction (strlen, trim, filter_var, isset, empty......)

cette ligne est fausse 

if(strlen($username <= 20) AND strlen($username >= 3)){
                if(strlen($password <= 50) AND strlen($password >= 5)){

cela devrait être 

if(strlen($username) <= 20 AND strlen($username) >= 3){
                if(strlen($password) <= 50 AND strlen($password) >= 5){




-
Edité par Aurélien10! 16 octobre 2020 à 17:49:02

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2020 à 17:57:09

C'est vraiment pas net cette histoire :euh:

J'ai essayé:

<?php

require "../network.php";
require "register/register.php";

if(isset($_POST['submit'])){
    if(!empty($_POST['username']) AND !empty($_POST['email']) AND !empty($_POST['password']) AND !empty($_POST['password_confirm'])){

        $username = trim($_POST['username']);
        $email = trim($_POST['email']);
        $password = $_POST['password'];
        $pasword_confirm = $_POST['password_confirm'];

        if(strlen($username) <= 20 AND strlen($username) >= 3){
            if(strlen($password) <= 50 AND strlen($password) >= 5){

            } else {
                $error = "fonctionne ?";
            }
        } else {
            $error = "fonctione !";
        }

    } else { 
        $error = "Veuillez remplir tous les champs.";
    }
}

Juste avec ceci et, toujours pas..

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2020 à 18:15:26

Aurélien.C a écrit:

donc ton code php est contenu dans le fichier "main.php" ?

donc un "var_dump($_POST);" à la ligne 5 du php devrait donner quelque choses après soumission du formulaire



  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2020 à 2:59:36

Tous simplement par ce que votre formulaire ne contient pas une input au nom de submit c'est bouton de type submit il n'ya pas de variable en post qui s'appel submit dans votre formulaire veuillez enlevé la condition

if (isset($_POST['submit']))

ou ajouté a votre formulaire une input

<input type="hidden" name="submit" />


NB: vou avez pas vu d'erreur par ce que vous vous avez pas mis le else de la première if qui recherche le submit

if (isset($_POST['submit'])){ .... }
else {
   $error ="pas de submit";
}

j'espère que ça vous aide


  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2020 à 10:54:41

Si jamais, le bouton possède bien un attribut name et si on utilise ledit bouton pour soumettre le formulaire, c'est la valeur entre les balises qui est envoyée comme si le bouton était une saisie.

Mais si on soumet le formulaire avec ENTER, par exemple, vu que le bouton n'a pas été cliqué, effectivement l'index submit n'existe pas.

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2020 à 12:25:09

Bonjour,

je viens de vérifier en local, et si si si, en tout cas avec Firefox, l'index "submit" ainsi que sa valeur sont bien envoyées après l'appui sur la touche Entrée.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)

18 octobre 2020 à 13:28:18

On en revient au var_dump de $_POST pour vérifier qu'il reçoit bien ce qu'il pense ?

-
Edité par julp 18 octobre 2020 à 13:28:32

  • Partager sur Facebook
  • Partager sur Twitter
19 octobre 2020 à 8:17:42

@Lamecarlate au temps pour moi, je suis resté sur un vieux comportement qui apparemment devait être un bug.

  • Partager sur Facebook
  • Partager sur Twitter
26 novembre 2020 à 20:18:42

Ah Bien Sur vous fait des AND au lieu de OR qui va declancher le else dès que une condition n'est pas honoré

<?php
 
require "../network.php";
require "register/register.php";
 
if(isset($_POST['submit'])){
    if(!empty($_POST['username']) OR !empty($_POST['email']) OR !empty($_POST['password']) OR !empty($_POST['password_confirm'])){
 
        $username = trim($_POST['username']);
        $email = trim($_POST['email']);
        $password = $_POST['password'];
        $pasword_confirm = $_POST['password_confirm'];
 
        if(strlen($username) <= 20 OR strlen($username) >= 3){
            if(strlen($password) <= 50 OR strlen($password) >= 5){
                $error = "ça Fonctionne";
            } else {
                $error = "fonctionne ?";
            }
        } else {
            $error = "fonctione !";
        }
 
    } else {
        $error = "Veuillez remplir tous les champs.";
    }
}
else{
$error = "pas de submit";
}

-
Edité par yaslak 26 novembre 2020 à 20:21:45

  • Partager sur Facebook
  • Partager sur Twitter
27 novembre 2020 à 12:28:51

Non, le problème n'est pas entre des OR ou des AND, parce que du coup, alors qu'il regardait si les valeurs étaient comprises entre deux limites, avec des OR si l'une d'entre elles est respectée, l'autre devient inutile donc tout devient possible — exemples : un mot de passe de 200 caractères est plus long que 5, et avec OR vu que cette seule limite est respectée, on se contrefiche désormais qu'il devrait être de 50 maximum. Un mot de passe d'un seul (ou de zéro, même) caractère est plus petit que 50, une limite est respectée, on s'en fiche que l'on doive mettre 3 caractères minimum.

-
Edité par Ymox 27 novembre 2020 à 12:29:51

  • Partager sur Facebook
  • Partager sur Twitter
27 novembre 2020 à 12:53:21

(et sinon, limiter la longueur maximale d'un mot de passe, c'est à éviter, hein)
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)

27 novembre 2020 à 13:35:34

> (et sinon, limiter la longueur maximale d'un mot de passe, c'est à éviter, hein)

Ca pourrait être discutable dans le cas particulier de bcrypt qui ne considère que les 72 premiers octets * de la clé (mot de passe ici). Un utilisateur qui aurait un mot de passe plus long n'augmenterait pas la sécurité de son compte, ça pourrait être utile de l'en "informer".

Mais dans le cadre de ce sujet, encore faudrait-il que le mot de passe soit haché pour commencer.

* j'ai bien écrit "octet" car autre particularité de bcrypt, c'est que les chaînes hachées sont censées être encodées en UTF-8 sauf que 1) ce n'est pas vérifié donc ce serait plus une convention qu'autre chose et 2) en UTF-8 un point de code pouvant être codé sur jusqu'à 4 octets, finalement, tu peux n'avoir qu'une partie d'un caractère (celui qui tombe sur cette limite de 72 octets) qui sera réellement intégré dans le calcul du hash.

  • Partager sur Facebook
  • Partager sur Twitter