Tunidesign Posté(e) le 15 octobre 2005 Partager Posté(e) le 15 octobre 2005 Salut voila j'ai creer un peti livre d'or pour mon site et il marches normalement, le seul probleme c'est que quand je poste un message tout va bien il s'affiche apres le rafraichissement ... mais si je rafraichis encore le message se reposte, et ainsi de suite. c'est tres embetant. en fesant une recherche j'ai vu que la fonction header etait faite pour cela mais j'ai essayé de la metre partout il me donne tout le temps un message d'erreur quelque part sur la page. voici le header que j'ai trouvé : header("HTTP/1.1 301 Moved Permanently"); header ('location: index.php'); header("Connection: close"); Est il bon ? ^^ savez vous ou le metre ? ------------------------ Voici ma page : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Livre d'or</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <style type="text/css"> form, .pages { text-align:center; } </style> </head> <body> <form method="post" action="livreor.php"> <p>Laissez moi un message sur mon site dans le livre d'or :</p> <p> Pseudo : <input name="pseudo" /><br /> Message :<br /> <textarea name="message" rows="8" cols="35"></textarea> <br /> <input type="submit" value="Envoyer" /> </p> </form> <p class="pages"> <? mysql_connect("localhost", "root", ""); mysql_select_db("test"); // --------------- Etape 1 ----------------- // Si un message est envoyé, on l'enregistre // ----------------------------------------- if (isset($_POST['pseudo']) AND isset($_POST['message'])) { $pseudo = htmlentities($_POST['pseudo'], ENT_QUOTES); // On utilise htmlentities par mesure de sécurité $message = htmlentities($_POST['message'], ENT_QUOTES); // De même pour le message $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br /> // On peut enfin enregistrer :o) mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')"); } // --------------- 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; // Essayez de changer ce nombre pour voir :o) // On récupère le nombre total de messages $retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor'); $donnees = mysql_fetch_array($retour); $totalDesMessages = $donnees['nb_messages']; // On calcule le nombre de pages à créer $nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage); // Puis on fait une boucle pour écrire les liens vers chacune des pages echo 'Page : '; for ($i = 1; $i <= $nombreDePages; $i++) { echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> '; } ?> </p> <? // --------------- 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); while ($donnees = mysql_fetch_array($reponse)) { echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>'; } mysql_close(); // On n'oublie pas de fermer la connexion à MySQL;o) ?> </body> </html> voila dsl pour tout le code mais c'est juste pour me montrer ou il faut placer le header ^^ merci d'avoir lu mon post bonne continuation ++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 15 octobre 2005 Partager Posté(e) le 15 octobre 2005 Voilà comment il faudrait faire : 1. sur la page avec le formulaire, l'utilisateur entre son message et valide 2. la page de traitement (valeur du champ ACTION de la balise FORM) est lancée et insère le commentaire en base. Cette page peut être la même que celle affichant le formulaire. 3. après avoir inséré le commentaire en base, utilise la commande suivante : header("Location: XXX"); en remplaçant XXX par le nom de la page vera laquelle l'utilisateur doit être redirigé après avoir posté son commentaire. Cette technique est courante et n'est pas spécifique à PHP, cela s'appelle le "post & redirect", et permet justement d'éviter le multi-post. J'espère que ça t'aide :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Tunidesign Posté(e) le 15 octobre 2005 Auteur Partager Posté(e) le 15 octobre 2005 Donc voila, si j'ai bien compris c'est juste apres l'enregistrement que l'on fait la redirection, ensuite arrive donc l'affichage. Voila j'ai mi le header juste apres l'enregistrement et avant l'etape 2 qui est le calcul des pages, voici mon code : (...) // On peut enfin enregistrer :o) mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')"); header("Location: index.php"); } // --------------- Etape 2 ----------------- // On écrit les liens vers chacune des pages // ----------------------------------------- // On met dans une variable (...) et voila ce qui apparait : En haut : le formulaire Au centre : Warning: Cannot modify header information - headers already sent by (output started at c:\documents and settings\samir\mes documents\tunidesign 1.0\tests php\livre d'or\livreor.php:6) in c:\documents and settings\samir\mes documents\tunidesign 1.0\tests php\livre d'or\livreor.php on line 46 Et en bas : les messages C'est bizarre ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 15 octobre 2005 Partager Posté(e) le 15 octobre 2005 Non c'est normal, il ne faut qu'absolument aucune information n'ait été envoyée au browser pour que la commande header fonctionne. Donc généralement on a deux solutions : 1. Utiliser un script PHP différent qui fait juste le traitement (mise en base), puis redirige vers la page suivante (index.php dans ton cas) 2. Utiliser le même script pour faire à la fois l'affichage du formulaire et son traitement; dans ce cas, on utilise une variable pour signaler que le formulaire a été posté (ex: ...&post=1), et fare un test dans le code : si post=0, on affiche le formulaire normalement, et si post=1 on n'affiche rien, on met en base, et on redirige. J'insiste sur le fait que dans ce cas, aucun affichage ne doit être parti vers le browser avant que la commande "header" soit appelée, et donc que le test doit être fait au tout début du script. Voici un exemple : <? if (isset($_POST["post"]) && $_POST["post"]==1) { // ... ici la mise en base ... header("Location: index.php"); } ?> // et ici le code HTML normal <html> // ... affichage du formulaire ... </html> Tu remarques que même la balise <html> est placée après le test. Vérifie aussi qu'il n'y a aucun espace ou ligne blanche avant le bloc php qui fait le test. La balises de php (<?) doit être le premier caractère de ton script ! EDIT : J'oubliais, dans la solution n°2, il faut bien sûr un champ caché <input type="hidden" name="post" value="1"/> dans ton formulaire, pour positionner la variable "post". Dis moi si ça marche mieux ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Tunidesign Posté(e) le 16 octobre 2005 Auteur Partager Posté(e) le 16 octobre 2005 ahhhhhh okkkkkkkkkk oui en faite j'ai deplacé mon PHP de conection au desus de totu avec un header location vers la page encours et sa marche impec merci beaucoup !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.