[PHP] Problème avec header [RESOLU] - mais ou est le contenu envoyé avant ?

:hello: tous

Bon… là je jette l’éponge.

J’ai un problème de débutant que je n’arrive pas à résoudre :riva:

Le fameux "Warning: Cannot modify header information - headers already sent by (output started at …

Je suis très ennervé, car j’ai beau chercher, je ne vois aucun espace, ni rien de rien qui aurait pu créer du contenu avant l’en-tête.

Alors peut-etre que mes yeux fatiguent… aussi je vous passe le script, voire si quelqu’un peut y trouver LA petite merde que je n’ai pas vu.
Notez les 3 header (en fonction des cas). Pour les trois le problème est le même.

Alors pour l’histoire… on remplit un simple petit formulaire (login + pass) dans un fichier qui s’appele index2.php. Ce formulaire appele connexion.php (que voici) et celui-ci traite comme il se doit les données. En cas d’erreur, il fait un retour sur index2.php (d’ou la présence des header (location …) ) pour afficher le message d’erreur en fonction… de l’erreur ($etat).


<?php
if (isset($_POST['user'])){$user = $_POST['user'];}else{$user = NULL;}
if (isset($_POST['passwd'])){$passwd = $_POST['passwd'];}else{$passwd = NULL;}
include "connect.inc.php";
$queryacces = "SELECT * FROM user WHERE USER_USER = \"".$user."\"";
$resultacces = mysql_query($queryacces) or die(mysql_error());
$readacces = mysql_fetch_array($resultacces) or die(mysql_error());
if ( $readacces[0] != NULL )
{
	if ( $readacces[2] == md5($passwd) )
	{
  if ( $readacces[27] != 0 )
  {
  	session_start();
  	session_register('id','login');
  	$_SESSION['id'] = $readacces[0];
  	$_SESSION['login'] = $user;
  	header ("location:main.php");
  }
  else
  {
  	$etat = "Compte desactivé !";
  	header ("location:index2.php?etat=".$etat);
  	exit();
  }	
	}
	else
	{
  $etat = "Mot de passe erroné ! Recommencez !";
  header ("location:index2.php?etat=".$etat);
  exit();
	}
}
else
{
	$etat = "Utilisateur inconnu, merci de vous inscrire !";
	header ("location:index2.php?etat=".$etat);
	exit();
}
?>

et la page connect.inc.php, tu l’a regardée ?

en rajoutant la fonction “session_write_close()”
dés que tu n’as plus besoin de tes variables de session resolverait cetainement ton probleme:


...
session_start();
  session_register('id','login');
  $_SESSION['id'] = $readacces[0];
  $_SESSION['login'] = $user;
 session_write_close();
... 

Ouaip…

Elle est tout aussi “propre”, c’est pour ça que je ne trouve pas :sweet:


<?php
$connexion=mysql_connect("****","****","****");
$db=mysql_select_db("mabase",$connexion);
?>

Vouip, mais j’ai oublié de préciser que ça va mal que dans un des cas ou le login/pass est pas bon (c’est à dire: pass erronné, ou login existant ou compte desactivé).

En gros… il rentre meme pas dans le dernier bloc if (qui contient le demarrage de session). Donc ça ne vient pas de là

hum

c’est vraiment retort en général, faut voir si tu commences bien ton fichier par <?php (et pas d’espace avant) si tu le finis bien par ?>. Idem pour tout fichier inclut.

Oui, tous mes scripts commencent bien par <?php et terminent par ?>

Aucun espace ni avant, ni après :neutre:

Je sais plus ou chercher là :sweet:

Il n’y a rien d’autre que les deux scripts que je vous ai mis au-dessus

Comme ça fait un moment que j’y ai pas retouché en plus, je ne me souviens absolument pas si j’ai pu faire des modifs dedans. Car il y a une chose sur et certaine… ça marchait au poil il y a quelques temps.
Entre-temps, j’ai simplement upgradé easyPHP de la 1.7 à 1.8, mais je pense pas que ce soit ça :neutre:

