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

Uxon-Studio 11 Messages postés mardi 12 septembre 2017Date d'inscription 29 novembre 2017 Dernière intervention - 25 nov. 2017 à 10:32 - Dernière réponse : jordane45 19222 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention
- 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!
Afficher la suite 

4 réponses

Répondre au sujet
jordane45 19222 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 25 nov. 2017 à 10:48
0
Utile
1
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

Uxon-Studio 11 Messages postés mardi 12 septembre 2017Date d'inscription 29 novembre 2017 Dernière intervention - 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
Commenter la réponse de jordane45
jordane45 19222 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par jordane45 le 25/11/2017 à 11:33
0
Utile
1
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                                                                 
jordane45 19222 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 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
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.