Warning: Cannot modify header information !

Eléphant du PHP | 187 Messages

20 nov. 2012, 12:51

Bonjour,
j'ai un souci dont j'ai essayé plusieurs solutions mais sans résultats :/
dernièrement mon site donne ce problème à l'administrateur:
Warning: Cannot modify header information - headers already sent by (output started at..... on line 44
Alors que Moi je me connecte sans aucun problème!je comprends pas pourquoi?
voilà ma page:
<?php session_start(); ?>
<?php if(isset($_SESSION['login']) && isset($_SESSION['pass'])){ 

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" href="style.css" media="screen" />
<link rel="stylesheet" href="CalendarControl.css" media="screen" />
<link rel="stylesheet" type="text/css" media="screen" href="screen.css" />
<script type="text/javascript" src="ADxMenu.js"></script>
<script src="SpryAssets/SpryMenuBar.js" type="text/javascript"></script>
<link href="SpryAssets/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" />
<link href="SpryAssets/SpryMenuBarVertical.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="main_container">'
?>
<?php include("top.php");
?>

<?php include("p_gau.php");?>


<?php echo '<div class="left_box2">
<table width="598" border="0">
  <tr>
    <td width="77" height="196" >    </td>
<td width="511">';?>
  <?php  require("include.php");?>
	<?php echo'</td>
  </tr>
</table>
</div>

</div>
</body>
</html>';
}else 
{
echo "inexistants"; 
header('location:/basketball/index.php');
}
?>
J'essayé de commenter la dernière echo,alors il donne cet erreur :
Oups ! Petit problème... Ce lien semble brisé.

Priere de m'aider et merci d'avance.

Avatar du membre
Mammouth du PHP | 1609 Messages

20 nov. 2012, 12:57

Problème classique. Ça m'étonne que tu n'ai pas trouvé avec une recherche du message d'erreur.
Tu dois avoir un header en ligne 44 de je ne sais pas quel fichier. Hors si tu as déjà des sorties au dessus du header ça provoque cette erreur.
Il ne doit y avoir aucune sortie avant un appel de la fonction header.

EDIT à priori ça doit être le header en bas de page qui génère l'erreur.
Pourquoi ouvres tu et fermes tu plusieurs fois les balises php alors que tu n'as aucune sortie html entre (juste des blancs). C'est ça qui provoque l'erreur (RE-EDIT c'est vrai que le echo avant le header est à jeter car il va forcément provoquer l'erreur, honte sur moi. Et comme dit Nagol n'importe quelle sortie html avant ton header provoquera également l'erreur).
Tu devrais plutôt écrire :
<?php 
session_start();

if(!isset($_SESSION['login']) || !isset($_SESSION['pass'])){
  header('location:/basketball/index.php');
  exit();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" href="style.css" media="screen" />
<link rel="stylesheet" href="CalendarControl.css" media="screen" />
<link rel="stylesheet" type="text/css" media="screen" href="screen.css" />
<script type="text/javascript" src="ADxMenu.js"></script>
<script src="SpryAssets/SpryMenuBar.js" type="text/javascript"></script>
<link href="SpryAssets/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" />
<link href="SpryAssets/SpryMenuBarVertical.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="main_container">
<?php
include("top.php");
include("p_gau.php");
?>
<div class="left_box2">
<table width="598" border="0">
  <tr>
    <td width="77" height="196" >    </td>
<td width="511">

<?php require("include.php"); ?>

</td>
  </tr>
</table>
</div>

</div>
</body>
</html>
Modifié en dernier par Saian le 20 nov. 2012, 13:25, modifié 2 fois.
Développeur web depuis + de 20 ans

Eléphant du PHP | 267 Messages

20 nov. 2012, 13:20

salut,

tu ne peux pas avoir un echo avant un header
echo "inexistants";
header('location:/basketball/index.php');
il faut supprimer le : echo "inexistants";

@+
dix2

ViPHP
ViPHP | 3300 Messages

20 nov. 2012, 13:22

Comme dit plus haut un echo peut faire ça, mais un include d'un fichier qui contient un saut de ligne derrière une fermeture de balise php peut faire ça aussi, en fait tout "retour" html peut provoquer ça.
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 187 Messages

21 nov. 2012, 11:00

merci pour toutes vos réponses,alors j'ai essayé le code de @Saian en commentant comme vous m'avez dit le echo'inexsisttant',Mais ça marche pas et il m'affiche cet erreur:
Oups ! Petit problème... Ce lien semble brisé.
Suggestions :
Accédez à la page : www.monsite.ma
Rechercher www.monsite.ma pour basketball index
Rechercher sur Google :
comment puis_je résoudre ça et se connecté sur la session admin alors :(

Mammouth du PHP | 2278 Messages

21 nov. 2012, 11:11

Si je me fie à la doc:
http://fr2.php.net/manual/fr/function.header.php

echo "inexistants";
header('location:/basketball/index.php', TRUE);
devrait faire l'affaire
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Mammouth du PHP | 1609 Messages

21 nov. 2012, 11:13

Tu as du oublier de lire ce passage alors...
N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include ou require, et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.
EDIT
Je vois que tu utilises le deuxième paramètres. Jamais testé alors peut être que tu as raison désolé. ^^
RE-EDIT
Par curiosité j'ai testé un echo puis un header() avec deuxième paramètre à true et la redirection fonctionne sans provoquer d'erreur. Mais ça n'a à priori pas de rapport avec ta dernière erreur de lien brisé xzena.
Modifié en dernier par Saian le 21 nov. 2012, 11:55, modifié 6 fois.
Développeur web depuis + de 20 ans

Eléphant du PHP | 187 Messages

21 nov. 2012, 11:25

donc je vais essayé le: header('location:/basketball/index.php', TRUE); en gardant le méme code que j'ai !
j'espère ça marchera cette fois,merci

Eléphant du PHP | 267 Messages

21 nov. 2012, 11:42

Si je me fie à la doc:
http://fr2.php.net/manual/fr/function.header.php

echo "inexistants";
header('location:/basketball/index.php', TRUE);
devrait faire l'affaire
Où vois-tu dans la doc qu'on peut envoyer des données avant un header ?
Il est justement indiqué le contraire :
N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.

Eléphant du PHP | 187 Messages

21 nov. 2012, 12:03

beh j'ai essayé au lieu du lien relatif un lien absolue:

Code : Tout sélectionner

header('location:http://www.monsite.ma/admin/index.php');
et quand je saisi le login et mot de passe,il me demande encore de le saisir et insi de suite..:/

Eléphant du PHP | 187 Messages

21 nov. 2012, 12:14

le problème c'est que chez moi il existe pas ce problème,mais chez l'amdin oui il arrive pas troujours à se connecter!
je sais pas pourquoi!!il faut peut etre qu'il supprime son cache ou je sais pas??

ViPHP
ViPHP | 4039 Messages

21 nov. 2012, 12:24

En passant, puisqu'on en parlait dans un autre sujet, tu utilises quel éditeur, Notepad++ ? Quel encodage de fichier, UTF-8 avec ou sans BOM ?

Je dis ça parce qu'un encodage UTF-8 avec BOM donne exactement ce genre de comportement inattendu (même que ça marche chez certains et pas chez d'autres) :wink:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Avatar du membre
Mammouth du PHP | 1609 Messages

21 nov. 2012, 12:28

S'il est redirigé vers le header c'est que soit $_SESSION['login'] soit $_SESSION['pass'] soit les 2 ne sont pas définis.
Et au passage quel intérêt de garder le mot de passe dans la session ? pas top niveau sécurité.
Développeur web depuis + de 20 ans

Eléphant du PHP | 187 Messages

21 nov. 2012, 12:30

En passant, puisqu'on en parlait dans un autre sujet, tu utilises quel éditeur, Notepad++ ? Quel encodage de fichier, UTF-8 avec ou sans BOM ?

Je dis ça parce qu'un encodage UTF-8 avec BOM donne exactement ce genre de comportement inattendu (même que ça marche chez certains et pas chez d'autres) :wink:
oui J'ai le charset=utf-8",editeur: dreamweaver
pour le BOM,je pense ça veut dire le blanc qui se trouve entre les balises??
hmmm je pense je l'ai pas sur mon code:
<?php 
session_start();

if(!isset($_SESSION['login']) || !isset($_SESSION['pass'])){
 // echo "inexistants";
//  header('location:/basketball/index.php');
header('location:http://www.monsite.ma/admin/index.php');
  exit();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" href="style.css" media="screen" />
<link rel="stylesheet" href="CalendarControl.css" media="screen" />
<link rel="stylesheet" type="text/css" media="screen" href="screen.css" />
<script type="text/javascript" src="ADxMenu.js"></script>
<script src="SpryAssets/SpryMenuBar.js" type="text/javascript"></script>
<link href="SpryAssets/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" />
<link href="SpryAssets/SpryMenuBarVertical.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="main_container">
<?php
include("top.php");
include("p_gau.php");
?>
<div class="left_box2">
<table width="598" border="0">
  <tr>
    <td width="77" height="196" >    </td>
<td width="511">

<?php require("include.php"); ?>

</td>
  </tr>
</table>
</div>

</div>
</body>
</html>

ViPHP
ViPHP | 2577 Messages

21 nov. 2012, 12:36

Peut être que tu n'alimentes pas tes 2 variables de sessions ?