Warning: Cannot modify header information - headers already sent by [Résolu]

Messages postés
45
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
6 décembre 2019
- - Dernière réponse : Reivax962
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
- 29 nov. 2019 à 18:14
Bonjour, je suis entrain de créer un site avec un compte utilisateur, j'ai mis du PHP pour accéder à mon compte, voici le code de l'accès au compte


<?php

//début de ton fichier php .... ça veut dire .. DEBUT !!!:
error_reporting ( E_ALL );
ini_set ( 'display_errors', TRUE );
ini_set ( 'display_startup_errors', TRUE );

 					
include("connexion.php");	
	
$username = !empty ( $_POST['identifiant'] ) ? $_POST['identifiant'] : NULL;	
$password = !empty ( $_POST['pass'] ) ?$_POST['pass'] : NULL;						
					
	//On verifie si le formulaire a ete envoye
	if($password)
	{
	
		//On recupere le mot de passe de lutilisateur
		
	try
    {		
 $req = $bdd->prepare('SELECT * FROM compte WHERE identifiant = ?');
	
	$req->execute(array($username));
	$donnees =  $req->fetch();
			 
	//Somme des élèves de la classe	
	 }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
		
  $isPasswordCorrect = password_verify($_POST['pass'], $donnees['pass']);
		
		

		if($isPasswordCorrect){
			//Si le mot de passe es bon, on ne vas pas afficher le formulaire
	
			$_SESSION['identifant'] = $_POST['identifiant'];
			$_SESSION['id'] = $donnees['id'];
			header('Location:compte.php'); // Cè ça la 192 ligne de mon code, c'est ça donc qqu'il signal comme erreur
			
			} 

} ?>

 


mais quand j'execute mon code, il me renvoi cette erreur

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/kela/index.php:1) in /Applications/MAMP/htdocs/kela/index.php on line 192

 
$_SESSION['identifant'] = $_POST['identifiant'];
			$_SESSION['id'] = $donnees['id'];
			header('Location:compte.php'); // Cè ça la 192 ligne de mon code, c'est ça donc qqu'il signal comme erreur



Quelqu'un pourrait-il m'aider?
Afficher la suite 

2 réponses

Messages postés
9065
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 décembre 2019
465
0
Merci
bonjour,
le message t'indique que le code a précédemment déjà envoyé quelque chose, ce qui est interdit, l'appel à header devant s'effectuer avant tout autre envoi.
le message précise aussi que l'envoi interdit a été effectué à la ligne 1 du même fichier.
Commenter la réponse de yg_be
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
918
0
Merci
Bonjour,

-- Réponse courte :--

Qu'y a-t-il à la ligne 1 de index.php ?
Une ligne vide, ou même une simple espace ?
Il faut la supprimer.
Ça peut également être un caractère caché de l'encodage UTF-8, qu'on appelle le BOM : il faut bien s'assurer que tu encodes ton fichier en UTF-8 « sans BOM » (Notepad++ permet de facilement convertir ton fichier).


-- Réponse longue :--
Le problème que tu décris vient de la structure du message http.
Quand le serveur web renvoie des informations au navigateur, il envoie d'abord un "header", qui contient notamment les cookies et d'autres informations sur la page elle-même.
Ensuite, le corps du message http contient le code html de la page.

Le serveur envoie tout ça sans qu'on le lui demande explicitement, en général.

Toutefois, certaines fonctions Php impliquent une modification de ce header. C'est le cas de la mise en place d'un cookie, d'une session (puisqu'elles sont identifiées par un cookie), mais aussi de la fonction header() qui permet de les modifier explicitement.

Mais du coup, si tu as, en haut de ta page, un "<html>" , une commande "echo", ou même une ligne vide avant le <?php...
Que va faire le serveur ? Il va considérer ça comme le début du corps de ta page, et l'envoyer comme réponse au client. Mais pour ça, il faut d'abord envoyer le header de la réponse !
Donc il génère un header "par défaut", et l'envoie au client avec le début du code html demandé.

Si, ensuite, dans ta page, tu appelles une fonction qui demande de modifier les headers, tu obtiens le message d'erreur que tu nous montres : "Warning: [...] - headers already sent by... ". Parce que le header est déjà parti, et ne peut donc plus être modifié...

Voilà, j'espère que mes explications t'ont permises de comprendre le problème. Évidemment, la solution est donc de faire ton header() avant tout texte qui puisse passer pour le corps de la page ! (On dit souvent que ça doit être tout en haut, mais c'est simplificateur, c'est juste une sécurité pour éviter d'expliquer dans le détail. Il faut juste que ce soit placé avant toute sortie)

Xavier
modemo2018
Messages postés
45
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
6 décembre 2019
-
Excuse moi, j'ai pas compris
Quelles lignes ki doivent être situés après tte modifications des headers?
Reivax962
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
918 -
Il ne doit rien y avoir en dehors de balises <?php et ?> avant ton header().
jordane45
Messages postés
26974
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
1918 > Reivax962
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
-
Hello
Visiblement...il n'a toujours pas compris le sens du mot début..

//début de ton fichier php .... ça veut dire .. DEBUT !!!:
Reivax962
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
918 -
Oui il me semblait bien avoir reconnu là ta patte :D
Reivax962
Messages postés
3526
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
4 décembre 2019
918 -
En gros, ton fichier ressemble à ça :
 
<!DOCTYPE html> 
<?php

//début de ton fichier php .... ça veut dire .. DEBUT !!!:
error_reporting ( E_ALL );
ini_set ( 'display_errors', TRUE );
ini_set ( 'display_startup_errors', TRUE );

[...]
  if($isPasswordCorrect){
   //Si le mot de passe es bon, on ne vas pas afficher le formulaire
 
   $_SESSION['identifant'] = $_POST['identifiant'];
   $_SESSION['id'] = $donnees['id'];
   header('Location:compte.php');
   }
}
?>

Il faut qu'il ressemble à ça :

<?php

//début de ton fichier php .... ça veut dire .. DEBUT !!!:
error_reporting ( E_ALL );
ini_set ( 'display_errors', TRUE );
ini_set ( 'display_startup_errors', TRUE );

[...]
  if($isPasswordCorrect){
   //Si le mot de passe es bon, on ne vas pas afficher le formulaire
 
   $_SESSION['identifant'] = $_POST['identifiant'];
   $_SESSION['id'] = $donnees['id'];
   header('Location:compte.php');
   }
}
?>

<!DOCTYPE html> 
Commenter la réponse de Reivax962