session start et header : problèmes!

Petit nouveau ! | 3 Messages

05 juin 2011, 15:27

Salut à tous!
Une question de newbie... bien sûr.
L'idée est simple, j'ai un formulaire.html avec un formulaire_post.php qui contient le code suivant. Le problème, c'est que dans mon script, je souhaite, après avoir insérer dans la base de données les informations du formulaire, démarrer une session et rediriger vers la page d'acceuil, sur laquelle une session démarre avec avec des variables $_SESSION actives. Tout ceci fonctionnait bien en local mais voilà que, sur le web (planethoster est mon hébergeur), les erreurs classiques font surface. Sesion start et header doivent être placés en début de script... je sais, mais là je bloque. Je ne sais plus du tout comment m'en sortir... Please, help!
<?php
// si les valeurs ne sont pas vides
if(isset($_POST) && !empty($_POST['nom']) && !empty($_POST['prenom'])))
// On exécute çà:
{
	try
	{
	// Connexion à la base de données 
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$bdd = new PDO('mysql:host=localhost;dbname=xx', 'xx', 'xx1', $pdo_options);
	// test pour verification pseudo
	$count = $bdd->prepare('SELECT COUNT(*) FROM formulaire WHERE pseudo = :pseudo ');
	$count->bindValue('pseudo', $_POST['pseudo'], PDO::PARAM_STR);
	$count->execute();
	if ($count->fetchColumn()) 
		{
		echo '<p>Ce pseudo est déjà utilisé</p>';
		?><a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
		<?		
		}
		else
		{
		//test sur le mail utilisé (mail)
		$count = $bdd->prepare('SELECT COUNT(*) FROM formulaire WHERE mail = :mail ');
		$count->bindValue('mailfac', $_POST['mailfac'], PDO::PARAM_STR);
		$count->execute();

			if ($count->fetchColumn()) 
			{
			echo '<p> Ce mail  a déjà été utilisé </p>';
			?><a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
			<?		
			}
			else
			// Si le pseudo n'est pas utilisé, on exécute:
			{
			   // Insertion dans la base de données via une requête préparée
 			   $req = $bdd->prepare('INSERT INTO formulaire (nom, prenom, etc...) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 			   $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['mailperso'], etc...));
			
			//+ log in avec début d'une session
		session_start();
  $_SESSION['pseudo'] = $_POST['pseudo'];
  $_SESSION['nom'] = $_POST['nom'];
  $_SESSION['prenom'] = $_POST['prenom'];
header('Location: ../accueil/accueil.php');
exit(); 
			}
		
			}
	}

catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

}
else

{
?>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Formulaire</title>
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="../css/designform.css" />
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	</head>

<?
	echo '<p>Tous les champs sont obligatoires ! Reprécisez votre mot de passe également SVP !</p>'; ?>
		<a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
		<? exit;
}
?>

Voilà, j'ai volontairement omis quelques petites $_POST pour ne pas alourdir inutilement ce texte déjà bien lourd....
Merci de vos réponses d'avance!

Eléphanteau du PHP | 31 Messages

05 juin 2011, 15:47

Essayes de mettre le session_start(); tout au début de ton code.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 juin 2011, 15:51

Petite précision : les headers et session_start n'ont pas besoin d'être placés en début de script ! Ils doivent seulement être placé avant que le script n'envoi des données au navigateur (donc avant tout echo, print, code html, ou tout espace ou retour à la ligne placé en dehors des balises <?php et ?> etc.) ... mais ça peut tout à fait être à la ligne 800 de ton script :)

A première vue, ton code semble correct... donne nous les messages d'erreur, ce sera plus facile pour t'aider :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

05 juin 2011, 16:09

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/runinter/public_html/formulaire/formulaire_post.php:12) in /home/.../formulaire_post.php on line 63

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/runinter/public_html/formulaire/formulaire_post.php:12) in /home/...formulaire_post.php on line 63

Warning: Cannot modify header information - headers already sent by (output started at /home/runinter/public_html/formulaire/formulaire_post.php:12) in /home/.../formulaire_post.php on line 96

Voici les messages d'erreur que j'obtiens... je vous épargne les chemin d'accès entiers
Le numéro des lignes ne doivent pas correspondre, mais de toutes façons je n'ai qu'un seul session start et un seul header sur le script.

