Bonjour à tous!!

Voilà, cela fait quelques jours que cherche une solution… j'ai tout recommencé au moins 10 fois, relu mes cours et j'ai beau tournée ça dans n'importe quel sens, je ne m'en sors pas! Smiley biggol

Pour un devoir, je dois réaliser un système de panier pour un site de e-commerce.
Objectif : lister la liste des produits, leur prix et permettre de les ajouter au panier.
Le panier liste les produits, et affiche le montant total.
C'est là que mon problème commence : stocker les informations concernant le panier dans un cookie valable 15 jours. Smiley sweatdrop

Voilà comment j'ai fait :
1 page index.php avec la liste des produits, leurs prix, et ajouter au panier. Ainsi qu'un lien "voir mon panier"
1 page cookie : avec les informations à enregistrer (user_id et produit_id, obtenu par $_Get['id']
1 page panier : affiche les résultats de ma sauvegarde cookie.

Mon problème : l'erreur php "Variable non définie: data_panier" dans la page cookie!!!!

Voici mon code :
<?php
if (!isset($_COOKIE['panier']))
{
	$user_id = uniqid();
	
	if (isset($_GET['id']))
	{
		$produit_id = $_GET['id'];
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);	
		
		$mysqli->query('INSERT INTO data_panier (user_id, produit_id) VALUES ("'.$user_id.'",'.$produit_id.')');
		echo '<p>Vous êtes' .$user_id.'Vous avez choisi le produit ' .$produit_id.'.</p>';	
	}

	else
	{
		$produit_id = 0;
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		
		$mysqli->query('INSERT INTO data_panier (user_id) VALUES ("'.$user_id.'")');
		echo '<p>Vous n\'avez pas choisi de produit.</p>';
	}
}
if ((isset($_COOKIE['panier'])) AND (isset($_GET['id'])))
{
	$donneepanier = $_COOKIE['panier'];
	$donneepanier = unserialize($donneepanier);
	$user_id = $donneepanier['user_id'];
	$produit_id = $donneepanier['produit_id'];
	$data_panier = serialize($donneepanier);

		$mysqli->query('INSERT INTO data_panier (produit_id) VALUES ('.$produit_id.') WHERE user_id = "'.$user_id.'"');
}
setcookie('panier', $data_panier, time()+1296000);
?>
<hr>
<?php 
	print_r($_COOKIE);
?>
<br>
<a href="delete_cookie.php">Supression du cookie</a>


Merci de votre indulgence, je suis novice, j'ai beaucoup de choses à apprendre, mais là visiblement, il y a quelque chose que je ne comprends pas, car pour moi, à chaque étape ma variable est définie…
Modérateur
Bonjour,

Faut faire des echo à chaque ligne.
Y a-t-il bien ce que tu attends dans $_GET['id'], dans $donneepanier, etc.

As-tu bien aussi fait un $mysqli = new mysqli(...) ?

Amicalement,
Bonjour,

A première vue :
$_GET['id'] : oui j'ai bien la valeur de l'id_produit qui vient de la page index.php