Et si c’est le cas… je n’ai de toute façon toujours aucune idée de comment régler le problème étant donné que je ne vois toujours pas ou peut etre le contenu créé avant mes header :sweet:

tente aussi en mettant le session_start() tout en haut de ton code :neutre:

Tu as vérifié que tes variables étaient bien initialisées?

Tenté… pas marché :neutre:

:oui: d’ailleur ce n’est pas compliqué, connexion.php n’en reçoit que deux (user et passwd), qui sont initialisés.
$etat n’a pas besoin de l’être puisqu’elle est créée dans le script.
En revanche, en cas d’erreur (et donc… normalement de retour vers index2.php) elle est bien initialisée dans index2.php. Mais comme le retour ne se fait pas à cause de ce satané “Warning: Cannot modify header information - headers already sent by…”

Au passage, existe t-il un autre moyen que de passer par le header location pour faire une redirection automatique ?

J’ai du nouveau !

Alors voilà, en testant tout et n’importe quoi, je me suis retrouvé à ce stade:

j’ai enlevé les deux "or die (mysql_error()) "

Maintenant j’ai un retour systématique (en cas d’erreur) sur ma page index2.php

En revanche, ma variable etat (qui passe en GET) ne s’affiche pas. Bon…
ça avance.

Pour l’affaire des or die mysql, j’en conclus donc ceci :
Quand on met un pseudo incorrect, comme le resultat est égale à null, le or die (mysql_error()) créé le fameux contenu.

Ce qui est fort ennuyeux, mais tanpis, je m’en passerais.

Donc t’as un problème de connexion :slight_smile:

Reste que le die est équivalent à exit : ça kill ta page. Après un appel à exit, il ne se passe plus rien.

Donc c’est pas là.

C’est à dire ? ça m’interesse grandement ça.

Concrètement… si l’utilisateur n’entre pas de pseudo (ou un pseudo incorrect), la requete va retourner un résultat NULL
Pour ça on est d’accord ?

Donc le die joue son role surement en racontant qu’il n’a rien trouvé.
Problème… le header ne veut pas de ça. Le die à le droit de raconter ce qu’il veut après, mais pas avant. Mais la requete il faut bien qu’elle se fasse avant :neutre:

Donc la connexion est bonne, seulement le résultat est NULL
Pourrais-tu m’en dire un peu plus sur ce pb de connexion auquel tu penses ?

A part le problème de connexion dont tu m’as fait part au dessus sans-nom, pour le reste…

ben c’est tout résolu.

Pour l’affichage de ma variable etat dans la page index2, j’ai juste modifié des double-quote en simple quote. Je sais pas pourquoi, ça marchait bien avant. Mais bon, ça remarche impecc et le code s’en trouve plus propre de toute façon.

Merci de vos conseils :jap:

J’attend juste d’avoir un complément d’info sur la connexion dont t’as parlé, et je met le topic en resolu :wink:

J’ai aussi eu ce genre de problème, et après avoir abandonné sa résolution, j’ai opté pour la solution “javascript”, et son simple :

location.href=‘mapage.php’;

C’est sûr que c’est plus sympa d’utiliser header(), mais là, ça marche à tous les coups :slight_smile:

et si le javascript est désactivé ? :smiley:

Bahhh… caca le JS ! :stuck_out_tongue:

lol, non je plaisante. Mais je le garde en solution de secours au cas ou ça me ré-arrive

tu peux garder ton die sur mysql_query, comme ça, si il y a un pb avec la requete ou autre, il s’arrete de suite

par contre enlève le die du fetch
c normal qu’il fasse une erreur si tu essaies de fetch du vide

essaie un truc du genre

if(! $result=mysql_fetch_array( ....) ) {$etat=$inconnu; header(...)}
else ...

et puis non, en fait le else, y en a pas besoin: si il doit sortir sur le if, il sort, sinon, il continue de toute façon

Vire ton else, fout un exit.

Ca ira plus vite à parser pour PHP…

oui, c’est ce que j’ai fait :super:

J’ai viré le die sur le fetch, mais je l’ai gardé sur la requete pour quand même avoir une trace si il devait y avoir un pb de connexion à la base.

ça tourne correctement comme ça :jap: