8721 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis entrain de créer un petit chat pour m’entraîner en php dont voici le déroulement :

1- Sur la page index.php je rentre les informations les champs de formulaire pseudo et message.
2- Quand je clique sur le bouton les informations sont envoyé vers la page admin.php pour être stocké dans la base de données. Une fois la requête effectué, retour à la page index.php.

Tout ceci fonctionne jusque là. Maintenant ce que voudrais faire c'est affiché un message lorsque les champs sont vide. Bien sûr le traitement sera fait coté serveur. Et donc le problème est que rien ne se passe comme il faut, soit le message apparait tout suite soit pas du tout alors que ce que je veux c'est qu'il apparaisse au moment du clique QUE si les champs sont vide.

Merci à ceux qui voudront bien m'aider.

Voici mon code :


<?php

    include 'connexion.php'; // connexion à la base de données

    $error = $_POST['pseudo'] = "";

    if(isset($_POST['pseudo']) && isset($_POST['message'])) {
        if (!empty($_POST['pseudo'] && !empty($_POST['message']))) {
            $error = "";
        }
    }
    else{
        $error = "Tout les champs sont obligatoires !";
    }
?>

<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <title>Document</title>
</head>
<body>
  <fieldset>
      <form action="admin.php" method="POST">

          <label for="pseudo">Pseudo : </label>
          <input type="text" name="pseudo" id="pseudo">

          <label for="message">Message : </label>
          <input type="text" name="message" id="message">

          <input type="submit" value="Envoyer">
          <p><?php echo $error; ?></p>
      </form>
  </fieldset>

<hr>

</body>
</html>
Il faut que tu nommes ton <input type="submit"> et que tu le mettes dans ta condition

if(isset($_POST['pseudo']) && isset($_POST['message']) && isset($_POST['/*nom de ton submit*/']) {
       /* Pour sécuriser */
       $pseudo = htmlspecialchars($_POST['pseudo']);
       $message = htmlspecialchars($_POST['message']);
        if (!empty($_POST['pseudo'] && !empty($_POST['message']))) {
            // CODE
        } else {
        $error = "Tout les champs sont obligatoires !";
        }
}

EDIT : else mal placé
Modifié par Soldat8889 (27 May 2018 - 13:09)
le mieux c'est que tu testes la validation de ton formulaire spécifiquement par le bouton submit, change le code de ton bouton dans cet esprit:

<input type="submit"  id="send" name="send" value="Envoyer"/>


ensuite, au début du fichier, tu testes si la valeur 'send' existe dans le tableau $_POST


if (isset($_POST['send'])):
    le formulaire a été validé
    je fais mes tests
endif;


edit: ah , j'ai répondu en même temps que Soldat8889 Smiley smile
Modifié par lionel_css3 (27 May 2018 - 13:11)
lionel_css3 a écrit :
le mieux c'est que tu testes la validation de ton formulaire spécifiquement par le bouton submit, change le code de ton bouton dans cet esprit:

&lt;input type="submit"  id="send" name="send" value="Envoyer"/&gt;


ensuite, au début du fichier, tu testes si la valeur 'send' existe dans le tableau $_POST


if (isset($_POST['send'])):
    le formulaire a été validé
    je fais mes tests
endif;


edit: ah , j'ai répondu en même temps que Soldat8889 Smiley smile

:D
Soyons paranos ! Filtrons tout !
Appeler include que si besoin
Restons dans l'inaction pour le form
required si on veut des champs obligatoires ( les hackers s'en moquent )
<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="style.css" />
    <title>Document</title>
</head>
<body>
<?php
    if(
        filter_has_var(INPUT_POST, 'pseudo') and
        filter_has_var(INPUT_POST, 'message')
    ) {
        $pseudo = filter_input(NPUT_POST, 'pseudo', FILTER_SANITIZE_STRING);
        if(is_string($pseudo)) { $pseudo = trim($pseudo); }
        $message = filter_input(NPUT_POST, 'message', FILTER_SANITIZE_STRING);
        if(is_string($message)) { $message = trim($message); }
        if(!empty($pseudo) and !empty($message)) {
            include 'connexion.php'; // connexion à la base de données
            // traiter les données
        } else {
            $error = 'Désolé, nous n\'avons pas compris votre demande';
        }
    } else {
        $error = 'Tous les champs sont obligatoires !';
    }
    if(!empty($error)) {
        echo <<< ERROR
    <div>
        $error
    </div>/n
ERROR;
    }
?>
    <form id="form1" method="post">
        <fieldset>
            <div>
                <label for="pseudo">Pseudo : </label>
                <input type="text" name="pseudo" id="pseudo" required />
            </div><div>
                <label for="message">Message : </label>
                <input type="text" name="message" id="message" required />
            </div><div>
                <input type="submit" value="Envoyer">
            </div>
        </fieldset>
    </form>
</body>
</html>

Modifié par bazooka07 (27 May 2018 - 16:39)
merci à tous pour vos réponses.

bazooka ton c'est tout sur la même page moi je veux faire le traitement sur une page dediée.

pour mon probleme de message la solution consiste à faire l'insertion dans une condition. Si les variables contiennent des données on fait l'insertion sinon on reviens avec un header qui contient un message d'erreur en $_GET qu'on recupere sur la page principale pour afficher le message que si la valeur existe. Je ne sais pas si je suis claire Smiley lol
Dans le code que je t'ai donné remplace 'connexion.php' par 'admin.php'.
Au moins les données qu'envoie ton visiteur sont filtrées et non vides avant la connexion à la base de données.
Il n'y aura pas forcément que des "bisounours" qui vont répondre à ton formulaire.
Le net est puplé de méchants Smiley fache
admin.php se charge de faire l insertion puis de renvoyer a index.php. donc si je veux revenir a index.php et afficher un message d'erreur je dois passer par $ _GET a moins qu une autre solution soit possible ?
Pas forcément besoin de $_GET.

Si l'insertion réussie, tu fais un header('Location: homepage.php'); exit;
Sinon en cas d'échec, tu renseignes la variable $error et après avoir quitter admin.php, elle sera affichée par le script que je t'ai donné à la suite de include.

Note que si tu passes par $_GET il faut passer ton message à url_encode pour coder les espaces et les lettres accentuées.
Merci bazooka, est ce que je peux profiter de ta bonté pour m'éxpliquer cette portion de code que tu as écris parce que là je ne comprend vraiment pas comment elle fonctionne, merci à toi :


if(!empty($error)) {
        echo <<< ERROR
    <div>
        $error
    </div>/n
ERROR;
    }
C'est la syntaxe Heredoc
http://php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc
la commande echo va afficher tout ce qui est compris entre les 2 marqueurs ERROR en remplaçant les variables par leurs valeurs. On peut utiliser aussi des variables plus compliquées comme une valeur de tableau ou la propriété d'un object. Par contre, les constantes et les fonctions sont interdites. Il faut stocker leur résultat dans une variable au préalable.
Ce n'est pas spécial à PHP. Cela existe aussi dans certains languages de script comme Bash, PERL ?

empty($error) vaut true si la variable n'existe pas ou est égale à false.
http://php.net/manual/fr/function.empty.php
L'intérêt est que PHP ne râle pas si la variable est inexistante.
! inverse le résultat de empty()
Au final on affiche le message que si $error existe et est non nul (false, 0, '', ...)
Modifié par bazooka07 (28 May 2018 - 22:04)