8795 sujets

Développement web côté serveur, CMS

Pages :
Salut à tous... p**** de bordel de redirection Smiley smile


Et oui, tout le monde (du moins pas mal de monde) à deja entendu parler des header en php!
Qui ne doivent rien avoir avant, sinon ça marche pas... du coup si tu le met en premier, il fait pas le reste... miam Smiley rolleyes


bon en gros dans mon code j'ai mon header en premier, LUI il marche y'a pas de problème

<?php
header('location:../../admin.php');

require_once('user_classe.php');

$oUser = new User();
		
if (isset($_POST['btnConnection'])){
		
		//traitement de la connexion:
		$result=$oUser->connection($_POST['login'], $_POST['password']);
		
	if (!empty($result))
		{
			
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
		}
	else
		{
			//header('location:../../admin.php');
			$_SESSION["logged"]=false;
			}
}
	//header("Location: listArticles.php");
	
?>		
	



Mais normalement, (avec wamp en local) le header été au niveau

	if (!empty($result))
		{
			
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
		}


et ça fonctionner, sa me faisait d'abord ma variable = true (ce que je souhaite faire !)

Mais maintenant que le header est en tête, la variable de passe pas a true.. d'ailleur tout le reste en dessous ne passe pas . ce qui est normal car c'est un header.


Du coup je viens à vous pour trouvez de nouvelles solutions a la place de ce header de malheurs (rime!)

j'ai essayer du JS avec SetTimeOut, sa fonctionne pas, sa me redirige mais ça ne garde pas non plus la variable de session à true.

bref.. je suis désespéré. help me s'il vous plait.
Modifié par JuseN (09 Jul 2012 - 10:27)
php.net a écrit :

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.
Oui, je comprends pas pourquoi tu pourrais pas mettre ton php après ? Tant qu'aucun affichage n'a été fait...
Modifié par Gothor (04 Jul 2012 - 12:03)
@Laurie-Anne

Alors oui c'est vrai que j'étais énervé.. et oui c'est vrai .. on comprend rien Smiley smile même moi en relisant j'ai du mal à comprendre.. vraiment désolé pour les yeux!


@Gothor : mon php après ?

bah enfaite, dans mon php, si la personne à saisie un login+mdp correct, la variable de session logged elle passe a true. si il rentre quelque chose de mauvais, ça reste à false, comme sa je peux forcer l'affichage du formulaire de connexion.