pour $donneeanier : normalement, c'est le resultat de mon cookie en format tableau :
$donneepanier = $donneepanier['user_id'] et $donneepanier['produit_id]

et j'ai cru un moment que j'avais oublié le principal, mais j'ai également
$mysqli = new mysqli('localhost','root','','projet_devoir_deux');
D'ailleurs, une question, est-ce logique, puisque les cookies sont stockés sur le pc client?!

Je vais tester les echo, partout, je reviens vers vous.

Merci de ton retour parsimonhi
Bon alors, ca a été plus vite que je ne pensais…

Lors de la première connexion : pas de message d'erreur et echo s'affiche bien.

Lorsque j'ajoute un ou meme plusieurs produit au panier : cela me reconnais bien et le message echo s'affiche également.

Le message d'erreur s'affiche lorsque je veux accéder au panier (panier.php) :
"Variable non définie: data_panier dans C: \ wamp64 \ www \ devoir \ cookiet.php à la ligne 41"

Smiley sweatdrop Smiley sweatdrop Smiley sweatdrop Smiley sweatdrop
Modérateur
Bonjour,

N'ayant qu'une vue partielle du code, difficile de s'y retrouver.

Ceci étant, je signale que la fonction setcookie() doit être exécutée avant tout affichage d'html dans la page.

Amicalement,
Bonsoir,

Oui en effet la fonction setcookie() est exécutée avant tout affichage d'html.
Je vous mets l'ensemble de mes pages…
La page index.php :


<?php
$mysqli = new mysqli('localhost','root','','projet_devoir_deux'); ?>
<?php require('cookie.php');?>
<!DOCTYPE html>
<html>
<head>
<title>Rechercher des informations sur une ville</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<div id="wrapper">
<body>
	<h1>Liste des articles</h1>
<main id="container">
<?php
$result = $mysqli->query('SELECT produit_id, produit_nom, produit_prix FROM produits');
While ($row = $result->fetch_array())
{
	$produit_id = $row['produit_id'];
	$produit_nom = $row['produit_nom'];
	$produit_prix = $row['produit_prix'];
	$produits[$produit_id] = $produit_nom;
}
?>
<div class="listeproduits">
	<ul>
	<?php foreach ($produits as $produit_id => $produit_nom):?>
		<li><?php echo $produit_nom ?> - <?php echo $produit_prix ?></li>
		<li><a href="index.php?id=<?php echo $produit_id ?>">Ajouter au panier</a></li>
	<?php endforeach ?>
	</ul>
</div>
<div id="formulaire">
<form method="GET">
	<p><a href="panier.php">Voir mon Panier</p>
	<p id="panier"><input type="image" name="submit_form" value="" src="img/panier.png"/></a></p>
</form>
</div>

<?php require('inc_footer.php');?>
</div>


Page cookie.php


<?php
$mysqli = new mysqli('localhost','root','','projet_devoir_deux'); ?>
<?php
if (!isset($_COOKIE['panier']))
{
	$user_id = uniqid();
	echo '<p>C\'est votre première connexion</p>';
	
	if (isset($_GET['id']))
	{
		$produit_id = $_GET['id'];
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);	
		
		$mysqli->query('INSERT INTO data_panier (user_id, produit_id) VALUES ("'.$user_id.'",'.$produit_id.')');
		echo '<p>Vous êtes' .$user_id.'Vous avez choisi le produit ' .$produit_id.'.</p>';	
	}

	else
	{
		$produit_id = 0;
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		
		$mysqli->query('INSERT INTO data_panier (user_id) VALUES ("'.$user_id.'")');
		echo '<p>Vous n\'avez pas choisi de produit.</p>';
	}
}
if ((isset($_COOKIE['panier'])) AND (isset($_GET['id'])))
{
	$donneepanier = $_COOKIE['panier'];
	$donneepanier = unserialize($donneepanier);
	$user_id = $donneepanier['user_id'];
	$produit_id = $_GET['id'];
	$produit_id = $donneepanier['produit_id'];
	$data_panier = serialize($donneepanier);

		$mysqli->query('INSERT INTO data_panier (produit_id) VALUES ('.$produit_id.') WHERE user_id = "'.$user_id.'"');
		echo '<p>Vous êtes connecte et Vous avez choisi le produit ' .$produit_id.'.</p>';
}
setcookie('panier', $data_panier, time()+1296000);
?>
<hr>
<?php 
	print_r($_COOKIE);
?>
<br>
<a href="delete_cookie.php">Supression du cookie</a>


Page panier.php


<?php
$mysqli = new mysqli('localhost','root','','projet_devoir_deux'); ?>
<?php require('cookie.php');?>
<!DOCTYPE html>
<html>
<head>
<title>Rechercher des informations sur une ville</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<div id="wrapper">
<body>
	<h1>Liste des articles</h1>
