Quand on envoi un header, le code précédent cette instruction ne doit envoyer aucun affichage ni par print, ni par echo ni par include d'un texte HTML ou d'un programme PHP qui fait de l'affichage.
De la même, un header doit être la dernière instruction d'un scoop ou bloc. On le retrouve généralement à la fin d'un bloc d'une alternative "if" ou "switch" ou tout simplement à la fin d'un programme.
Pourquoi? ben, tout simplement parceque header est une redirecteur qui donne la main au chargement d'une autre page (on dit qu'il envoi une requête HTTP au client navigateur) et donc forcement le programme en cours s'arrête.
On peut dire que header termine le programme actuel en appelant une autre page.
Dans ton premier exemple complet, un include précédant ton header l'empêche de bien fonctionner et dans le deuxième ce sont les echos qui provoquent l'échec du header.
La solution : quand to code doit décider d'un header avec une alternative, les affichages ne doivent se faire que dans le cas contraire de celui qui doit provoquer le header.
Par exemple:
dans le cas de validation d'une connexion, il faut respecter l'algorithme suivant:
1. Recevoir les paramètres éventuellement envoyés : login et mot de passe
2. Si il y a reception de valeurs : vérifier si le membre existe : si oui alors envoyer le header vers la page d'accueil du membre
3. dans tous les cas contraires à la validité du membre : envoyer un message d'avertissement tout en restant sur la même page de connexion
cet algorithme s'écrit exactement comme ton code à l'exception que cette correction tient compte de la présence d'un hearder
<?php
session_start ();
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site
// $login_valide = "xxxx";
// $passe_valide = "xxxxxx";
//1. Recevoir les paramètres
$login = isset($_POST['login']) ? $_POST['login'] : "";
$passe = isset($_POST['passe']) ? $_POST['passe'] : "";
// on teste si nos variables sont définies
if (!empty($login) && !empty($passe))
{
//2. on vérifie les informations du formulaire, à savoir si le pseudo saisi est bien un pseudo autorisé, de même pour le mot de passe
if ($login_valide == $login && $passe_valide == $passe)
{
// dans ce cas, tout est ok, on peut démarrer notre session
// on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables)
$_SESSION['login'] = $login;
$_SESSION['passe'] = $passe;
// on redirige notre visiteur vers une page de notre section membre
header("location: membre.php");
}
else
{
// Le visiteur n'a pas été reconnu comme étant membre de notre site.
$message = "Vous n'êtes pas autorisé!";
}
}
else
{
$massage = "Saisissez un mot et mot de passe!";
}
//Affichage de la page en cours : CONNEXION
include("connextion.php");
//Affichage du message d'avertissement
echo $message;
?>
Remarque: Une page PHP ne doit pas envoyer un header qui pointe sur elle même, c'est un abus qui présente un rique de bouclage infini qui bloque le navigateur et occupe le serveur. En plus du fait qu'aucun affichage ne peut se faire par une telle page.
Ceci dit je te conseille de lire un petit peu la doc sur les notions PHP de :
- POST/GET
- SESSION
- ECHO/PRINT
- HEADER
- INCLUDE
et SQL:
- SELECT sans WHERE
- SELECT avec WHERE