Question annexe: le PDO pour MysQL, çà peut être une source d'erreur?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 juin 2011, 16:50

Tu as un soucis à la ligne 12, où tu dois envoyer des données au navigateur alors qu'il ne faudrait pas... montre nous tout le début de ton code (jusqu'au header :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

05 juin 2011, 17:01

Voici donc l'integralité de mon script... j'avais fait une erreur la premiere fois, le head était à la fin.

	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<title>Formulaire</title>
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="../css/designform.css" />
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	</head>


<?php
// si les valeurs ne sont pas vides
if(isset($_POST) && !empty($_POST['nom']) && !empty($_POST['prenom']) etc...))
// On exécute çà:
{
	try
	{
	// Connexion à la base de données 
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$bdd = new PDO('mysql:host=localhost;dbname=bla', 'bla', 'bla', $pdo_options);
	// test pour verification pseudo
	$count = $bdd->prepare('SELECT COUNT(*) FROM formulaire WHERE pseudo = :pseudo ');
	$count->bindValue('pseudo', $_POST['pseudo'], PDO::PARAM_STR);
	$count->execute();
	if ($count->fetchColumn()) 
		{
		echo '<p>Ce pseudo est déjà utilisé</p>';
		?><a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
		<?		
		}
		else
		{
		//test sur le mail utilisé (mail fac)
		$count = $bdd->prepare('SELECT COUNT(*) FROM formulaire WHERE mail = :mail ');
		$count->bindValue('mailfac', $_POST['mail'], PDO::PARAM_STR);
		$count->execute();

			if ($count->fetchColumn()) 
			{
			echo '<p> Ce mail  déjà été utilisé </p>';
			?><a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
			<?		
			}
			else
			// Si le pseudo n'est pas utilisé, on exécute:
			{
			   // Insertion dans la base de données via une requête préparée, ...) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 			   $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['mailperso'],, ...));
			
			//+ log in avec début d'une session
		session_start();
  $_SESSION['pseudo'] = $_POST['pseudo'];
  $_SESSION['nom'] = $_POST['nom'];
  $_SESSION['prenom'] = $_POST['prenom'];
header('Location: ../accueil/accueil.php');
exit(); 
			}
		
			}
	}

catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

}
else

{



	echo '<p>Tous les champs sont obligatoires ! Reprécisez votre mot de passe également SVP !</p>'; ?>
		<a href="javascript:history.back()">Retour</a>  <!--// Bouton "retour"-->
		<? exit;
}
?>

</html>


Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 juin 2011, 17:55

C'est dommage, il était bien à la fin, et c'est effectivement lui qui pose problème ;)

Tu peux résoudre le problème si tu as la main sur le fichier de configuration en spécifiant que php peut utiliser un buffer de sortie (en gros, il stock les données qu'il s’apprête à envoyer au navigateur jusqu'à un certain volume, ce qui permet de passer des header ou autre avant qu'il ne les envoi..... c'est une solution, mais c'est pas la meilleure puisque dépend fortement du serveur sur lequel le site est installé...

Donc le mieux, c'est de revoir un peu ton code pour que tu n'envois pas de html au navigateur si tu risque de rediriger ensuite. L'idée serait donc de faire tes tests comme maintenant, sauf qu'au lieu de mettre immédiatement un message d'erreur, tu stocke l'information dans une variable. Si tout est bon, tu peux ouvrir la session et faire la redirection. Sinon, tu affiches l'entête de ta page html avec le message d'erreur associé à l'info que tu as stocké plus haut... et le tour est joué :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

enzo
Invité n'ayant pas de compte PHPfrance

14 juil. 2011, 16:59

Petite précision : les headers et session_start n'ont pas besoin d'être placés en début de script ! Ils doivent seulement être placé avant que le script n'envoi des données au navigateur (donc avant tout echo, print, code html, ou tout espace ou retour à la ligne placé en dehors des balises <?php et ?> etc.) ... mais ça peut tout à fait être à la ligne 800 de ton script :)

A première vue, ton code semble correct... donne nous les messages d'erreur, ce sera plus facile pour t'aider :)

Merci pour ta réponse ça ma permis de résoudre mon problème et de mieux comprendre.
Même si c'est tard mon post je voulais te dire que grâce a toi j'ai résolu mon problème MERCI!!