<main id="container">
<?php
if (!isset($_COOKIE['panier']))
{
	$user_id = uniqid();
	echo '<p>C\'est votre première connexion</p>';
	
	if (isset($_GET['id']))
	{
		$produit_id = $_GET['id'];
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);	
		
		$mysqli->query('INSERT INTO data_panier (user_id, produit_id) VALUES ("'.$user_id.'",'.$produit_id.')');
		echo '<p>Vous êtes' .$user_id.'Vous avez choisi le produit ' .$produit_id.'.</p>';	
	}

	else
	{
		$produit_id = 0;
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		
		$mysqli->query('INSERT INTO data_panier (user_id) VALUES ("'.$user_id.'")');
		echo '<p>Vous n\'avez pas choisi de produit.</p>';
	}
}
if ((isset($_COOKIE['panier'])) AND (isset($_GET['id'])))
{
	$donneepanier = $_COOKIE['panier'];
	$donneepanier = unserialize($donneepanier);
	$user_id = $donneepanier['user_id'];
	$produit_id = $_GET['id'];
	$produit_id = $donneepanier['produit_id'];
	$data_panier = serialize($donneepanier);

		$mysqli->query('INSERT INTO data_panier (produit_id) VALUES ('.$produit_id.') WHERE user_id = "'.$user_id.'"');
		echo '<p>Vous êtes connecte et Vous avez choisi le produit ' .$produit_id.'.</p>';
}
setcookie('panier', $data_panier, time()+1296000);
?>
<hr>
<?php 
	print_r($_COOKIE);
?>
<br>
<a href="delete_cookie.php">Supression du cookie</a>


Voilà vous avez tout… Je continue mes tests...
Modérateur
Bonjour,

Bon, alors mon conseil est le suivant :

Tu mets le contenu de cookie.php directement dans index.php.

Tu retires les lignes <?php require('cookie.php');?> dans index.php et panier.php.

Tu fais ton setcookie en haut de la page index.php.

Et après, tu essaies de mettre au point ton code dont la moitié est à refaire.

Amicalement,
Lol ok... Mais tu peux me dire quel code est a refaire?
J'ai bien compris que je devais remettre le cookie dans la page index mais quel est le code à refaire? Celui de la page panier?
Modérateur
Bonjour,

Le premier problème à régler, c'est que le code de cookie.php, que tu vas donc mettre dans index.php, contient actuellement des instructions qui affichent quelque chose dans la page, et que le setcookie est appelé après ça. Déjà, rien que ça, ça empêche l'ensemble de fonctionner comme attendu.

Donc, tu mets ce code de cookie.php en haut de ta page index.php, et tu retires tous les echo qui se trouvent dans cette partie.

Evidemment, du coup, ça va être moins commode pour comprendre ce qui s'y passe. Pour tracer ce qui se passe d'une manière suffisamment simple pour que tu y arrives, tu peux mettre chacun des contenus de tes echos que tu fais actuellement avant le setcookie() dans des variables intermédiaires. et afficher le contenu de ces variables plus loin dans le code de index.php.

Par exemple, tu peux remplacer la ligne :
echo '<p>C\'est votre première connexion</p>';
par
$message1= '<p>C\'est votre première connexion</p>';

Et ensuite, après la ligne :
<h1>Liste des articles</h1>
tu rajoutes
<?php echo $message1.'<br>'; ?>


Ce n'est qu'un exemple. Il faut faire quelque chose de similaire pour les autres echos, avec des $message2, $message3, etc.

Amicalement,
Re-bonjour,

Bon alors j'ai fait quelques modification suite à tes recommandations…
Je crois que j'ai trouvé d'où vient le problème… Il semblerait que mon cookie enregistre uniquement le dernier produit ajouté au panier…
Où mon code pour le panier n'est pas bon… car j'ai l'erreur "Uncaught Error: Call to a member function fetch_array() " qui s'affiche… Quoi qu'il en soit je suis bloquée Smiley fache
Voici où j'en suis dans mon code :

Index.php :

