Ajout d'un même article ds panier PHP avc une option comme diff

Uxon-Studio Messages postés 13 Date d'inscription mardi 12 septembre 2017 Statut Membre Dernière intervention 21 février 2018 - 25 nov. 2017 à 10:32
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 25 nov. 2017 à 11:35
Olà olà, amigos, j'ai un petit soucie présentement! alors:
Je dev un site web php pour un client (foodtruck) .
Les utilisateur peuvent choisir dans 'shop_form.php' leur menu exemple:
- (sandwich ) Tacos / (option sauce) Mayonnaise / (option boisson) Oui

Tout fonctionne très bien, l'article est ajouté au panier avec SES options etc.
Mais si un client veut le même sandwich pour son amis, mais avec une sauce différente!... Là ça coince!

Question: Comment ajouter au panier le même article, si il à une option différente?



Voici les codes:

'commande_creator.php' :

<?php

session_start();
require_once("con_bdd.php");

if(empty($_SESSION['user_id'])){header('Location: ../index.php?access=denied');}

// commande_creator.php?article=tacos&sauce=b0c47f&option=-+Pas+d%27option+-&boisson=1&qty=1&add=

if (!isset($_SESSION['panier'])) $_SESSION['panier'] = array();

if (isset($_GET['add'])) {
// Initialisation des variable pour 'article'
$article_ID = isset($_GET['article_ID']) ? ($_GET['article_ID']) : null;
$sauce = isset($_GET['sauce']) ? ($_GET['sauce']) : null;
$option = isset($_GET['option']) ? ($_GET['option']) : null;
$boisson = isset($_GET['boisson']) ? ($_GET['boisson']) : null;
$qty = isset($_GET['qty']) ? ($_GET['qty']) : null;

// Voici le traitements du panier
if ($article == null || $sauce == null || $option == null || $boisson == null || $qty == null){
header('Location: ../shop.php?var_shop=commande_fail');
}

// Vérification dans la BDD si le produit existe bien
$req = $bdd->prepare('SELECT * FROM shop WHERE produit_ID = ?');$req->execute(array($article_ID));$result = $req->fetch();

if (!$result) {header('Location: ../shop.php?var_shop=product_broken');}

else {
// création: VARIABLES du PRODUIT pour le panier
$BDD_produit_ID = $result['produit_ID'];
$BDD_produit_nom = $result['produit_nom'];
$BDD_produit_prix = $result['produit_prix'];
$GET_produit_boisson = htmlspecialchars($boisson);
$GET_produit_qty = htmlspecialchars($qty);
$GET_produit_option = htmlspecialchars($option);
$GET_produit_sauce = htmlspecialchars($sauce);
$GET_produit_boisson = htmlspecialchars($boisson);

$_SESSION['panier'][$BDD_produit_ID]['id'] = $BDD_produit_ID;
$_SESSION['panier'][$BDD_produit_ID]['nom'] = $BDD_produit_nom;
$_SESSION['panier'][$BDD_produit_ID]['prix'] = $BDD_produit_prix;
$_SESSION['panier'][$BDD_produit_ID]['qty'] = $GET_produit_qty;
$_SESSION['panier'][$BDD_produit_ID]['option'] = $GET_produit_option;
$_SESSION['panier'][$BDD_produit_ID]['sauce'] = $GET_produit_sauce;
$_SESSION['panier'][$BDD_produit_ID]['boisson'] = $GET_produit_boisson;

header('Location: ../shop.php');
}
}

