Php Warning: Cannot modify header information

Résolu
Bonjour,
je suis entrain de faire mon site et j'ai un problème:
Voilà alors j'ai fait un menu qui est composé de ce code :
<?php
if (isset ($_SESSION['login'])) {
echo 'Bienvenue ici!</h4>

        <li>
                <a href="messagerie.php">Messagerie</a>
        </li>
        
        <li>
                <a href="prop_news.php">Proposez une News</a>
        </li>
        
        <li>
                <a href="forum/ucp.php?mode=register&sid=0b40018937c8f5d85ea482a0d1d62341">Inscription au Forum</a>
</li>
        
        <li>
                <a href="astuces.php">Astuces</a>
</li>
        
		<li>

        <a href="livre_or.php">Livre D\'or</a></li>
       <br />
		<a href="deconnexion.php">Déconnexion </a>
';
}
else if (!isset ($_SESSION['login'])){
echo '<center>
<h4>Connexion l\'espace membres :</h4>
<form action="" method="post">
  Login : <input type="text" name="login"><br />
Mot de passe : <input type="password" name="pass"><br />
<input type="submit" name="connexion" value="Connexion">
</center>';
}
?>

Qui permet aux membres de se connecter depuis ce menu et comme vous avez vu action se fait directement depuis cette page grace à ce code :
<?php
session_start();
?> 
<?php
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

		$base = mysql_connect ('mystère', 'et boule', 'de');
		mysql_select_db ('gomme', $base);

		$sql = 'SELECT id FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$nb = mysql_num_rows($req);

		if ($nb == 1) {
			$data = mysql_fetch_array($req);

			session_start();
			$_SESSION['login'] = $_POST['login'];
			$_SESSION['id'] = $data['id'];

			mysql_free_result($req);
			mysql_close();

			header('Location: index.php');
			exit();
		}
		elseif ($nb == 0) {
			$erreur = 'Compte non reconnu.';
		}
		else {
			$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
		}
		mysql_free_result($req);
		mysql_close();
	}
	else {
		$erreur = 'Au moins un des champs est vide.';
	}
}
?>

et quand je me connecte ça m'affiche ça :
Warning: Cannot modify header information - headers already sent by (output started at /mnt/159/sdc/9/d/nom_de_mon_site/beta/include/connec.php:4) in /mnt/159/sdc/9/d/nom_de_mon_site/beta/include/connec.php on line 25

Voilà merci d'avance !
Configuration: windows vista 
windows 7 en machine virtuel
2 GO de ram

8 réponses

  1. Tu ne peux plus modifier les entêtes HTTP une fois qu'un caractère de la apge a été envoyé au client.
    Donc avant le premier "<?php", il ne doit y avoir aucun caractère (espace compris), et tu ne dois faire aucun echo/print(f) avant la fonction header().
    Tu peux utiliser la tamporisation de sortie si tu ne veux pas être ennuyé avec ça :
    http://www.siteduzero.com/tutoriel-3-38102-la-tamporisation-de-sortie-en-php.html
    1. Je ne comprend pas :( !
      pouvez vous m'aider un peu plus ?
      1. Contributeur
        tu as mis sur ton deuxieme code deux fois session_start;

        1 en premiere ligne et l' autre plus bas.

        Il ne faut en mettre qu' un et il doit etre avant tout code html.

        Supprime celui-ci (juste session_start)

        session_start();
        $_SESSION['login'] = $_POST['login'];
        $_SESSION['id'] = $data['id'];
        1. Tu as aussi au début :
          ?> 
          <?php
          

          Ca va envoyer un retour à la ligne au navigateur et tu ne pourras plus faire d'header après, et ca ne sert à rien de fermer le bloc php pour le rouvrir tout de suite.
          1. non c'est que je n'est pas pu aller sur mon ordinateur cette semaine !
            je vais tester ça !
            merci d'avance !
            1. je viens de tester j'ai modifier mon code comme ça :
              <?php
              session_start();
              if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
              	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
              
              		$base = mysql_connect ('mystère', 'et boule', 'de');
              		mysql_select_db ('gomme', $base);
              
              		$sql = 'SELECT id FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"';
              		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
              		$nb = mysql_num_rows($req);
              
              		if ($nb == 1) {
              			$data = mysql_fetch_array($req);
              
              			$_SESSION['login'] = $_POST['login'];
              			$_SESSION['id'] = $data['id'];
              
              			mysql_free_result($req);
              			mysql_close();
              
              			header('Location: index.php');
              			exit();
              		}
              		elseif ($nb == 0) {
              			$erreur = 'Compte non reconnu.';
              		}
              		else {
              			$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
              		}
              		mysql_free_result($req);
              		mysql_close();
              	}
              	else {
              		$erreur = 'Au moins un des champs est vide.';
              	}
              }
              ?>