Bonjour,

j'ai suivi ce tuto, mais même en mettant une condition (si les données du formulaire ne sont pas vides...), lorsque l'on clique sur Envoyer sans rien mettre dans mon formulaire, ça envoie quand même, et ça affiche un message vide. :/

Voici mon code :

if(!empty($_POST)){
           extract($_POST);
           $message=htmlentities($message);
           $sql="INSERT INTO livreor (pseudo,mail,message) VALUES ('$pseudo','$mail','$message')";
           mysql_query($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
        }

19 réponses


Samovar
Réponse acceptée

extract($_POST); est tout à fait possible !
Car ca transforme le $_POST'valeur'] en $valeur..

Essayes ça

<?php
extract($_POST);
if(isset($_POST) && !empty($ta_variable))
{
// INSERTION DANS LA DB
}
elseif(isset($_POST) && empty($ta_variable))
{
// Message d'erreur
}
else
{
// Formulaire
}
?>

Salut,
tu as mis 2 fois empty...

Kootoon
Auteur

Non ça c'est le système qui colore le code sur ce site, j'avais vu ça aussi mais sinon dans mon code il n'y a bien marqué qu'une seule fois "empty". :)

t'as essayé un "isset" au lieu du "!empty" ?

Simplement car tu n'as pas mis de valeur a ton post, tu aurais du faire:

if(!empty($_POST'la_valeur')]){  
               extract($_POST'la_valeur']);  
               $message=htmlentities($message);  
               $sql="INSERT INTO livreor (pseudo,mail,message) VALUES ('$pseudo','$mail','$message')";  
               mysql_query($sql) or die ('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
            }

et cette valeur il faut que danston formulaire sur le imput tu mette name="ta_valeur".

Kootoon
Auteur

@speedyfrench : Oui, mais ça marche pas non plus.

@Benoit : Ok, ça marche, le message n'est pas posté si on ne met vraiment rien. Maintenant si on met quelque chose ça met un message vide...

Regardes du coté de la fonction extract(); ;)

Bonjour,
Je ne voudrais pas poser un nouveau sujet, alors qu'il s'agit de la même question.
J'ai moi aussi, le même soucis, suite au tuto sur le livre d'or.
J'ai bien lu les réponses qui ont été donné, mais je n'ai pas pour autant réussi à trouver la solution, ou du moins à bien interpréter les réponses données.
J'ai donc ce code :

if(!empty($_POST) OR !empty($_FILES)){

extract($_POST);

$ip=$_SERVER"REMOTE_ADDR"];
$comment=htmlentities($comment);
$sql="INSERT INTO gb_mess (name,email,comment,ip) VALUES ('$name','$email','$comment','$ip')";
$req=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
}

Qu'est-ce que je dois modifier et où, pour que le formulaire ne renvoie plus de message vide (en rafraîchissant la page ou en ré-appuyant sur le bouton envoyer).

Je vous remercie d'avance de votre réponse.

Tu as quoi comme erreur ?

Que t'affiches cette page ?

Merci de donner des précisions..

J'ajoute que htmlentities est pire que htmlspecialchars..

Et que cette fonction ne sert qu'à l'affichage et non à l'insertion.

Et je te conseil de mettre

<?php
$message = mysql_real_escape_string($message);
?>

Je vais tenter d'expliquer au mieux le problème que je rencontre.

Quand je poste un message via le formulaire crée, celui-ci est bien traité, et le message s'affiche parfaitement, jusque là aucun soucis.
Mais une fois le message posté, les champs du formulaire de nouveau vide, et bien si on clique sur le bouton "envoyer" du formulaire, un nouveau message VIDE est posté.
Comment faire pour que cela n'arrive pas ? Faire en sorte que le bouton envoyé ne fonctionne que si les champs sont remplis.

De plus, j'ai un autre problème, concernant le rafraichissement de la page, qui demande de renvoyer la requête. Et par conséquent, qui reposte le même message.
Si un message est posté et qu'on rafraîchit la page du formulaire, alors une fenêtre s'affiche nous demandant de "renvoyer". Et donc cela répète l'opération effectue précédemment, c'est à dire reposte le formulaire.
Comment puis-je éviter cela ?