elseif (isset($_GET['edit'])) {
$article = isset($_GET['article_id']) ? ($_GET['article_id']) : null;
$qty = isset($_GET['qty']) ? ($_GET['qty']) : null;

if ($article == null || $qty == null){
header('Location: ../shop.php?var_shop=commande_fail');
}

// Vérification dans la BDD si le produit existe bien
$req = $bdd->prepare('SELECT * FROM shop WHERE produit_ID = ?');$req->execute(array($article));$result = $req->fetch();

if (!$result) {header('Location: ../shop.php?var_shop=product_broken');}

else {
// création: VARIABLES du PRODUIT pour le panier
$BDD_produit_ID = $result['produit_ID'];
$GET_produit_qty = $qty;

if ($qty == 0) {
unset($_SESSION['panier'][$BDD_produit_ID]);
header('Location: ../shop.php');
}

$_SESSION['panier'][$BDD_produit_ID]['qty'] = $GET_produit_qty;

header('Location: ../shop.php');
}
}

elseif(isset($_GET['remove'])) {
$article = isset($_GET['article_id']) ? ($_GET['article_id']) : null;

if ($article == null){
header('Location: ../shop.php?var_shop=commande_fail');
}

// Vérification dans la BDD si le produit existe bien
$req = $bdd->prepare('SELECT * FROM shop WHERE produit_ID = ?');$req->execute(array($article));$result = $req->fetch();

if (!$result) {header('Location: ../shop.php?var_shop=product_broken');}

else {
// création: VARIABLES du PRODUIT pour le panier
$BDD_produit_ID = $result['produit_ID'];

unset($_SESSION['panier'][$BDD_produit_ID]);

header('Location: ../shop.php');
}
}

else {
header('Location: ../shop.php?var_shop=commande_fail');
}

?>



Et l'affichage: 'shop.php' :

if (isset($_SESSION['panier']) && count($_SESSION['panier'])>0){
$total_panier = 0;
echo '<table class="alt"><thead><tr><th>Article</th><th>Quantitée</th><th>Sauce</th><th>Option</th><th>Boisson</th><th>Prix</th><th></th><th></th></tr></thead>';
foreach($_SESSION['panier'] as $id_article=>$article_acheté){
// On affiche chaque ligne du panier : nom, prix et quantité modifiable + 2 boutons : modifier la qté et supprimer l'article
if (isset($article_acheté['nom']) && isset($article_acheté['prix']) && isset($article_acheté['qty'])){
if ($article_acheté['boisson'] == 'non') {
$article_acheté['prix'] = $article_acheté['prix'] + 0;
}
elseif($article_acheté['boisson'] == 'oui') {
$article_acheté['prix'] = $article_acheté['prix'] + 1;
}

else {
// counter hack
header('Location: index.php?ks=kill&killcause=fatal_error_form');
}
echo '<form method="get" action="action_client/commande_creator.php">
<tbody>
<tr>
<td>'.$article_acheté['nom'].'<input type="hidden" name="article_id" value="'.$article_acheté['id'].'" /></td>
<td><input type="text" style="width: 6em;" name="qty" value="', $article_acheté['qty'] , '" /></input></td>
<td>'.$article_acheté['sauce'].'</td>
<td>'.$article_acheté['option'].'</td>
<td>'.$article_acheté['boisson'].'</td>
<td>(', number_format($article_acheté['prix'], 2, ',', ' '), ' € )</td>
<td><input type="submit" name="edit" class="button alt small" value="Modifier"/></td>
<td><input type="submit" name="remove" class="button small" value="Supprimer"/></td>
</tr>
</tbody>
</form>';
}
if (isset($article_acheté['prix'])) {
$total_panier += $article_acheté['prix'] * $article_acheté['qty'];
$input_lock_shop = $id_article;
}
else {
unset($_SESSION['panier']);
}
}
echo '</table>';

// foreach($_SESSION['panier'] as $montant_id_article=>$montant_article_acheté){$total_panier += $montant_article_acheté['prix'] * $montant_article_acheté['qty'];}

echo '
<hr>
<form method="post" action="action_client/securevformff.php">
<ul class="actions">
<li><h3 style="margin-top: 5px;">Total: ', number_format($total_panier, 2, ',', ' '), ' € </h3></li>
<li><input type="submit" name="payment_locked" class="button" style="margin-top: -3em;" value="Commander"/></li>
</ul>
</form>';
$_SESSION['totalpanier'] = $total_panier;
}