<?php
/* Connexion */
$mysqli = new mysqli('localhost','root','','projet_devoir_deux');
?>
<?php
if (isset($_COOKIE['panier']))
{
	$donneepanier = $_COOKIE['panier'];
	$donneepanier = unserialize($donneepanier);
	$user_id = $donneepanier['user_id'];
	
	$message =  'Vous êtes connecte sous le user : ' .$user_id.'.';
	
	if (isset($_GET['id']))
	{
		$donneepanier = $_COOKIE['panier'];
		$donneepanier = unserialize($donneepanier);
		$produit_id = $_GET['id']++;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		$message = 'Vous êtes connecte sous le user : ' .$user_id.'.et Vous avez choisi le produit ' .$produit_id.'.';
	}
	else 
	{
		$produit_id = 0;
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		$message ='Vous êtes connecté sous le user : '.$user_id.'Vous n\'avez pas choisi de produit ';		
	}
}
else
{
	$user_id = uniqid();
	$message = 'C\'est votre première connexion';
	
	if (isset($_GET['id']))
	{
		$donneepanier['user_id'] = $user_id;
		$produit_id = $_GET['id']++;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);	
	
		$message = 'Vous avez choisi le produit '.$produit_id.'.';	
	}

	else
	{
		$produit_id = 0;
		$donneepanier['user_id'] = $user_id;
		$donneepanier['produit_id'] = $produit_id;
		$data_panier = serialize($donneepanier);
		
		$message ='Vous n\'avez pas choisi de produit.';
	}
}
$datapanier ='';
setcookie('panier', $data_panier, time()+1296000);
?>
<hr>
<?php if(isset($message)): ?>
<div><?php echo $message ?></div>
<?php endif ?>
<br>
<a href="delete_cookie.php">Supression du cookie</a>
<!DOCTYPE html>
<html>
<head>
<title>Site e-commerce</title>
<link rel="stylesheet" href="styles.css" type="text/css" />
</head>
<div id="wrapper">
<body>
	<header class="header">
		<h1>Produit.com</h1>
	</header>

	<main class="container">
		<h2>Liste des articles</h2>
<?php
	$result = $mysqli->query('SELECT produit_id, produit_nom, produit_prix FROM produits');
	While ($row = $result ->fetch_array())
	{
		$id = $row ['produit_id'];
		$nom = $row ['produit_nom'];
		$prix = $row ['produit_prix'];
		$produits[$id] = $nom;
	}
?>
		<div class="liste">
			<ul>
			<?php foreach ($produits as $id => $nom):?>
			<li><?php echo $nom ?> - <?php echo $prix ?> euros</a></li>
			<li id="liste2"><a href="index.php?id=<?php echo $produit_id ?>">Ajouter au panier</a></li>
			<?php endforeach ?>
			</ul>
		</div>
<div id="formulaire">
<form method="GET">
	<p><a href="panier.php">Voir mon Panier</p>
	<p id="panier"><input type="image" name="submit_form" value="" src="img/panier.png"/></a></p>
</form>
</div>


panier.php :

<?php
if(empty($_GET['submit_form']))
{
	?><h2>Liste de vos produits</h2><?php
	if (!isset($_COOKIE['panier']))
	{
		echo 'vous n\'avez pas de produit dans votre panier.';
	}
	else
	{	$result = $_COOKIE['panier'];
		While ($row = $result ->fetch_array())
		{
		$row = $result-> fetch_array();
		$produit_id = $row['produit_id'];
		$user_id = $row['user_id'];
		$panier[$user_id] = $produit_id;
		}
?>
		 	<h2>Liste de vos produits</h2>
		<div class="inline2">
			<ul>
			<?php foreach ($panier as $user_id => $produit_id):?>
			<li><?php echo $user_id ?> <?php echo $produit_id ?></li>
			<?php endforeach ?>
			</ul>
		</div>
<?php
	}
}
?>

Modifié par Latribu (11 Nov 2019 - 10:05)
Je suis aussi bloquer sur le même exercice, quand j'ajoute à mon panier, le cookie valide bien la sélection du produit mais le panier enregistre rien