Je vous redonne mon code complet :

<?php
            require "config.php";
            mysql_connect(DB_SERVER,DB_LOGIN,DB_PASS);
            mysql_select_db(DB_NAME);
            mysql_query('SET NAMES '.DB_ENC);
        //tratitement du formulaire

        if(!empty($_POST) OR !empty($_FILES)){
            extract($_POST);

            $ip=$_SERVER"REMOTE_ADDR"];
            $sql="INSERT INTO gb_mess (date,name,email,comment,ip) VALUES (NOW(),'$name','$email','$comment','$ip')";
            $req=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

    }
?>

<!--formulaire html-->

    <form method="post" action="invites.php">

        Nom<input class="champ-allonge" type="text" name="name"/><br/><br/><br/>
        E-mail<input class="champ-allonge" type="text" name="email"/><br/><br/><br/>
        Commentaire<br/><br/>
        <textarea name="comment"></textarea><br/><br/><br/>

        <input id="bouton" type="submit" value="envoyer"/>
    </form>
<?php
        //aller chercher les messages

        $sql="SELECT * FROM gb_mess ORDER BY id DESC";
        $req=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
        //faire une boucle pour qu'il continue de récupérer tous les messages : while
        while($data=mysql_fetch_assoc($req)){
            //pour vérifier afficher l'ensemble des données print_r($data);
            echo "<br /><h5>".$data"date"]."</h5><br />";
            echo "<h4>".$data"name"]."</h4>";
            echo $data"email"]."<br /><br />";
            echo "<p>".$data"comment"]."</p>";
        }

mysql_close();
?>

Je te donne un exemple:

<?php session_start();
extract($_POST);
if(isset($_POST))
{
if(!empty($variable1) && !empty($variable2) && !empty($variable3))
{
// insertion du message.
echo ('Message correctement ajouté.<br>');
header('Refresh:1; '.$_SERVER'REQUEST_URI'].'');
}
elseif(empty($variable1) || empty($variable2) || empty($variable3))
{
// Message d'erreur [Champ(s) vide]
}
}
else
{
// affichage du formulaire..
echo ('<form method="post" action="#">
variable1:<input type="text" name="variable1"/><br>
variable2:<input type="text" name="variable2"/><br>
variable3:<input type="text" name="variable3"/><br>
<input type="sumbit" value="Je post"/>
</form>');
}
?>

OK super !
Avec l'exemple, c'est devenu plus clair.
Merci pour ton aide.

De rien ^^

Alors, ça donne quoi ? ^^

Yes ! Maintenant, si on veut poster un message, sans avoir remplis les champs, on a le message "veuillez remplir tous les champs" et le bouton envoyer "ne fonctionne plus", il n'y a plus de message vide posté. Ca fonctionne parfaitement.
Par contre, il y a toujours le soucis du rafraichissement du navigateur, qui reposte la requête.
J'ai jeté un œil sur le tuto, sur le site du zéro, qui explique comment contourner le problème. Mais je n'ai pas encore tout bien compris. Je vais essayer de le relire de nouveau.
En tout cas, merci !

serts toi de la redirection

après avoir inseré le message tu fais:

<?php // juste pour colorer
header('refresh:1; '.$_SERVER'REQUEST_URI'].'');
?>

Je sais bien qu'il existe le header pour la redirection.
Mais très honnêtement, je n'arrive jamais à le placer.
Je sais qu'il faut le mettre avant du html, echo, pas de saut de ligne ou d'espace.
Mais malgré ça dés que je pense bien le placer, j'ai l'éternel message d'erreur :
Warning: Cannot modify header information - headers already sent by

Sinon tu peux faire comme ça:

<?php
// Condition d'insertion.
if(.../* Là où tu inserts le message ! */)
{
$redirection = header('refresh:1; '.$_SERVER'REQUEST_URI'].'');
//code d'insertion
/* La redirection ici*/ $redirection; // Miracle :D
}

A croire que je fais un blocage psychologique sur ce header.
Même avec la variable redirection j'ai encore le message d'erreur.
Mais je suis sur que cela vient de moi. Faut que je reprennes depuis le début les bases du header.
Je te tiens au courant, dés que j'en suis venue à bout ^^