Merci a tous!

2 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
25 nov. 2017 à 10:48
Bonjour,

Mais si un client veut le même sandwich pour son amis, mais avec une sauce différente!... Là ça coince!

En quoi est-ce que cela coince ?
Quel est le comportement observé ?

Ensuite.. quelques remarques concernant ton code.
- Après une redirection (header('location... ) on met toujours un exit
- Tu devrais découper un peu ton code en fonctions
- Tu utilises le PDO visiblement... dans ce cas, applique ceci : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Et enfin C'est toujours plus agréable de ne pas avoir à recharger la page et donc pour ça de privilégier l'ajax au traditionnel submit de formulaire

Je t'invite également à lire ceci :
http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

0
Uxon-Studio Messages postés 13 Date d'inscription mardi 12 septembre 2017 Statut Membre Dernière intervention 21 février 2018
25 nov. 2017 à 11:12
Re, alors en faite où ça coince c'est à l'ajout dans le panier, comme on ajoute dans $_SESSION['panier'] [$BDD_produit_ID] <-- si j'ajoute un tacos avec option 1 . Tout ce passe bien, mais si je recommande ce même tacos avec l'option 2 , comme cette article (tacos) ets déjà dans le panier, ça ne m'ajoute pas: tacos avec option 2. j'ai seulement Tacos avec option 1 dans mon panier

Ok je look ajax pour la modif/suppr et alors si c'est mieux je changerer
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
Modifié le 25 nov. 2017 à 11:33
Je viens de parcourir ton code
En effet, dans ton panier tu te réfères à l'id du produit.. sauf que ça t’empêche d'en mettre plusieurs.

Je te propose ceci :

1 - créés un fichier de fonctions contenant ceci:
<?php
/**
*---------------------------------------------------------
* Fichier fonctions.php
*---------------------------------------------------------
*/



/**
* Fonction de redirection
*/
function redirection($url='index.php'){
    header('Location:'.$url);
    exit();
}


function qExec($sql,$datas=NULL){
    //Execution de la requete
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
       print_r($datas);
    }
}

function querySelectAll($sql,$datas=NULL){
    $result = qExec($sql,$datas);
    return $result->fetchAll();
}

function querySelectRow($sql,$datas=NULL){
    $result = qExec($sql,$datas);
    return $result->fetch();
}

function getProductById($id){
    $sql ='SELECT * FROM shop WHERE produit_ID = ?');
    $datas = array($id);
    $result = querySelectRow($sql,$datas);
}




function addPanier( $BDD_produit_ID, $BDD_produit_nom,  $BDD_produit_prix, $produit_qty=1, $produit_option='', $produit_sauce='',$produit_boisson='' ){
    $_SESSION['panier'][]['id']  = $BDD_produit_ID;
    $_SESSION['panier'][]['nom']  = $BDD_produit_nom;
    $_SESSION['panier'][]['prix'] = $BDD_produit_prix;
    $_SESSION['panier'][]['qty']  = $produit_qty;
    $_SESSION['panier'][]['option']  = $produit_option;
    $_SESSION['panier'][]['sauce']  = $produit_sauce;
    $_SESSION['panier'][]['boisson']  = $produit_boisson;
    //retourne le numero (nombre) de lignes dans le panier : panierRow
    return count($_SESSION['panier']);
}

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

function editProduct($panierRow,$produit_qty=1,$produit_option='',$produit_sauce='',$produit_boisson=''){
    $_SESSION['panier'][$panierRow]['qty']  = $produit_qty;
    $_SESSION['panier'][$panierRow]['option']  = $produit_option;
    $_SESSION['panier'][$panierRow]['sauce']  = $produit_sauce;
    $_SESSION['panier'][$panierRow]['boisson']  = $produit_boisson;
}
 


