Redirection de page
Bonjour,
Je n'arrive pas à faire fonctionner la fonction header.
Page admin
<html>
<head>
<link href="theme/style.css" rel="stylesheet" type="text/css"/>
<title>Authentification - Chalet Cazé d'Ally sur Somme</title>
</head>
<body>
<div id="fond"></div>
<div id="conteneur">
<div id="contenu">
<?php
include('menu.php');
include('connexion.php');
?>
<div id="adm">
<form name="admin" action="admin.php" method="post">
<input type="hidden" name="verif" value="yes" />
<table border="0">
<tr>
<td width="40%" align="right">Login : </td>
<td width="60%"><input type="text" name="login" value="Admin" maxlength="10"></td>
</tr>
<tr>
<td width="40%" align="right">Password : </td>
<td width="60%"><input type='password' name="pass" maxlength="10"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="valider" value="Valider"></td>
</tr>
</table>
</form>
</div><?php
if ($_POST['verif'] == 'yes')
{
if (isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass']))
{
extract($_POST);
//On recupère le password de la table qui correspond au login du visiteur
$sql = "SELECT Mdp FROM Admin WHERE login='".$login."'";
$req = mysqli_query($db, $sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysqli_error());
$data = mysqli_fetch_array($req);
// on libère la mémoire
mysqli_free_result($req);
if (md5($pass) != $data["Mdp"])
{
echo "Mauvais login / password. Merci de recommencer";
exit;
}
else
{
session_start();
$_SESSION['login'] = $login;
header('location: http://www.monsite/administration.php'); //On renvoit vers l'administration
exit;
}
}
else echo "Vous avez oublié de remplir le mot de passe";
} ?>
</div>
</div>
</body>
</html>
Je sais que la fonction header doit être dans l'en-tête mais si je met mon code dans l'en-tête, il ne sait pas l’interpréter en récupérant les variables...
J'ai essayé de le faire passer par un fonction mais je ne sait pas comment transcrire $_POST dans la fonction pour qu'il retrouve tous les paramètres.
Même en mettant simplement header('location: http://www.monsite/administration.php'); après la balise <head> il ne le prend pas en compte
Si quelqu'un à une idée ?
Réponses apportées à cette discussion
Si je met le code suivant j’obtiens ceci en faisant afficher le code source :
<html>
<head>
Le <html> est en rouge...
Code en question :
<head><?php
if ($_POST['verif'] == 'yes')
{
if (isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass']))
{
include('connexion.php');
extract($_POST);
//On recupère le password de la table qui correspond au login du visiteur
$sql = "SELECT Mdp FROM Admin WHERE login='".$login."'";
$req = mysqli_query($db, $sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysqli_error());
$data = mysqli_fetch_array($req);
// on libère la mémoire
mysqli_free_result($req);
if (md5($pass) == $data["Mdp"])
{
//session_start();
//$_SESSION['login'] = $login;
header('Location: http://www.monsite.fr/administration.php'); //On renvoit vers l'administration
exit;
}
}
} ?>
<link href="theme/style.css" rel="stylesheet" type="text/css"/>
<title>Authentification - Chalet Cazé d'Ally sur Somme</title>
</head>
Salut,
il est très important de comprendre que rien ne doit être envoyé vers le client (navigateur) avant les en-têtes, donc avant d'utiliser la fonction header.
Grosso-modo, ça veut dire qu'avant d'envoyer du HTML, il faut déterminer si on est sur la bonne page ou s'il faut rediriger vers une autre page.
Partant de là, regarde ton code et tâche d'imaginer une manière de faire ça : comment est-ce que tu procèderais ?
Bonjour,
Oui j'avais lu ça sur internet mais justement pour le coup je vois pas.
Pour moi, je passe une première fois pour afficher mon formulaire.
Ensuite, une fois le formulaire validé, je rentre dans mon if de la section <head> et je fais mon traitement.
A ce moment là, je n'ai rien d'envoyé vers le client, c'est que du traitement php transparent à l'utilisateur et mes echo ne renvoient quelque chose que si la condition est valide.
Ce que tu ne sembles pas réaliser, c'est que dès l'instant où ton code est en HTML, ça envoie déjà quelque chose vers le navigateur.
Exemple :
<html>
<head>
<title>Ma page</title>
</head>
<body>
<?php
// Exécution de code quelconque...
header('Location: http://uneautrepage.php'); // <== Erreur automatique
?>
</body>
</html>
Là, j'indique « Erreur automatique », tout simplement parce que toute la partie entre les balises html et body a déjà été envoyée. Pour avancer, il est indispensable de bien comprendre ce principe, et avant d'aller plus loin, je voudrais être sûr que ce point est clair, sinon, je tâcherai de formuler ça autrement.
Ok, donc tout mettre sur la même page ne fonctionnera jamais alors.
il faudrait donc que ma page admin.php renvoi vers une page validation.php qui elle fera un header vers ma page administration.php ou retour admin.php avec en paramètre le message d'erreur...
Ou alors la renvoyer dans ma page administration mais ne pas mettre de balise <html><head> et <body>
Ce qui me pose un problème car je dois incorporer <script type="text/javascript" src="ckeditor/ckeditor.js"></script> dans le <head> pour faire fonctionner ckeditor...
Quelle solution est la plus "propre" ?
Si, on peut le faire, mais à condition de le faire dans le bon ordre.
Schématiquement, il faut construire la page AVANT de l'envoyer. Donc si je reprends le code montré précédemment en exemple, il faudrait le modifier comme ceci :
<?php
if(false == $condition)
{
header('Location: http://uneautrepage.php'); // <== Là, pas d'erreur puisque le code PHP n'est précédé d'aucun code HTML
}
// Exécution de code quelconque...
?>
<html>
<head>
<title>Ma page</title>
</head>
<body>
<p>Contenu de la page ... </p>
</body>
</html>
De cette manière, on envoit rien au navigateur tant que les tests appropriés ne sont pas faits.
C'est pourtant évident et j'y ai même pas pensé.
En plus, je le fais sur ma page fonction.php, aucune balise html...
J'ai pas pensé à concaténer les deux ^^
Je test ça mais ça devrait fonctionner.
Bon, il semble que j'ai parlé trop vite, ça ne veut pas fonctionner...
J'ai simplement mis ceci dans ma page admin.php :
<?php
header('Location: http://www.google.fr');
exit;
?>
Pourtant il ne fait rien du tout, il reste sur une page admin.php entièrement blanche et quand je fais voir code source, il n'y a aucune ligne d'interprété.
Est-ce qu'il y a ne serait-ce qu'un espace avant le signe « <?php » ?
J'aurai bien aimé mais non.
Voici exactement ce que j'ai sur ma page pour faire un test :
<?php
header('Location: http://www.google.fr');
exit;
/*<html>
blabla html
</html>*/ ?>
Le seul espace que j'ai est le retour à la ligne après la balise <?php
Alors on a un problème parce que cette anomalie est inattendue.
Juste au cas où, qu'est-ce que tu utilises comme environnement de développement ?
Par environnement, tu entends logiciel ?
Si oui je code sous Dreamweaver CS6, le site est hébergé sur 1&1 avec PHP en version 5.5
Ok, tu n'as pas un environnement en local donc, du genre WAMP ou assimilé... tu devrais, c'est plus pratique. Mais bon.
C'est quoi l'url test ?
J'ai WAMP, enfin un ami m'en a parlé il y a pas longtemps mais pas pris le temps de voir comment l'utiliser.
Je code directement sur le site mais je fais une page test pour voir.
La page en question est http://www.sylfan-caze.fr/admin_test.php
Et effectivement, ça ne fonctionne pas.
J'ai testé en local juste pour vérifier que la fonction header n'aurait pas un problème mais ça fonctionne parfaitement. Donc je ne vois pas trop.
Je serais bien tenté de me méfier de Dreamweaver, ça n,a jamais été un outil de développement et ça peut occasionnellement créer des surprises.. À ce niveau là, je te recommande d'utiliser un petit outil sympa de base comme Notepad++, il y a une coloration syntaxique et c'est un parfait outil d'apprentissage.
Juste au cas où : est-ce qu'il y a à la racine de ton site un fichier nommé « .htaccess » ? Si oui, crée un sous-dossier à la racine, du genre /test et dedans, tu y déplaces ton fichier, l'url deviendrait alors http://www.sylfan-caze.fr/test/admin_test.php
Oui je connais Notepad++. Je préfère dream car il me met un code couleur différent pour le html, php, ligne en commentaire, etc.
Après Notepad++ le fait peut être aussi mais jamais cherché comment.
Même en ouvrant la page admin_test.php avec Notepad++, je n'ai pas d'espace avant le <?php
Je reste perplexe...
Sinon non, je n'ai pas le fichier .htaccess.
A la racine du site j'ai un dossier Chalet et Logs, c'est tout.
Tu codes directement en ligne via FTP ou tu codes un fichier local que tu envoies après en ligne avec un client FTP genre Filezilla ?
Pour la coloration syntaxique avec Notepad++, [Alt]+[L] et tu choisis le langage, tu vas voir, c'est magique ;)
Oui je code en local et envoi via Filezilla.
Je viens d'essayer en n'écrivant que ceci mais toujours rien :
<?php
header("Location: http://www.sylfan-caze.fr/dispo_test.php/");
exit;
?>
Ok, on va tester autre chose.
Comme tu testes en ligne, tu n,as pas la main sur la configuration de PHP, on va le forcer un peu.
Modifie ton code comme ceci :
<?php
ini_set('display_error', 1);
ini_set('error_reporting', E_ALL);
header('Location: http://www.sylfan-caze.fr/dispo_test.php/');
exit;
?>
<html>
<head>
<title>Raté</title>
</head>
<body>
<h1>Raté</h1>
<p>La redirection à échoué</p>
</body>
</html>
J'ai le message d'erreur suivant :
Warning: Cannot modify header information - headers already sent by (output started at /homepages/31/d536289959/htdocs/Chalet/admin_test.php:1) in /homepages/31/d536289959/htdocs/Chalet/admin_test.php on line 5
Ben voilà : il y a déjà du contenu qui a été envoyé au navigateur avant même l'exécution de la fonction header().
Un simple espace suffit à créer ce genre de bogue.
Exemple, représente-toi le fichier dans ton éditeur :
+---------------------------------------------
| <?php // <== Ici, il y a un espace juste avant le « < », l'erreur sera automatique.
|header("Location: http://www.google.com");
|// ... etc. suite du code qui normalement ne devrait pas s'exécuter
|//..
|
Voici le même sans erreur :
+---------------------------------------------
|<?php
|header("Location: http://www.google.com");
|// ... etc. suite du code qui normalement ne devrait pas s'exécuter
|//..
|
Vérifie ton fichier, il y a probablement une erreur insignifiante de ce type. Ça pourrait aussi bien d'ailleurs être une première ligne vide.
Si j'ai un espace, je vois pas où.
Et j'ai aussi vérifié. Je retourne bien à la ligne après chaque élément sans espace après.
Ex : <?php(return ligne) et non <?php (return ligne)
Ton fichier serait-il dans ce cas inclus à partir d'un autre ?
Heu pas sur de comprendre là.
Ma page est à la racine de "Chalet" et vu que c'est admin_test.php, je l'appel en direct.
À toute fin pratique, tu pourrais t'inspirer de l'exemple 1 de la documentation, ça va te permettre de pister d'où vient le problème.
Tu pourrais par exemple modifier ton fichier comme ceci :
<?php
ini_set('display_error', 1);
ini_set('error_reporting', E_ALL);
if(!headers_sent($filename, $linenum))
{
header('Location: http://www.google.fr');
exit();
// Vous allez probablement déclencher une erreur ici
}
else
{
$aErreurs = debug_backtrace();
$sErreurs = print_r($aErreurs, true);
$paragraphe = "Les en-têtes ont déjà été envoyés, depuis le fichier ". $filename ." à la ligne ". $linenum ."<br />". PHP_EOL;
$paragraphe .= "Il est donc impossible de vous rediriger automatiquement, aussi veuillez cliquez <a href=\"http://www.google.fr\">ici</a>.". PHP_EOL;
$paragraphe .= '<pre>'. $sErreurs .'</pre>'
}
?>
<html>
<head>
<title>Raté</title>
</head>
<body>
<h1>Raté</h1>
<p><?php echo($paragraphe); ?></p>
</body>
</html>
Quand je met le code :
if (!headers_sent($filename, $linenum)) {
header('Location: http://www.example.com/');
exit;
// Vous allez probablement déclencher une erreur ici
} else {
echo "Les en-têtes ont déjà été envoyés, depuis le fichier $filename à la ligne $linenum\n" .
"Il est donc impossible de vous rediriger automatiquement, aussi veuillez
cliquez <a href=\"http://www.example.com\">ici</a>.\n";
exit;
}
Il m'indique ceci : Les en-têtes ont déjà été envoyés, depuis le fichier /homepages/31/d536289959/htdocs/Chalet/admin_test.php à la ligne 1
Sauf qu'en ligne 1 je n'ai que le <?php comme indiqué sur l'image...
J'ai édité ma précédente réponse en ajoutant un code plus complet pour arriver à débusquer le problème, essaye ça et préviens que je puisse voir ça en ligne.
C'est fait et il me génère un tableau vide
Décidément, j'y comprends rien... je vais y réfléchir un peu en allant déjeuner parce que là, je ne vois vraiment pas d'où ça peut venir...
Alors j'ai peut être une réponse mais je la comprend pas vraiment.
Quand j'enregistre la page admin_test.php en "en UTF-8 (sans BOM)", le header fonctionne mais j'ai un espace qui apparait en haut de ma page :
De plus les accents présent lors de mes echo ne s'affiche plus correctement.
Pour les accents en html je mettais le code associé (ex: eeacute)
Faut il, maintenant, les mettre aussi pour du code php ?
Ça, c'est une option que je n'avais effectivement pas envisagée.
Et il faut toujours enregistrer sans BOM, sinon ça met la zone systématiquement.
Pour les accents, si tu enregistres tes fichiers en UTF8, alors il faut que dans ton en-tête HTML il y ait la balise meta associée. Tu peux aussi envoyer un header pour l'indiquer en PHP avec la même fonction header() qui te sert à la redirection, donc bien entendu avant tout envoi de HTML.
Heu je dois bien avoué que j'ai rien compris à ton message :(
Pour ce qui est de l'espace en haut, j'ai renommé toutes mes pages/liens qui interviennent dessus en sans BOM (menu, connexion, fonction, etc.) mais il est toujours là.
Salut,
pour le BOM, voici un peu de lecture, ce sera plus simple que de tout ré-expliquer moi-même ;)
Pour le reste, à propos des en-têtes, lorsque le serveur envoit du contenu au navigateur, ça inclut des en-têtes qui ne sont pas affichés mais qui peuvent en revanche influer sur l'affichage, et l'encodage des caractères en fait partie. Généralement sur le web, on encode en UTF8 ou en Latin1 // ISO8859-1 (pour le français s'entend, pour d'autres langues, il peut y avoir d'autres encodages)
En précisant l'encodage aproprié, l'affichage se fera correctement. Sinon, les caractères en UTF8 pourront apparaitre de façon bizarre, rendant le texte moins facilement lisible.
Donc en ajoutant une balise meta dans la partie <header> du code HTML, on indique au navigateur quel encodage doit être pris en compte.
Exemple pour une page en XHTML :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" xml:lang="fr" />
Au besoin, effectue une petite recherche avec les mots-clés « meta » et « charset », tu devrais trouver rapidement assez de lecture pour t'occuper jusqu'à Noël ;)