8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour , je suis débutant en php , je souhaite créer une page qui doit lister les produits et leur prix et permettre de les ajouter au panier. Le panier liste les produits
sélectionnés et affiche le montant total.

voici mon code de la page produit.php :
<!DOCTYPE html>
<html>
<body>

	<div>
		<?php

		$mysqli = new mysqli('localhost', 'root', '', 'projet_produits');

		$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.'<br>'.$produit_Prix;
}

		?>
	</div>
	
			<ul>
		
			<?php foreach($produits as $id => $produit) : ?>
			<a href="panier.php">Ajouter au panier</a>
			<li><?php echo $produit ?> </li> <br>
			
			<?php endforeach ?>
			</ul>
		<a href="panier.php">Panier</a>
		<?php
		$result->free();
		$mysqli->close();
		?>
	
</body>
</html>


Pour l'ajout du panier je ne sais pas comment je dois procéder

Cordialement
Salut

OK cette ligne est très bizarre :
$produits[$produit_Id] = $produit_Nom.'<br>'.$produit_Prix;

à méditer.


Pour ajouter au panier tu as deux méthodes. Mais tu n'utilise ni l'une, ni l'autre.
Le mieux est de passer par un formulaire <form> pour pouvoir récupérer les informations soit par GET soit par POST des articles devant être ajouté au panier.

Je te conseil ce tuto
J'ai crée deux pages de code panier.php et lien_panier.php:
<?php

session_start();
include_once("lien_panier.php");

$erreur = false;

$action = (isset($_POST['action'])? $_POST['action']:  (isset($_GET['action'])? $_GET['action']:null )) ;
if($action !== null)
{
   if(!in_array($action,array('ajout', 'suppression', 'refresh')))
   $erreur=true;

   $produit_Id = (isset($_GET['produit_Id'])? $_GET['produit_Id']:null) ;
   $produit_Prix = (isset($_GET['produit_Prix'])? $_GET['produit_Prix']:null) ;
   $produit_Quantite = (isset($_GET['produit_Quantite'])? $_GET['produit_Quantite']:null) ;

   $produit_Id = preg_replace('#\v#', '',$produit_Id);

   $produit_Prix = floatval($produit_Prix);

   if (is_array($produit_Quantite)){
      $QteArticle = array();
      $i=0;
      foreach ($q as $contenu){
         $QteArticle[$i++] = intval($contenu);
      }
   }
   else
   $produit_Quantite = intval($produit_Quantite);
    
}