2 - Modifie ton code comme ceci:
<?php
  //-------------------------------------------------------//
  //démarrag des sessions
  //-------------------------------------------------------//
    session_start();
  //-------------------------------------------------------//
  //activation de l'affichage des erreurs php
  //-------------------------------------------------------//
 error_reporting(E_ALL);
 ini_set('display_errors', TRUE);
 ini_set('display_startup_errors', TRUE);
  
  //-------------------------------------------------------//
  //Require
  //-------------------------------------------------------//
    require_once("con_bdd.php");
    require_once("fonctions.php");
  //-------------------------------------------------------//
  //récupération variables 
  //-------------------------------------------------------//
 
 //variables de session
 $userID = !empty($_SESSION['user_id']) ? $_SESSION['user_id'] : NULL;
 $panier = !empty($_SESSION['panier']) ? $_SESSION['panier'] : array();
 
 // Initialisation des variable pour 'article'
 $article = !empty($_GET['article_ID']) ? ($_GET['article_ID']) : NULL;
    $sauce = !empty($_GET['sauce']) ? ($_GET['sauce']) : NULL;
    $option = !empty($_GET['option']) ? ($_GET['option']) : NULL;
    $boisson = !empty($_GET['boisson']) ? ($_GET['boisson']) : NULL;
    $qty = !empty($_GET['qty']) ? ($_GET['qty']) : NULL;
 
    $add = !empty($_GET['add']) ? $_GET['add'] : NULL;
 $edit = !empty($_GET['edit']) ? $_GET['edit'] : NULL;
    $remove = !empty($_GET['remove']) ? $_GET['remove'] : NULL;
    
    $panierRow = !empty($_GET['panierRow']) ? $_GET['panierRow'] : NULL;
    //si l'utilisation n'est pas connecté :
    if(!$userID){
        redirection('index.php?access=denied');
    }

    // Véfication dans la BDD si le produit existe bien
    $BDD_product = getProductById($article);
    //si le produit n'existe pas
    if(empty($BDD_product)){
        redirection('shop.php?var_shop=product_broken');
    }
    //----------------------------------------------------------------------
    //traitement des actions
    //----------------------------------------------------------------------
    
    if ($add) {
      // Voici le traitements du panier
      if ($article == null || $sauce == null || $option == null || $boisson == null || $qty == null){
        redirection('shop.php?var_shop=commande_fail');
      }
      // création: VARIABLES du PRODUIT pour le panier
      addPanier($BDD_product['produit_ID'], $BDD_product['produit_nom'],  $BDD_product['produit_prix'], $qty, $option, $sauce,$boisson));
      redirection('shop.php');
     
    } elseif ($edit) { 
        if ($article == null || $qty == null){
            redirection('shop.php?var_shop=commande_fail');
        }

        if ($qty == 0) {
          removeProduct($panierRow);
          redirection('shop.php');
        }else{
            editProduct($panierRow,$qty,$option,$sauce,$boisson){
            redirection('shop.php');
        }
    } elseif($remove) {
        if ($article == null){
           redirection('shop.php?var_shop=commande_fail');
        }
        removeProduct($panierRow);
        redirection('shop.php');
               
    } else {
       redirection('shop.php?var_shop=commande_fail');
    }

?>



NB : Il faudra modifier ta page de "gestion du panier" pour cibler la "ligne" du panier concerné au lieu d'utiliser l'id du produit.

NB² : J'ai écrit le code de tête sans le tester. Il se peut qu'il y ait quelques erreurs... qu'il faudra corriger;



Cordialement, 
Jordane                                                                 
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
25 nov. 2017 à 11:35
Pour l'ajax, tu pourras utiliser les mêmes fichiers.
A la différence que tu géreras les erreurs côté Javascript au lieu du PHP (là où actuellement tu faisais des redirections).

Voici un exemple d'ajax utilisant jquery:
http://codes-sources.commentcamarche.net/source/102253-exemple-ajax-en-jquery
0
Rejoignez-nous