Ensuite, mon header je le plaçais juste après avoir mis session logged = true, mais le header ne fonctionnais pas (car il faut rien avant, pas d'espace rien comme à cité @bzh)

Pourtant j'ai 0 contenu, du coup je comprenais pas d'où ça venait... et si je place mon header en tout début de fichier, la redirection se fait mais pas le logged=true


Donc un coup c'est l'un qui marche un coup c'est l'autre... je suis bloquer, a part faire un lien mais c'est moche.
Modifié par JuseN (04 Jul 2012 - 14:20)
Je voulais dire ton header()... Normalement, ça devrait fonctionner...
<?php
	if (!empty($result))
		{
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
                        header("Location: tapage.html");
		}
?>
N'oublie pas d'appeler session_start() également...
Voila Got

J'avais ceci, extactement, et au moment où je cliqué sur connexion, ça me faisait un :
Warning: Cannot modify header information


donc c'est pour ça que j'ai mis le header juste après la balise <?php mais du coup le résultat n'est pas celui que j'esperer... pas de session Smiley logged =true (avec le header en premier)
<?php
@session_start();

require_once('user_classe.php');

$oUser = new User();
		
if (isset($_POST['btnConnection'])){
		
		//traitement de la connexion:
		$result=$oUser->connection($_POST['login'], $_POST['password']);
		
	if (!empty($result))
		{
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
			
		}
	else
		{
			//header('location:../../admin.php');
			$_SESSION["logged"]=false;
			}
}
	
?>		
	



En tous cas, j'en vois pas..
Il n'y aurait pas un caractère invisible avant <?php ? ou dans 'user_classe.php'
Modifié par Laurie-Anne (04 Jul 2012 - 15:35)
Ça vient rarement d'un echo. Causes possibles :

- Caractères invisibles (espace, tabulation) après la balise de fermeture PHP (?>). Ce qui est clairement le cas dans le code que tu as posté. C'est pour que ça qu'on ne doit jamais mettre cette balise dans un fichier qui ne contient que du PHP.

- Caractères invisibles avant la balise d'ouverture de PHP.

- Fichier inclus encodé en UTF-8 avec BOM.

Bonus :

Toujours faire suivre une redirection d'un exit au cas ou elle foire (problème de sécurité classique).

Voilà la fonction que j'utilise pour mes redirections :


  /**
   * Simple safe redirection (header location with JavaScript fallback).
   *
   * @param string $url The URL to redirect to
   * @param int $code Optional HTTP status code
   */
  function redirect($url, $code = 0) {

    $status = Array(
        '301' => 'Status: 301 Moved Permanently',
        '302' => 'Status: 302 Moved Temporarily',
    );

    if (true === headers_sent()) {
      /**
       * NOTE: No exception is throwed in case the HTTP code is not supported.
       * This ensure that no error message is ever outputed and cause the
       * redirection to fail.
       */
      if ($code !== 0 && array_key_exists($code, $status)) {
        header($status[$code], false, $code);
      }
      header('Location: ' . $url);
    } else {
      echo '<script>window.location="' . $url . '";</script>';
    }

    exit;
  }

Modifié par jb_gfx (04 Jul 2012 - 16:16)
Peut-être, en tête de page, absolument

<?php
	session_start();
	ob_start();

... tout ton code php
... avec tes header !
... avec tes require_once !

	ob_end_flush();
?>



Pour résoudre les problèmes require_once et header...
Modifié par jytest (05 Jul 2012 - 11:44)
Salut !!

Merci a tous pour vos réponse, je viens de tester ton ob_start @jytest

le header marche du coup, plus aucun problème a ce niveau la, le header est dans un if :

	if (!empty($result))
		{
			
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
			header('location:../../admin.php');
			
		}


Mais le soucis c'est que $_SESSION["logged"]=true; il le 'garde' pas ...
Dans mon formulaire de connexion , dans l'action, c'est le fichier .php où ce if la, et du coup j'ai mis un var_dump de SESSION pour voir un peu à l'intérieur..

Mais ma variable SESSION reste vide, j'ai des @session_start sur chaque fichier a part l'index où y'a pas '@' mais bon... il garde pas mon logged=true...

Mais le header marche Smiley langue
Même si tes header sont dans des if,
Ces 3 choses sont obligatoires !

1.
Es-tu sûr d'avoir absolument mis des session_start();
dans toutes (oui toutes) tes pages internet ?

2.
L'ordre des intructions est aussi très important :
<?php
	session_start();
	ob_start();


3.
et puis, ne pas oublier à la fin du code php (pour envoyer les header !)
	ob_end_flush();
?>

Modifié par jytest (05 Jul 2012 - 16:52)
bah j'ai une vingtaine de fichier .php , et toutes ont le session start (je suis sur, en plus en local cela marchait.. mais pas en ligne)

et pour le ob_start, j'ai copié collé ce que tu as mis... c'est vraiment que la variable de session... c'est très bizare, parce que quand j'avais mis un lien (href) au lien du header, a ce moment là il me mettez mon logged de session a true.
oui, c'est tout à fait cela ! Vérifie tous (oui, tous) tes include !
Je sens qu'on approche !!!
Modifié par jytest (05 Jul 2012 - 17:45)
Verification terminé :

j'ai des

<?php
@session_start();

?>



dans TOUS mes fichier.



et actuellement dans ma page où je retrouve mes fameux header j'ai ça :

<?php
@session_start();
ob_start();

require_once('user_classe.php');
$oUser = new User();

if (isset($_POST['btnConnection'])){
		//traitement de la connexion:
	$result=$oUser->connection($_POST['login'], $_POST['password']);

	if (!empty($result))
		{
			
			$_SESSION["user"]=$result["NOM_ADMIN"];
			$_SESSION["logged"]=true;
			header('location:../../adm.php');
			
		}
	else
		{
			//header('location:../../admin.php');
			$_SESSION["logged"]=false;
			header('location:../../admin.php');
			}
}
	ob_end_flush();
?>		
	


J'ai mis "adm.php) dans le premier header pour tester justement dans quel 'if' il rentré.

Il rentre bien dans le if avec le faux header (j’atterris sur une page qui existe pas du cou), et il a fait la comparaison entre les login mpd saisie et ce dans la base de données.

Ce qui signifie qu'il se connecte à la BDD, qu'il rentre dans le premier if car y'a un résultat dans la variable (!empty) et qu'il me fait mon header


Parce contre la ligne au dessus du header j'ai l'impression qu'il la prend pas en compte, car quand je fais un var_dump de session, ça me dit que session est NULL .... j'ai l'impression enfaite qu'il fait mon logged=true, mais au moment du header il efface tout.
Modifié par JuseN (06 Jul 2012 - 15:02)
Surtout que si je fais un exit() avant le header, et qu'avant le exit() je fasse deux var_dump, un pour la session et un autre pour _post,

j’obtiens le résultat attendu... donc réellement, quand le header s'effectue, il ne garde pas les variable de session...

est ce un rapport avec les cookies ou autres ?
Pages :