PHP Cookies Undefined index

Résolu/Fermé
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 - Modifié par Allen1210 le 31/12/2010 à 22:49
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 - 1 janv. 2011 à 21:08
Bonjour, voici un code PHP qui me donne du trouble.


HTML : test2.php
<?php 
session_start(); // On démarre la session AVANT toute chose 
setcookie('pseudo', '', time() + 365*24*3600, null, null, false, true); 
?>  
 <form method="POST" action="test.php"> 
  <p> 
   <label for="pseudo">Pseudo</label><br /> 
   <input name="pseudo" id="pseudo" type="text" /><br /> 
  </p> 
  <p> 
   <input value="Envoyer" type="submit" /> 
  </p> 
 </form> 


PHP : test.php
<?php 
session_start(); // On démarre la session AVANT toute chose 
setcookie('pseudo', '', time() + 365*24*3600, null, null, false, true); 
?>  

<?php 
if (isset($_POST['pseudo'])) 
{ 
$_SESSION['pseudo']= $_POST['pseudo']; 

setcookie('pseudo', $_SESSION['pseudo'], time() + 365*24*3600, null, null, false, true); 

echo $_POST['pseudo']; 
echo $_SESSION['pseudo'];
echo $_COOKIE['pseudo']; 

} 
else 
{ 
echo "ERREUR"; 
} 
?> 


echo $_POST['pseudo']; fonctionne
echo $_SESSION['pseudo']; fonctionne
echo $_COOKIE['pseudo']; ne fonctionne pas la 1ere fois seulement.



Il n'y a jamais rien pour rien OU je pourrais avoir réponse à tout.
Cordialement Allen.
A voir également:

4 réponses

avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
1 janv. 2011 à 13:41
Salut.

setcookie() doit être utilisé avant l'envoie des entêtes HTTP.
Celles-ci sont envoyées avant le premier caractère ou à la fin de l'exécution du script.

Les retours à la lignes que tu mets entre les deux "balises" PHP sont des caractères (invisible, mais ils sont bien là, et ils sont représentés par \n).

