[Résolu] Perdu avec les cookies

Eléphanteau du PHP | 22 Messages

10 déc. 2011, 19:28

Bonjour à tous,

J'ai créer un minichat et maintenant je souhaite l'améliorer en utilisant des cookies pour retenir le pseudonyme du visiteur.
Mais je suis complètement perdu je n'arrive pas à utiliser les cookies.
Le script est sur 2 fichiers.

index.php :
<?php 
if (!isset($_SESSION['pseudonyme']))
{
	setcookie('pseudonyme', $pseudonyme, time() + 1*24*3600, null, null, false, true);
	
	$pseudonyme = htmlspecialchars($_SESSION['pseudonyme'], ENT_QUOTES, 'UTF-8';
}
else
{
	$pseudonyme = htmlspecialchars($_SESSION['pseudonyme'], ENT_QUOTES, 'UTF-8';
}
?>

<!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" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>Mini Chat</title>

	<link rel="stylesheet" media="screen" href="style.css" />
</head>
<body>
<h1>Espace Chat</h1>

<form action="minichat_post.php" method="post">
	<p><label for="pseudonyme">Pseudonyme : </label><input type="text" name="pseudonyme" id="pseudonyme" value="<?php echo $pseudonyme ?>" /></p>
	<p><label for="message">Message : </label><input type="text" name="message" id="message" /></p>
	<p><input type="submit" value="Envoyer" /></p>
</form>

<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

$req = $pdo->query('SELECT * FROM minichat ORDER BY id_chat DESC LIMIT 0, 10');

while ($donnees = $req->fetch())
{
	echo '<p><strong>' .htmlspecialchars($donnees['pseudo_chat'], ENT_QUOTES, 'UTF-8'). '</strong> : ' .htmlspecialchars($donnees['message_chat'], ENT_QUOTES, 'UTF-8').'</p>'."\n\n";
}

$req->closeCursor();
?>
</body>
</html>
minichat_post.php :
<!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" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>Mini Chat</title>

	<link rel="stylesheet" media="screen" href="style.css" />
</head>
<body>
<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

if (isset($_POST['pseudonyme']) && isset($_POST['message']))
{
	// On supprime les espaces inutiles en début et fin de chaîne.
	$pseudonyme = trim($_POST['pseudonyme']);
	$message = trim($_POST['message']);
	
	if (!empty($pseudonyme) && !empty($message))
	{
		// On prépare la requête.
		$req = $pdo->prepare('INSERT INTO minichat(pseudo_chat, message_chat) VALUES(:pseudonyme, :message)');
		
		// Puis on insère les données dans la BDD.
		$req->execute(array(
			':pseudonyme' => $pseudonyme,
			':message' => $message
			));
			
		// Enfin, on redirige sur la page du formulaire.
		header('Location: index.php');
	}
	else
	{
		header('Location: index.php');
	}
}
else
{
	header('Location: index.php');
}
?>
</body>
</html>
Là le script plante avec une parse error, mais pour le reste concernant les cookies je ne suis pas du tout sur de se que j'ai fait...
Si vous avez une idée ??
Merci
Modifié en dernier par Rathorian le 15 déc. 2011, 10:10, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

10 déc. 2011, 20:12

Il manque les parenthèses fermantes de htmlspecialchars() pour le premier script.
Et pour le second tu envoies du html avant de faire un header().

Pour les cookies il te suffit d'enregistrer $pseudonyme dans un cookie en utilisant setcookie().
Il y a des exemples dans la documentation. :)

Eléphanteau du PHP | 22 Messages

10 déc. 2011, 22:36

J'ai refait un peu mon code PHP au niveau des cookies, car j'avais fait un peu n'importe quoi...
La ligne qui permet de créer le cookie, je l'ai mise sur la page de traitement (minichat_post.php).

index.php :
<!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" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>Mini Chat</title>

	<link rel="stylesheet" media="screen" href="style.css" />
</head>
<body>
<h1>Espace Chat</h1>

<form action="minichat_post.php" method="post">
	<p><label for="pseudonyme">Pseudonyme : </label><input type="text" name="pseudonyme" id="pseudonyme" value="<?php echo htmlspecialchars($_COOKIE['pseudonyme'], ENT_QUOTES, 'UTF-8'); ?>" /></p>
	<p><label for="message">Message : </label><input type="text" name="message" id="message" /></p>
	<p><input type="submit" value="Envoyer" /></p>
</form>

<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

$req = $pdo->query('SELECT * FROM minichat ORDER BY id_chat DESC LIMIT 0, 10');

while ($donnees = $req->fetch())
{
	echo '<p><strong>' .htmlspecialchars($donnees['pseudo_chat'], ENT_QUOTES, 'UTF-8'). '</strong> : ' .htmlspecialchars($donnees['message_chat'], ENT_QUOTES, 'UTF-8').'</p>'."\n\n";
}

$req->closeCursor();
?>
</body>
</html>
minichat_post.php :
<?php 
if (!isset($_COOKIE['pseudonyme']))
{
	setcookie('pseudonyme', $pseudonyme, time() + 1*24*3600, null, null, false, true);
}
?>

<!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" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>Mini Chat</title>

	<link rel="stylesheet" media="screen" href="style.css" />
</head>
<body>
<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

if (isset($_POST['pseudonyme']) && isset($_POST['message']))
{
	// On supprime les espaces inutiles en début et fin de chaîne.
	$pseudonyme = trim($_POST['pseudonyme']);
	$message = trim($_POST['message']);
	
	if (!empty($pseudonyme) && !empty($message))
	{
		// On prépare la requête.
		$req = $pdo->prepare('INSERT INTO minichat(pseudo_chat, message_chat) VALUES(:pseudonyme, :message)');
		
		// Puis on insère les données dans la BDD.
		$req->execute(array(
			':pseudonyme' => $pseudonyme,
			':message' => $message
			));
			
		// Enfin, on redirige sur la page du formulaire.
		header('Location: index.php');
	}
	else
	{
		header('Location: index.php');
	}
}
else
{
	header('Location: index.php');
}
?>
</body>
</html>
Maintenant j'ai une erreur de type : Notice: Undefined index: pseudonyme in C:\wamp\www\cours_php\tp\tp2\index.php on line 14 Call Stack #TimeMemoryFunctionLocation 10.0009676376{main}( )..\index.php:0 " />

Par contre dans la FAQ je n'ai rien trouvé d'intéressant concernant les Cookies...

ViPHP
xTG
ViPHP | 7331 Messages

10 déc. 2011, 22:39

Si le cookie n'existe pas il ne faut pas tenter de l'afficher.
if( isSet($_COOKIE['pseudonyme']) )
  echo htmlspecialchars($_COOKIE['pseudonyme'], ENT_QUOTES, 'UTF-8');
Concernant la documentation, je parlais de la documentation PHP qui est incontournable : http://php.net

Eléphanteau du PHP | 22 Messages

10 déc. 2011, 22:52

D'accord, mais dans ce cas, je dois marquer quoi dans le "value=" ?

Et pour la création du cookie, je ne sais pas si je dois le faire sur la page de traitement ou sur l'index.

ViPHP
xTG
ViPHP | 7331 Messages

11 déc. 2011, 04:37

Quel "value=" ?
Pour la création du cookie étant donné que sur ta page d'index tu n'as pas l'information...
La question se pose-t-elle ?

Eléphanteau du PHP | 22 Messages

11 déc. 2011, 10:16

Le "value=" du formulaire sur la page index.php pour permettre l'affichage du pseudonyme que le cookie a enregistré :
value="<?php echo htmlspecialchars($_COOKIE['pseudonyme'], ENT_QUOTES, 'UTF-8'); ?>"
Vraiment désolé, mais je n'ai pas compris ta deuxième phrase !

ViPHP
xTG
ViPHP | 7331 Messages

11 déc. 2011, 11:00

Si le cookie n'existe pas il ne faut pas tenter de l'afficher.
if( isSet($_COOKIE['pseudonyme']) )
  echo htmlspecialchars($_COOKIE['pseudonyme'], ENT_QUOTES, 'UTF-8');
Concernant la documentation, je parlais de la documentation PHP qui est incontournable : http://php.net
Ton problème est que si le cookie n'existe pas tu génères un warning.
Donc il faut vérifier qu'il existe avant de tenter de l'afficher.

Eléphanteau du PHP | 22 Messages

11 déc. 2011, 12:27

J'ai modifié de nouveau le code, je te montre seulement la partie PHP cette fois ci, le reste n'ayant pas bougé.

index.php :
<?php 
if (isset($_COOKIE['pseudonyme']))
{
	$pseudonyme_enregistre = htmlspecialchars($_COOKIE['pseudonyme'], ENT_QUOTES, 'UTF-8');
}
else
{
	$pseudonyme_enregistre = '';
}
?>

<form action="minichat_post.php" method="post">
	<p><label for="pseudonyme">Pseudonyme : </label><input type="text" name="pseudonyme" id="pseudonyme" value="<?php echo $pseudonyme_enregistre; ?>" /></p>
	<p><label for="message">Message : </label><input type="text" name="message" id="message" /></p>
	<p><input type="submit" value="Envoyer" /></p>
</form>
minichat_post.php :
<?php 
if (!isset($_COOKIE['pseudonyme']))
{
	setcookie('pseudonyme', $pseudonyme, time() + 1*24*3600, null, null, false, true);
}
?>
Maintenant je n'ai plus aucune erreur mais rien ne s'affiche dans le "value=" de mon input...

ViPHP
xTG
ViPHP | 7331 Messages

11 déc. 2011, 14:07

Fais un var_dump($_COOKIE); pour voir si le cookie est bien créé.

Et simplifie l'appel à setcookie() :
setcookie('pseudonyme', $pseudonyme, time() + 1*24*3600);
Car je suis pas sûr déjà qu'il accepte des null en paramètre... Donc si ton niveau d'erreur est mal géré tu ne verras rien alors que ça le choque.

Eléphanteau du PHP | 22 Messages

11 déc. 2011, 14:29

J'ai fait ce que tu ma dis, le var_dump() me retourne :
array
empty

ViPHP
xTG
ViPHP | 7331 Messages

11 déc. 2011, 21:10

Les cookies sont activés sur ton navigateur ? :lol:

Eléphanteau du PHP | 22 Messages

11 déc. 2011, 21:30

Oui oui aucun souci de ce côté là !

ViPHP
xTG
ViPHP | 7331 Messages

13 déc. 2011, 14:58

Quel est ton niveau d'error_reporting ?
Affiches le retour de la fonction setcookie().

Eléphanteau du PHP | 22 Messages

13 déc. 2011, 20:59

Mon niveau d'erreur :
error_reporting = E_ALL

Étant débutant je ne vois pas comment te mettre le retour de la fonction setcookie(). :(