8792 sujets

Développement web côté serveur, CMS

Salut,

je n'arrive pas à régler mon problème d'affichage d'erreurs après vérifications des champs du formulaire : le message d'erreur ne s'affiche pas.

J'ai fais un site avec un livre d'or. J'ai utilisé les include pour chaque page de mon site.

Dans mon livre d'or, j'ai utlisé un tableau pour faire le formulaire, et j'ai mis une dernière ligne en bas du tableau pour afficher les erreurs.

Voici la partie mon code de livreor.php pour la présentation du formulaire et affichage des erreurs :

<div id="corps">
        <h2>Livre d or</h2>
        <div id="conteneur"> 
                <form method="post" action="index.php?feuil=livreor" name="formulaire">
                <table> //tableau pour la présentation du formulaire
                        <tr><td><label for="nom">Nom :</label></td>
                            <td><input type="text" name="pseudo" value="<?php if (!empty($_POST['pseudo'])) echo ($_POST['pseudo']); ?>" size="30" id="nom" /></td>
                        </tr>
                        <tr><td><label for="email">E-mail :</label></td>
                            <td><input type="text" name="mail" value="<?php if (!empty($mail)) echo ($_POST['mail']); ?>" size="30" id="email" /> <span style="margin-left:30px;"><input type="reset" name="Submit" value="Effacer" />
<input type="submit" value="Envoyer" /></span></td>
                        </tr>
                        <tr><td><label for="ville">Ville :</label></td>
                            <td><input type="text" name="ville" value="<?php if (!empty($ville)) echo ($_POST['ville']); ?>" size="30" id="ville" /></td>
                        </tr>
                        <tr><td span style="vertical-align:top;" rowspan="2"><label for="textarea">Message :</label></td>
                            <td><textarea type="text" name="message" id="textarea" rows="7" cols="45" /><?php if (!empty($message)) echo($_POST['message']); ?></textarea></td>
                        </tr>
                        <tr><td><?php if (!empty($erreur)) echo $erreur; else echo "Ce livre d'or n'est pas un téléphone, merci d'écrire en français." ?></td> // ligne pour afficher les messages d'erreur s'il y a erreur
                        </tr>
                </table>
                </form>
        </div>
        <p>
                <?php
                        mysql_connect("localhost", "root", "");
                        mysql_select_db("test");
// --------------- Etape 1 ----------------------------------------
// Si un message est envoyé, on vérifie les post et on l'enregistre
// ----------------------------------------------------------------
                        if (isset($_POST['pseudo']) AND isset($_POST['message']))
                                {
                                if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL)
                                        {
                                        if (trim($_POST['pseudo']) != "" AND trim($_POST['message']) != "")
                                                {
                                                if (isset($_POST['mail']) AND $_POST['mail']!= NULL)
                                                        {
                                                        if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $_POST['mail']))  //verification du mail : si ok on enregistre
                                                                {
        $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES);   
        $mail = htmlentities($_POST['mail'], ENT_QUOTES); 
        $ville = htmlentities($_POST['ville'], ENT_QUOTES);
        $message = stripslashes(htmlentities($_POST['message'], ENT_QUOTES)); 
        $message = nl2br($message); 
        $jour = date ( "Y/m/d H:i:s" );
        // Contôle si le message est un double pour ne pas l'enregistrer 
        $reponsetest = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT 0, 1') or die(mysql_error()); 
        $donneestest = mysql_fetch_array($reponsetest); 
        if ($donneestest['message'] != $message) // si les 2 messages sont différents alors on enregistre
                mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $mail . "', '" . $ville . "', '" . $message . "', '" . $jour . "', '" . time() . "')") or die(mysql_error());              }      
                                                        else
                                                                {
        $erreur = "<span class=\"erreur\">Le mail n'est pas valide !</span>";
                                                                }
                                                        }
                                                if ($_POST['mail'] == NULL) //s'il n'y pas de mail, on enregistre les donnees
                                                        {
        $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); 
        $mail = htmlentities($_POST['mail'], ENT_QUOTES); 
        $ville = htmlentities($_POST['ville'], ENT_QUOTES);
        $message = stripslashes(htmlentities($_POST['message'], ENT_QUOTES)); 
        $message = nl2br($message); 
        $jour = date ( "Y/m/d H:i:s" );
        // Contôle si le message est un double pour ne pas l'enregistrer 
        $reponsetest = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT 0, 1') or die(mysql_error()); 
        $donneestest = mysql_fetch_array($reponsetest); 
        if ($donneestest['message'] != $message) // si les 2 messages sont différents alors on enregistre
                mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $mail . "', '" . $ville . "', '" . $message . "', '" . $jour . "', '" . time() . "')") or die(mysql_error());
                                                        else
                                                                {
        $erreur = "<span class=\"erreur\">Vous avez déjà posté ce message !</span>"; 
                                                                }
                                                        }
                                                }
                                        else if (trim($_POST['pseudo']) == "")
                                                {
                                                $erreur = "<span class=\"erreur\">Vous n'avez pas précisé votre nom !</span>";
                                                }  
                                        else if (trim($_POST['message']) == "")
                                                {
                                                $erreur = "<span class=\"erreur\">Vous n'avez pas rédigé de message !</span>";
                                                }
                                        }       
                                else if ($_POST['pseudo'] == NULL)
                                        {
                                        $erreur = "<span class=\"erreur\">Vous n'avez pas précisé votre nom !</span>";
                                        }  
                                else if ($_POST['message'] == NULL)
                                        {
                                        $erreur = "<span class=\"erreur\">Vous n'avez pas rédigé de message !</span>";
                                        }
                                }
// --------------- Etape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------
// On met dans une variable le nombre de messages qu'on veut par page
                        $nombreDeMessagesParPage = 10;
// On récupère le nombre total de messages
                        $retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor') or die(mysql_error());
                        $donnees = mysql_fetch_array($retour);
                        $totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
                        $nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// On affiche le nombre total de messages et le nombre de pages
                        if ($totalDesMessages == 0)
                                echo "<h3>Aucun message n'a été posté </h3>";
                        else if ($totalDesMessages == 1)
                                echo "<h3>1 message a été posté </h3> <center>Page : 1</center><br />";
                        else
                                {
                                echo "<h3>". $totalDesMessages . " messages ont été postés </h3> <center>Pages : ";
                                for ($i = 1 ; $i <= $nombreDePages ; $i++)
                                        echo '<a href="index.php?feuil=livreor&amp;page=' . $i . '">' . $i . '</a> ';
                                echo "</center> <br />";
                                }
                ?>
        </p>

        <?php
// --------------- Etape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
                if (isset($_GET['page']))
                        {
                        $page = intval($_GET['page']); // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
                        }
                else // La variable n'existe pas, c'est la première fois qu'on charge la page
                        {
                        $page = 1; // On se met sur la page 1 (par défaut)
                        }
                // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
                $premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
                $reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage) or die(mysql_error());
                while ($donnees = mysql_fetch_array($reponse))
                        {
                        $heure=date('d/m/Y à H\hi', $donnees['timestamp']);
                        echo '<p><strong>' .$donnees['pseudo']. '</strong> ';
                        if ($donnees['mail'] != NULL)
                                echo '(<a href=\"mailto:' .$donnees['mail']. '\">' .$donnees['mail']. '</a>) ';
                        if ($donnees['ville'] != NULL)
                                echo 'de ' .$donnees['ville']. ', ';
                        echo 'le ' .$heure. '</p> <p>' .$donnees['message']. '</p>';
                        }
// On fait une boucle pour écrire les liens vers chacune des pages
                if ($totalDesMessages == 1)
                        echo "<center>Page : 1</center><br />";
                else if ($totalDesMessages > 1)
                        {
                        echo "<center>Pages : ";
                        for ($i = 1 ; $i <= $nombreDePages ; $i++)
                                echo '<a href="index.php?feuil=livreor&amp;page=' . $i . '">' . $i . '</a> ';
                        echo "</center> <br />";
                        }
                mysql_close(); 
        ?>
</div>


Puis j'ai fait le code classique qui vérifie les entrées avant de sauvegarder le message. S'il n'y a pas de message ou pseudo, il ne sauvegard pas et enregistre dans la variable $erreur le message à afficher dans la dernière ligne du tableau.
[#][color=red]Comment faire pour que le message d'erreur s'affiche bien dans la dernière ligne du tableau (lorsqu'il y a erreur)? car pour l'instant même s'il y a des erreurs, rien ne s'affiche...!

Autre problème :
j'ai rajouté dans les input, cette condition :
value="<?php if (isset($mail)) echo($_POST['mail']); 

pour que s'il y a des erreurs, il raffiche le texte déjà tapé (pour que le visiteur ne retape pas tout de nouveau) mais le problème est que si le message n'a pas d'erreur, ça affiche quand même le texte dans les input alors que je ne veux pas... : [#][color=red]comment faire pour que si le message a été enregistré, il ne raffiche pas le texte tapé dans les input ?

Merci de votre aide car je ne vois pas où sont les erreurs commises pour ces deux problèmes !!
Modifié par telecofr (05 Feb 2007 - 16:29)
Tu peux mettre le code qui te permet de gérer la sauvegarde du message, sinon c'est pas trés compréhensible...

Pour ta deuxième question, c'est plutot logique : le serveur ne sait pas que tu ne veux afficher la value des champs qu'en cas d'erreur, tu dois modifier ta condition en conséquence.
j'ai édité pour remettre le code en entier du livre d'or.

Pour la deuxième question (le fait que le texte reste quand même dans les imput alors que le message a été sauvegardé), j'efface les variable $_POST après la sauvegarde et dans le tableau il y a la condition "si $_POST n'est pas vide alors affiche le texte tapé" : mais ca ne marche pas...
Je peux tout de suite répondre à ta deuxième question, au lieu du
if(isset($_POST))

met plutot un
if($erreur!='')

Tu saura ainsi si ton script à trouvé une erreur d'ou l'utilité ou non de rafficher les données du formulaire.

Pour la suite, à première vue, j'avoue ne pas voir ce que ça peut etre, surtout que le validateur me renvoie pas d'erreur. Je ne pense pas qu'une requete select count(*) puisse renvoyer null, non?
Désolé, sur le coup je suis lrgué, bonne chance malgré tout, en espérant queqelqu'un de plus perspicace puisse t'aider. Au pire, tente un forum plus "phpien"
Salut,
Tu aurais plus de chance de recevoir des réponses à tes questions qui concernent purement PHP en postant ton sujet sur l'un des forums qui te sont indiqués ici : Post it du salon