Ça ne fonctionne pas la première fois car les cookies sont envoyés par le navigateur lors de la requête pour obtenir la page Web. Hors, tu définis le cookie après la requête (donc le navigateur n'a pas encore le cookie et ne le transmet donc pas).

C'est pour cette raison que ça ne fonctionne pas la première fois.
1
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 56
1 janv. 2011 à 19:06
J'ai pas très bien compris.... Voudrais-tu essayer d'imager tes propos, je suis très visuel.
0
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
1 janv. 2011 à 19:40
Le protocole HTTP est utilisé pour communiqué entre le client et le serveur.

Lorsque le navigateur demande au serveur une page Web ou n'importe quel type de fichier, il envoie une requête dans le protocole HTTP (on dit une requête HTTP). Dans cette requête, le navigateur indique des données comme le fichier désiré, la méthode (GET ou POST le plus fréquemment) et d'autres données, dont les cookies accessibles par le fichier demandé.

Lorsque tu envoies le formulaire, tu tombes sur la page teste.php.
Mais le navigateur ne connaissant pas encore le cookie, il ne le transmet pas, et donc, ton script PHP ne peut pas récupérer $_COOKIE['pseudo']

Quand tu utilises setcookie(), le serveur va indiquer le cookie au navigateur à l'aide des entêtes HTTP. Ces entêtes précèdent le contenu du fichier demandé. Elles contiennent par exemple le code du résultat (200=Ok, 404=Not Found, etc), la longueur du fichier, l'encodage, ET les cookies qui ont été créé.
C'est parce que les cookies sont indiqués dans les entêtes qu'il faut les définir avec qu'elles (les entêtes) ne soient envoyées au navigateur.

Pour en revenir à ton code, sur la page teste2.php, le cookie n'existe pas.
Lorsqu'on soumet le formulaire, on tombe sur teste.php
Le navigateur ne connait pas le cookie, donc il ne l'envoie pas au serveur.
Le script s'exécute, et là, un cookie est créé : il est envoyé au navigateur
Mais temps que tu ne recharges pas la page, le serveur ne pourra pas accèder au cookie : c'est le navigateur qui va le retransmettre après, au deuxième chargement de teste.php, et seulement là, tu pourras y accèder en PHP, via $_COOKIE.
0
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 56
1 janv. 2011 à 19:50
OK... ça j'ai compris. Mais j'ai un setcookie dans mes deux pages.

Donc, lorsque je charge mon formulaire dans la page test2.php, le cookie devrait se créer.

Alors, j'envoie le formulaire, le cookie pseudo devrait quand même exister.

Seulement sa valeur est "".

Peut-tu m'expliquer ça SVP

PS : Désolé si je comprends rien XD
0
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
Modifié par avion-f16 le 1/01/2011 à 20:14
Tu ne peux pas créer un cookie vide.
Donc, quand tu fais setcookie('pseudo',''), tu ne crées rien du tout.
C'est d'ailleur de cette manière qu'il faut supprimer un cookie en PHP.
0
Utilisateur anonyme
31 déc. 2010 à 21:26
ce code c'est bien celui de ton fichier test.php ?
0
Utilisateur anonyme
31 déc. 2010 à 22:54
apparemment dans le manuel php , ils disent d'utiliser la fonction setcookie avant la balise <html> sinon ca renvoie FALSE.

"...Les cookies doivent passer avant tout autre en-tête (c'est une restriction des cookies, pas de PHP). Cela vous impose d'appeler cette fonction(setcookie) avant toute balise <html> ou <head> . Si quelque chose a été envoyé avant l'appel à cette fonction, setcookie échouera et retournera FALSE ..."
0
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 56
Modifié par Allen1210 le 31/12/2010 à 23:00
Il est bien en haut... que fait-on si l'on veux le modifier?
On fais ce que j'ai fais non?
0
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 56
1 janv. 2011 à 20:29
J'ai modifier mes codes. Je commence sur la page test2.php et j'envoie le formulaire.

HTML : test2.php

<?php session_start(); // On démarre la session AVANT toute chose ?>

<?xml version="1.0" encoding="iso-8859-1"?>
<!--*************************
index.php
Créer par : Allen Mercier
Date : 17 décembre 2010
But : Page d'accueil
   **************************-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
</head>
<body>

<!-- Ce qui se répète -->
<div id="corps">
	<form method="POST" action="test.php">
		<p>
			<label for="pseudo">Pseudo</label><br />
			<input name="pseudo" id="pseudo" type="text" /><br />
		</p>
		<p>
			<input value="Envoyer" type="submit" />
		</p>
	</form>
</div>
</body>
</html>


PHP : test.php

<?php session_start(); // On démarre la session AVANT toute chose ?>
<?php
if (isset($_POST['pseudo']) AND $_POST['pseudo'] != "")
{
$_SESSION['pseudo']= $_POST['pseudo'];
setcookie('pseudo', $_SESSION['pseudo'], time() + 365*24*3600, null, null, false, true);
}
else
{
}
?>

<?xml version="1.0" encoding="iso-8859-1"?>
<!--*************************
index.php
Créer par : Allen Mercier
Date : 17 décembre 2010
But : Page d'accueil
   **************************-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
</head>
<body>

<!-- Ce qui se répète -->
<div id="corps">
<?php
if (isset($_POST['pseudo']) AND $_POST['pseudo'] != "")
{
echo $_POST['pseudo'];
echo $_SESSION['pseudo'];
echo $_COOKIE['pseudo'];
}
else
{
echo "ERREUR";
}
?>

</div>
</body>
</html>
0
Allen1210 Messages postés 361 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 28 avril 2017 56
1 janv. 2011 à 20:30
Maintenant ma question est : Comment éviter le chargement retardataire du cookie?

Dois-je générer un rechargement automatique?
0
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
1 janv. 2011 à 21:08
Vérifie si le cookie existe.
Si oui, tu l'utilises.
Sinon, tu vérifies si la variable POST existe.
Si oui, alors c'est elle qui remplacera le cookie pour cette fois (puisque après, le cookie sera présent)
Si non, c'est qu'il y a un problème.
0