if (!$erreur){
   switch($action){
      Case "ajout":
         ajouterArticle($produit_Id,$produit_Quantite,$produit_Prix);
         break;

      Case "suppression":
         supprimerArticle($produit_Id);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($QteArticle) ; $i++)
         {
            modifierQTeArticle($_SESSION['panier']['produit_Id'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }
}

echo '<?xml version="1.0" encoding="utf-8"?>';?>
<!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>Votre panier</title>
</head>
<body>

<form method="post" action="panier.php">
<table style="width: 400px">
	<tr>
		<td colspan="4">Votre panier</td>
	</tr>
	<tr>
		<td>Référence</td>
		<td>Quantité</td>
		<td>Prix Unitaire</td>
		<td>Action</td>
	</tr>


	<?php
	if (creationPanier())
	{
	   $nbArticles=count($_SESSION['panier']['produit_Id']);
	   if ($nbArticles <= 0)
	   echo "<tr><td>Votre panier est vide </ td></tr>";
	   else
	   {
	      for ($i=0 ;$i < $nbArticles ; $i++)
	      {
	         echo "<tr>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['produit_Id'][$i])."</ td>";
	         echo "<td><input type=\"text\" size=\"4\" name=\"q[]\" value=\"".htmlspecialchars($_SESSION['panier']['produit_Quantite'][$i])."\"/></td>";
	         echo "<td>".htmlspecialchars($_SESSION['panier']['prixProduit'][$i])."</td>";
	         echo "<td><a href=\"".htmlspecialchars("panier.php?action=suppression&l=".rawurlencode($_SESSION['panier']['produit_Id'][$i]))."\">XX</a></td>";
	         echo "</tr>";
	      }

	      echo "<tr><td colspan=\"2\"> </td>";
	      echo "<td colspan=\"2\">";
	      echo "Total : ".MontantGlobal();
	      echo "</td></tr>";

	      echo "<tr><td colspan=\"4\">";
	      echo "<input type=\"submit\" value=\"Rafraichir\"/>";
	      echo "<input type=\"hidden\" name=\"action\" value=\"refresh\"/>";

	      echo "</td></tr>";
	   }
	}
	?>
</table>
</form>
</body>
</html>


<?php

function creationPanier(){
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['produit_Id'] = array();
      $_SESSION['panier']['produit_Quantite'] = array();
      $_SESSION['panier']['produit_Prix'] = array();
      $_SESSION['panier']['verrou'] = false;
   }
   return true;
}

function ajouterArticle($produit_Id,$produit_Quantite,$produit_Prix){

   if (creationPanier() && !isVerrouille())
   {
      $positionProduit = array_search($produit_Id,  $_SESSION['panier']['produit_Id']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['produit_Quantite'][$positionProduit] += $produit_Quantite ;
      }
      else
      {
         //Sinon on ajoute le produit
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Prix'],$produit_Prix);
      }
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

function modifierQTeArticle($produit_Quantite,$produit_Quantite){
   //Si le panier éxiste
   if (creationPanier() && !isVerrouille())
   {
      //Si la quantité est positive on modifie sinon on supprime l'article
      if ($produit_Quantite > 0)
      {
         //Recharche du produit dans le panier
         $positionProduit = array_search($produit_Id,  $_SESSION['panier']['produit_Id']);

         if ($positionProduit !== false)
         {
            $_SESSION['panier']['produit_Quantite'][$positionProduit] = $produit_Quantite ;
         }
      }
      else
      supprimerArticle($produit_Id);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

function supprimerArticle($produit_Id){

   if (creationPanier() && !isVerrouille())
   {
      //Nous allons passer par un panier temporaire
      $tmp=array();
      $tmp['produit_Id'] = array();
      $tmp['produit_Quantite'] = array();
      $tmp['produit_Prix'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['produit_Id']); $i++)
      {
         if ($_SESSION['panier']['produit_Id'][$i] !== $produit_Id)
         {
            array_push( $tmp['produit_Id'],$_SESSION['panier']['produit_Id'][$i]);
            array_push( $tmp['produit_Quantite'],$_SESSION['panier']['produit_Quantite'][$i]);
            array_push( $tmp['produit_Prix'],$_SESSION['panier']['produit_Prix'][$i]);
         }

      }

      $_SESSION['panier'] =  $tmp;
      
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['panier']['produit_Id']); $i++)
   {
      $total += $_SESSION['panier']['produit_Quantite'][$i] * $_SESSION['panier']['produit_Prix'][$i];
   }
   return $total;
}

function supprimePanier(){
   unset($_SESSION['panier']);
}

function isVerrouille(){
   if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou'])
   return true;
   else
   return false;
}

function compterArticles()
{
   if (isset($_SESSION['panier']))
   return count($_SESSION['panier']['produit_Id']);
   else
   return 0;

}

?>



Dans panier.php j' ai ce message d'erreur qui s'affiche : Undefined index: produit_Id
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['produit_Id'] = array();
      $_SESSION['panier']['produit_Quantite'] = array();
      $_SESSION['panier']['produit_Prix'] = array();
      $_SESSION['panier']['verrou'] = false;
   }


Donc si je résume :

Si mon PANIER EXISTE , JE LE CREE...
pas compris ton if...
Tu test si ton panier exist (ce qui ne peux pas être possible car tu le créer juste après) pour le "ré-écraser" ?
Oui, désolé c'est la ligne 80 " $nbArticles=count($_SESSION['panier']['produit_Id']);"

Je me suis inspirer du lien tuto que vous m'avez écrit et j'ai fais comme il y avait écrit j'ai fais juste des modifications par rapport à mon travail.
Ok Smiley smile

j'ai pris le premier tuto.. j'ai pas lu.

Moi, cette ligne me choque
if (!isset($_SESSION['panier'])){

c'est bien celle du tuto, mais elle me parait fausse. et nique tout le reste.
car si je la lis :
"Si ma variable "panier" de ma superglobal SESSION NEST PAS VIDE... alors..."
alors que, dans la logique, il faudrait faire
"Si ma variable Smiley blablabla ... EST VIDE ... alors je créer mon panier....."...

essaye d'enlever le "!" devant isset...
Je n'ai plus le message d'erreur qui s'affiche par contre quand je vais dans la page produit et que j'appuie ça m'envoie à la page panier.php où il y a écrit référence , quantité prix unitaire, action mais ma sélection ne s'affiche pas et j'ai votre panier est vide.
Comment ajoutes-tu ? car là on a que le code qui "liste" les items du panier, pas l'ajout (html)
Modifié par JENCAL (24 May 2018 - 17:16)
Pour ajouter un article j'ai écris ceci dans produit.php :
<a href="panier.php?action=ajout&produit_Id=$id&produit_Quantite=1&produit_Prix=$produit['prix']">Ajouter au panier</a>


dans panier.php :
if (!$erreur){
   switch($action){
      Case "ajout":
         ajouterArticle($produit_Id,$produit_Quantite,$produit_Prix);
         break;

      Case "suppression":
         supprimerArticle($produit_Id);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($QteArticle) ; $i++)
         {
            modifierQTeArticle($_SESSION['panier']['produit_Id'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }
}


et dans lien_panier.php :
function ajouterArticle($produit_Id,$produit_Quantite,$produit_Prix){

   if (creationPanier() && !isVerrouille())
   {
      $positionProduit = array_search($produit_Id,  $_SESSION['panier']['produit_Id']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['produit_Quantite'][$positionProduit] += $produit_Quantite ;
      }
      else
      {
      
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Prix'],$produit_Prix);
      }
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}
Désolé d'avoir du mal à cette exercice, j'ai ce travail à faire et dans mes cours je n'ai aucun endroit où ils nous expliquent comment créer un panier ou ajouter un article dans un panier Smiley ohwell
Est ce que ton code passe par ajouterArticle ? es-tu sûr de ton "action" ? utilise des var_dump de partout pour débugger ton php . La on nage dans l'invisible.
Pour moi oui, j'ai mon lien :
<a href="panier.php?action=ajout&produit_Id=$id&produit_Quantite=1&produit_Prix=$produit['prix']">Ajouter au panier</a>


Mais pour l'action je pense qu'il faut que je remplace les Null.
Et avec les var_dump .... ? comme demandé juste avant

function ajouterArticle($produit_Id,$produit_Quantite,$produit_Prix){

   if (creationPanier() && !isVerrouille())
   {
      $positionProduit = array_search($produit_Id,  $_SESSION['panier']['produit_Id']);

      if ($positionProduit !== false)
      {
         $_SESSION['panier']['produit_Quantite'][$positionProduit] += $produit_Quantite ;
      }
      else
      {
      
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Quantite'],$produit_Quantite);
         array_push( $_SESSION['panier']['produit_Prix'],$produit_Prix);
      }
var_dump($_SESSION['panier']);
//tu peux mettre die(); pour stoper ton code à cette endroit. 
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}
Bonjour,

jacumo a écrit :
Pour moi oui, j'ai mon lien :
&lt;a href="panier.php?action=ajout&amp;produit_Id=$id&amp;produit_Quantite=1&amp;produit_Prix=$produit['prix']"&gt;Ajouter au panier&lt;/a&gt;


Mais pour l'action je pense qu'il faut que je remplace les Null.
Moi ce qui me gène dans ceci c'est le mélange des langages. Tel quel, tout est interprété comme étant du html ce qui fait qu'au clic on est dirigé vers la page
panier.php?action=ajout&amp;produit_Id=$id&amp;produit_Quantite=1&amp;produit_Prix=$produit['prix']

alors que je suppose que l'effet recherché est plutôt
panier.php?action=ajout&amp;produit_Id=18&amp;produit_Quantite=1&amp;produit_Prix=5,99

Donc j'aurais plutôt tendance à coder ceci:
<a href="panier.php?action=ajout&amp;produit_Id=<?= $id;?>&amp;produit_Quantite=1&amp;produit_Prix=<?= $produit['prix'];?>">Ajouter au panier</a>


La quantité est fixe ? Toujours 1 ?
Edit: Je me répond à moi même. Évidemment vu que l'action consiste à ajouter un article. Néanmoins la question demeure dans le sens où est-il vraiment nécessaire de passer cette info dans le lien ?

D'ailleurs pourquoi passer le prix dans le lien, celui-ci n'est-il pas en bdd ?
Modifié par Greg_Lumiere (25 May 2018 - 13:35)
ça m’écrit ceci : C:\wamp64\www\produit\lien_panier.php:35:
array (size=4)
'produit_Id' =>
array (size=0)
empty
'produit_Quantite' =>
array (size=2)
0 => int 0
1 => int 0
'produit_Prix' =>
array (size=1)
0 => float 0
'verrou' => boolean false



Votre panier
Référence Quantité Prix Unitaire Action
Votre panier est vide
Bonjour, j'ai essayé votre code :
<a href="panier.php?action=ajout&amp;produit_Id=<?= $id;?>&amp;produit_Quantite=1&amp;produit_Prix=<?= $produit['prix'];?>">Ajouter au panier</a>


mais ce message d'erreur s'affiche en lien : Warning: Illegal string offset 'prix' in C:\wamp64\www\produit\produit.php on line 27 Call Stack #TimeMemoryFunctionLocation 10.0010241336{main}( )...\produit.php:0 p">Ajouter au panier

Et oui c'est qu'un article qu'il faut rajouter,concernant la question "Néanmoins la question demeure dans le sens où est-il vraiment nécessaire de passer cette info dans le lien ?"
dans mon exercice je n'ai que ça comme information : Une page doit lister les produits et leur prix et permettre de les ajouter au panier. Le panier liste les produits
sélectionnés et affiche le montant total.

Et le prix est bien en bdd mais j'ai vu un tuto faire comme ceci.
Bonjour
A mon sens la seule valeur indispensable pour ajouter un article dans le panier est sa référence unique.
Comme vous dites, le prix ainsi que le libellé sont en Bdd donc faciles à retrouver.
Pour la quantité, c'est bien ce que je pensais soit à chaque ajout d'article, qte = qte précédente +1. Tout ceci devrait se faire automatiquement en background et non pas aux yeux de l'utilisateur.

Pour en revenir à votre message d'erreur, je suppose que pour avoir le prix d'un article dans la variable $article (côté php) il faut lui indiquer une référence non ? Un truc genre $article['boussole_b04']['prix'] => 4.50
Car là il ne trouve pas la clé que vous spécifiez.

PS: Je suis convaincu, bien que fort populaire, que le tutoriel que vous suivez ne décrire pas une méthode très efficiente et de dernière fraîcheur. Un conseil, fuyez !!!!
Greg_Lumiere a écrit :

PS: Je suis convaincu, bien que fort populaire, que le tutoriel que vous suivez ne décrire pas une méthode très efficiente et de dernière fraîcheur. Un conseil, fuyez !!!!


Non, c'est moi qui lui ai partagé ce tuto et j'en suis très mécontent, j'ai pris le premier truc sur google pourtant (il faut que je pense à afficher les résultats de MOINS DE UN AN) parce que bon... c'est pas la première fois que je me fais avoir...
Je pense qu'il faut garder la structure avec les différentes méthodes (ajout/suppression/modif) mais re-développer le tout...
Pages :