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


Carouge10
Réponse acceptée

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.

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
Auteur

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.

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()).

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); 

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
Auteur

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');
?>

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

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

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
Auteur

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 !!!

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