Sujet certainement récurrent mais je n'y connais rien....

Petit nouveau ! | 4 Messages

23 juil. 2008, 12:29

Bonjour, on m'a développer une application php que je fais fonctionnement avec esayphp sur mon pc portable sans problème.

J'ai voulu intégrer la base de données dans mon nas synology. Pas de souci, base de donées crée. J'ai ensuite réimporter les fichier du dossier www de esayphp. Pas de souci. Mais quand je veux me connecter avec admin/admin j'ai ce message d'erreur :

Warning: Cannot modify header information - headers already sent by (output started at /volume1/web/conduite_ligne_faconnage/admin/index.php:12) in /volume1/web/conduite_ligne_faconnage/admin/index.php on line 25


Voila le code pour index.php
<?php require "../includes/odbc_admin.php";

// déclaration des variables
if (!empty($_POST['send'])) { $send = $_POST['send']; } else { $send = "";}
if (!empty($_POST['login'])) { $login = $_POST['login']; } else { $login = ""; }
if (!empty($_POST['pwd'])) { $pwd = $_POST['pwd']; } else { $pwd = ""; }
if (!empty($_GET['err'])) { $err = $_GET['err']; } else { $err = "";}
if (!empty($_GET['n'])) { $n = $_GET['n']; } else { $n = "";}

?>
<link rel=stylesheet href="../includes/style_home.css">
<?php
// -------------------------------------------------------------------------------------
// Test Login
// -------------------------------------------------------------------------------------

if ($send =='Accés sécurisé') {
	$sql = "SELECT * FROM utilisateur WHERE login='".$login."' AND pwd='".$pwd."'";
	$recherche = mysql_query($sql);
	if ($affichage = mysql_fetch_array($recherche)) {
		$_SESSION['id_utilisateur'] = $affichage['id'];
		$_SESSION['utilisateur'] 	= "ok";
		$_SESSION['admin'] 			= $affichage['administrateur'];
		if ($affichage['administrateur']==true) {
			header("location:bandeau_haut.php"); 
		} else {
			header("location:document_utilisateur.php");
		}
	} else {
		$err = 1;
		$_SESSION['utilisateur'] = "";	
	}
} 
?>

<!------------------------------------------------------->
<!--------------------Début de page---------------------->
<!------------------------------------------------------->
<script>

</script>
<br><br><br><br><br><br><br>
<form name=f action="index.php" method=post onSubmit="return verif();">
<center>
<table class=norm border=0 cellspacing=10 cellpadding=5>
	<tr>
		<td valign=top>
		<table width=100% border=1 bordercolor=#8a8a8a cellspacing=0 cellpadding=5 class=norm >
			<tr bgcolor=#8a8a8a style="color:#ffffff">
				<td colspan=3><b>Administration</td>
			</tr>
			<tr>
				<td>
				<table width=100% border=0 cellspacing=0 cellpadding=5 class=norm >
					<tr>
						<td width=150><b>Login : </td>
						<td><input class=champ type=text name=login id=login size=20 maxlength=202></td>
					</tr>
					<tr>
						<td width=150><b>Mot de passe : </td>
						<td><input class=champ type=password name=pwd id=pwd  size=20 maxlength=20></td>
					</tr>
					<tr>
						<td colspan=3 align=center><br><input class=bouton type=submit name=send id=send value="Accés sécurisé"></td>
					</tr>
				</table>
				</td>
			</tr>
		</table>
		</td>
	</tr>
</table>
</center>
</form>


<!------------------------------------------------------->
<!--------------------Fin de page---------------------->
<!------------------------------------------------------->

<script language=javascript>f.login.focus();</script>

<script>
function alerte(pos,txt){alert(txt);pos.focus();return false;}
function verif (){
	if(document.getElementById('login').value=='') return alerte(document.getElementById('login'),'Veuillez indiquer votre login');
	if(document.getElementById('pwd').value=='') return alerte(document.getElementById('pwd'),'Veuillez indiquer votre mot de passe'	);
}

<?php if ($err=='1')  { ?>
	alert('Le login ou le mot de passe que vous avez entré est incorrect.')
<?php 
}
if ($n==1) { ?>
	alert('Vous avez été déconnecté pour des raisons de sécurité.\nPour accéder au site, veuillez vous identifier.');
<?php } ?>

Voilà le code pour bandeau_haut


<?php require "./includes/haut.php"; ?>
<br><br>
<center>
<?php
$sql ="SELECT * FROM bandeau";
$recherche = mysql_query($sql);
$couleur=""; 
if ($affichage = mysql_fetch_array($recherche)) {
	$couleur = $affichage['couleur'];
}	
if ($couleur!="") {
	//$couleur = substr($couleur,1);
	//$couleur = substr($couleur,1); 
}
?>
<table border=0 class=norm cellpadding=2 cellspacing=0 width="500">
	<form name=f action="bandeau_haut_exe.php" method="post" ENCTYPE="multipart/form-data">
	<tr>
		<td>Image d'accueil</td><td>&nbsp;:&nbsp;<input type=file name=image_accueil class=champ></td>
	</tr>
	<tr>
		<td>Image du bandeau</td><td>&nbsp;:&nbsp;<input type=file name=image_bandeau class=champ></td>
	</tr>
	
	<tr>
		<td>Image du logo</td><td>&nbsp;:&nbsp;<input type=file name=image_logo class=champ></td>
	</tr>
	
	<tr>
		<td>Couleur de fond</td><td>
		<table border=0 class=norm cellpadding=0 cellpacing=0>
			<tr>
				<td>:&nbsp;</td>
				<td>
					<table border=0 class=norm cellpadding=1 cellspacing=0 class=norm style='width:140px;border:1px solid black;<?php if($couleur!="") {echo "background-color:#".$couleur.";";}?>' id='tableau_cou'>
						<tr>
							<td>&nbsp;</td>
						</tr>
					</table>
				</td>
				<td>&nbsp;<input type=hidden name=couleur id=couleur value="<?php echo $couleur;?>"><img src="../graphs/bt_couleur.jpg" align="absmiddle" onClick="aff_couleur();"></td>
			</tr>
			
		</table>
		</td>
	</tr>
	<tr>
		<td></td>
		<td colspan=2><iframe name=choix_couleur id=choix_couleur frameborder="0" scrolling="no" src="select_color.html" width=190 height=162 style='margin-left:5px;'></iframe></td>
	</tr>
	<tr>
		<td colspan=2><center><input type=submit name="Valider" value="Valider" class=bouton></center></td>
	</tr>
	</form> 
</table>
</center>
<script>

	function aff_couleur() {
		document.getElementById('choix_couleur').setAttribute("src","select_color.html");
	}

</script>
<?php require "./includes/bas.php"; ?>
[/php]


Quelqu'un à une idée sur mon problème?

merci d'avance

Thomas

ViPHP
ViPHP | 5924 Messages

23 juil. 2008, 12:40

Je te renvoie vers la doc de la fonction header() :
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.

Petit nouveau ! | 4 Messages

23 juil. 2008, 13:53

Merci pour l'indiquation.

Je voulais par contre savoir si l'erreur indiquée concernait le index.php ou le script qui est appelé ligne 25 "bandeau_haut.php

Merci d'avance

Mammouth du PHP | 1353 Messages

23 juil. 2008, 13:58

L'erreur est dans index.php, car il n'arrive pas à exécuter la fonction header().

Regarde du coté de ton encodage, si tu n'est pas en UTF-8 sans BOM alors la fonction include écrit un caractère qui empéchera le header de fonctionner correctement. Ca peut venir de la.
Il y a aussi beaucoup d'espaces surperflus dans ton code, ca peut jouer...

Cherche le mot BOM dans les forums ou sur google pour plus de détails ;)
Tell me and I forget. Teach me and I remember. Involve me and I learn.

ViPHP
ViPHP | 5924 Messages

23 juil. 2008, 14:29

Euh, avant de chercher dans le probable mais vraiment pas sûr, il faut s'intéresser à la source réelle de l'erreur. L'erreur indique que l'affichage a commencé à la ligne 12, et je n'ai pas besoin de compter pour savoir que c'est celle ci :

Code : Tout sélectionner

<link rel=stylesheet href="../includes/style_home.css">
S'il y avait, par un malheureux hasard, eu un problème de BOM, l'erreur aurait indiqué une sortie à la ligne 1, ce qui manifestement n'est pas le cas. Donc il ne fallait pas chercher si loin...

Petit nouveau ! | 4 Messages

23 juil. 2008, 14:35

J'ai effectivement virer cette ligne
<link rel=stylesheet href="../includes/style_home.css">
et maintenant cela passe!!!! miracle. COmme j'y connais rien, a quoi correspond cette phrase et surtout pourquoi sur mon pc cela marchait sans problème alors que mon nas me la détecté?

Merci d'avance et excuse mon ignorance mais comme tout le monde est en vacance c'est moi qui me tape l'integration ce ces scripts......

Un grand merci

Mammouth du PHP | 1353 Messages

23 juil. 2008, 14:35

Euh, avant de chercher dans le probable mais vraiment pas sûr, il faut s'intéresser à la source réelle de l'erreur. L'erreur indique que l'affichage a commencé à la ligne 12, et je n'ai pas besoin de compter pour savoir que c'est celle ci :

Code : Tout sélectionner

<link rel=stylesheet href="../includes/style_home.css">
S'il y avait, par un malheureux hasard, eu un problème de BOM, l'erreur aurait indiqué une sortie à la ligne 1, ce qui manifestement n'est pas le cas. Donc il ne fallait pas chercher si loin...
Exact, désolé j'ai lu un peu vite ! (j'ai eu ce problème de BOM sur un include recemment et depuis je vois le mal partout :evil: )

Sorry :agenouille:
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Mammouth du PHP | 959 Messages

23 juil. 2008, 14:46

COmme j'y connais rien, a quoi correspond cette phrase et surtout pourquoi sur mon pc cela marchait sans problème alors que mon nas me la détecté?
Une phrase ? ^^
Ça sers tout simplement à appeler la feuille de style CSS, c'est la mise en forme de la page
Au lieu de la supprimer, tu aurais dû la déplacer...

ViPHP
ViPHP | 5924 Messages

23 juil. 2008, 15:36

J'ai effectivement virer cette ligne
<link rel=stylesheet href="../includes/style_home.css">
et maintenant cela passe!!!! miracle. COmme j'y connais rien, a quoi correspond cette phrase et surtout pourquoi sur mon pc cela marchait sans problème alors que mon nas me la détecté?
Alors pourquoi est ce que cela ne fonctionnait pas sur le serveur, je t'ai déjà donné la réponse, elle est dans la doc aussi, à savoir que si tu envoies quoique ce soit au navigateur avant le header(), tu as une erreur, car les headers doivent être envoyés avant le moindre contenu. Dans ton cas tu as affiché <link rel=stylesheet href="../includes/style_home.css"> (tout ce qui est hors des balises <?php ?> est envoyé tel quel au navigateur) donc tu as envoyé du contenu au navigateur avant la fonction header, donc, conformément à ce que j'ai dit avant, PHP te mets une erreur pour te signaler qu'il a déjà envoyé les headers.

Ensuite, pourquoi est ce que cela fonctionnait en local, je pense que ton phpinfo t'indiquerait que l'output_buffering est activé, ce qui te fournit un tampon, tant que ce buffer n'est pas plein, aucun contenu n'est envoyé au navigateur, donc les headers non plus. On peut donc considérer que même si tu as affiché du texte sur ta page, il n'a pas encore nécessairement été envoyé, donc cela explique que tu n'as pas eu d'erreur en local.
Vérifie la valeur de l'output_buffering si tu veux entériner mon hypothèse.

Petit nouveau ! | 4 Messages

23 juil. 2008, 16:05

C'est effectivement cette histoire d'output_buffering qui me cacher l'erreur. Et comme mon nas est en linux et que je n'arrive a avoir accés au contenu a l'aide de winscp je ne peux pas aller changer les paramètres sur celui-ci.....En attendant de devenir pro de php et programmation linux......

Merci encore pour les explications trés claires et peut-être à bientôt pour d'autres soucis.....

Thomas

ViPHP
ViPHP | 5924 Messages

23 juil. 2008, 16:47

Je te suggère de t'y connecter en ssh via putty (que tu trouveras sur internet).