Header fait des siennes

Par Steph83, il y a 11 ans


Bonsoir,
Je suis en train de me former sous PHP. J'ai comme exercice un minichat à créer, avec possibilité de se créer un compte ou d'enregistrer un message avec un pseudo.
Voici le code index.php :

<?php session_start(); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>MiniChat de Steph en PHP fait maison</title> <link rel="stylesheet" href="chat.css" /> </head> <body> <form method="post" action="minichat.php"> <?php //test si l'utilisateur s'est connecté if (isset($_SESSION['pseudo'])) { //dans ce cas on ne lui redemande pas son pseudo echo '<input type="hidden" name="pseudo" value='.$_SESSION['pseudo'].'>'; echo '<p><strong>'.$_SESSION['pseudo'].'</strong>- Message :<input type="text" name="message" /></p>'; } else //on lui donne la possibilité de se connecter ou de remplir son pseudo { echo '<a href="connexion.php">se connecter</a>'; echo '<p>Pseudo :<input type="text" name="pseudo" /></p>'; echo '<p>Message :<input type="text" name="message" /></p>'; } ?> <p><input type="submit" name="Envoyer" value="Valider"/></p> </form> <?php include('infoconnexion.php'); try { //lecture de toutes les billets existants $bdd = new PDO('mysql:host='. $host_name .';dbname='. $database , $user_name , $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $lecture=$bdd->query('SELECT pseudo,messagetext,dateMessage FROM message ORDER BY ID DESC LIMIT 10'); while($ligne=$lecture->fetch()) { echo '<a style="font-size:1em"><strong>'.htmlspecialchars($ligne['pseudo']).'</strong></a><a style="font-size:small"> ('.$ligne['dateMessage'].')</a> : <a style="font-style:italic">'.htmlspecialchars($ligne['messagetext']).'</a><br/>'; } $lecture->closeCursor(); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } ?> </body> </html>

le code insert du billet

<?php include 'infoconnexion.php'; if(isset($_POST['pseudo']) AND strlen($_POST['message'])>0) { try { //insertion du nouveau billet $bdd = new PDO('mysql:host='. $host_name .';dbname='. $database , $user_name , $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $ajoutMessage= $bdd->prepare('INSERT INTO message(pseudo,messagetext) VALUES(:pseudo,:message)') ; $ajoutMessage->execute(array( 'pseudo'=>$_POST['pseudo'], 'message'=>$_POST['message'] )); $ajoutMessage->closeCursor(); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } //retour à la page d'acceuil header('Location: index.php'); ?>

tout se passe correctement sauf le header qui ne me renvoie pas sur mon index.php

Si quelqu'un a une explication, je suis preneur.
Merci.

12 réponses

Spiker, il y a 11 ans

Bonsoir,

Ton code ne t'affiche aucune erreur ? As tu xdebug d'activé ?
Essaye de supprimer ton code avant le header, voir si c'est ça qui le fait planter.

Steph83, il y a 11 ans

Bonjour Alexandre,
Non il n'affiche aucune erreur, mes données sont ajouter dans la base, je reste sur la page minichat.php. J'utilise NetBean's 8.02, le xdebug est activé, pour autant j'ai une attente en cours "Waiting for connection (netbeans-xdebug), je n'en connais pas vraiment la raison.

mxmaxime, il y a 11 ans

Salut,
Je n'ai pas trouvé d'erreur dans ton code..
As-tu du code html avant ce code php? (vérifie tes messages d'erreurs php on sait jamais..)
Sinon, vérifie que ton code arrive bien jusqu'au bout de l'exécution (avec xdbug ou un simple die()).

Carouge10, il y a 11 ans

Essayer ceci pour afficher toute les erreurs.
Il faut le mettre tout au début de vos fichiers php.

<?php error_reporting(E_ALL); ini_set("display_errors", 1);
JacobDelcroix, il y a 11 ans

Il ne faut RIEN afficher (pas de code HTML? echo, etc...) avant d'utiliser header() et n'oublie pas un p'tit exit; après aussi (même si là il est en fin de script)

Steph83, il y a 11 ans

Merci à tous pour votre aide, grace à Carouge10, il y a une erreur dans l'utilisation du header. En début de script j'inclus mes variables, me permettant de me connecter à ma base de données. Le debug m'informe que du html a déjà été généré. J'ai donc mis mes variable directement dans le script et ca fonctionne.
Maglré tout en regardant mon include je ne vois pas de génération de html sauf si le fait d'initialiser des variables via un include est considerer comme de la génération de html.
Mon include d'origine :

<?php $host_name = "dbabcdxxx.1and1.com"; $database = "dbabcdxxxx"; $user_name = "dboabcdxxxx"; $password = "xxxxxxxxx"; ?>

le code qui fonctionne

<?php error_reporting(E_ALL); ini_set("display_errors", 1); //include 'infoconnexion.php'; $host_name = "dbabcdxxx.1and1.com"; $database = "dbabcdxxxx"; $user_name = "dboabcdxxxx"; $password = "xxxxxxxxx"; if(isset($_POST['pseudo']) AND strlen($_POST['message'])>0) { try { //insertion du nouveau billet $bdd = new PDO('mysql:host='. $host_name .';dbname='. $database , $user_name , $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $ajoutMessage= $bdd->prepare('INSERT INTO message(pseudo,messagetext) VALUES(:pseudo,:message)') ; $ajoutMessage->execute(array( 'pseudo'=>$_POST['pseudo'], 'message'=>$_POST['message'] )); $ajoutMessage->closeCursor(); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } } //retour à la page d'acceuil header('Location: index.php'); ?>
Spiker, il y a 11 ans

Enlève le chevron fermant du <?php ?> dans ton fichier include.
Si ça ne marche toujours pas, copie-colle nous ton erreur ici ! (xdebug)

mxmaxime, il y a 11 ans

En effet, ton chevron fermant pourrait bien t'embêter dans certains cas ;)

Carouge10, il y a 11 ans

Très bon conseil de mes prédécesseur.
Pour justifier ce choix, cela évite les caractères après la balise fermante de php "?>", et oui les espaces ne se vois pas et sont considéré comme des caractères html.
Donc si vous n'avez pas besoin d'ajouter du code html après avoir fermer le php, ne mettez pas la balise, le compilateur le ferra tout seul et vous évitera beaucoup de problème.

l4p1n, il y a 11 ans

Sinon, y'a aussi l'encodage du fichier qui peut déranger si il y a le BOM en début de fichier avant le tag <?php

Steph83, il y a 11 ans

voilà le message d'erreur : "Cannot modify header information - headers already sent by (output started ...." pointant sur infoconnexion.php.
Après avoir enlever la balise fermante ?> ca fonctionne aussi ... donc il y avait bien un espace créé et comme le dit Carouge10, cela provoque par le compilateur comme un code HTML.
Merci pour votre aide à tous.
Un petit problème m'a appris plein de nouvelles choses. cool !!!

mxmaxime, il y a 11 ans

On apprend de nos erreurs ;) bonne continuation à toi l'amis!