Ajout d'article dans panier avec limite de stock

Fermé
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022 - Modifié le 2 sept. 2022 à 10:44
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022 - 3 sept. 2022 à 11:44

Bonjour tout le monde ^^

Je vais essayer de faire au plus simple :-D

Sur mon site web statique j'ai ajouter un système de panier basé sur la sessions et sur une base de donnée simple et très peu automatisé.

Notamment pour le stock je le gère a la main dans un champ stock de la table articles

J'ai un bout de code qui permet d'ajouter un article :

    case "add":
        if(!empty($_POST["quantity"])) {
            $pid=$_GET["pid"];
            $result=mysqli_query($con,"SELECT * FROM articles INNER JOIN categorie ON articles.cat = categorie.idcat WHERE id='$pid'");
              while($productByCode=mysqli_fetch_array($result)){
            $itemArray = array($productByCode["code"]=>array('nom'=>$productByCode["nom"], 'code'=>$productByCode["code"], 'cat'=>$productByCode["cat"], 'stock'=>$productByCode["stock"] ,'quantity'=>$_POST["quantity"], 'prix'=>$productByCode["prix"], 'categorie'=>$productByCode["categorie"], 'image'=>$productByCode["image"]));
            if(!empty($_SESSION["cart_item"])) {
                if(in_array($productByCode["code"],array_keys($_SESSION["cart_item"]))) {
                    foreach($_SESSION["cart_item"] as $k => $v) {
                            if($productByCode["code"] == $k) {
                                if(empty($_SESSION["cart_item"][$k]["quantity"])) {
                                    $_SESSION["cart_item"][$k]["quantity"] = 0;
                                }
                                $_SESSION["cart_item"][$k]["quantity"] += $_POST["quantity"];
                            }
                    }
                } else {
                    $_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
                }
            }  else {
                $_SESSION["cart_item"] = $itemArray;
            }
        }
    }
    break;   

Je cherche tout simplement a ce que le panier virtuel en cour ne puisse pas contenir, par article, plus que mon champ stock.

Voila d'avance merci pour les idées :-)
Windows / Chrome 104.0.0.0

9 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 11:41

bonjour, as-tu envisagé de comparer la quantité commandée à la quantité en stock?

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 11:55

Oui c'est exactement ce dont j'ai besoin je n'ai aucune idée de comme m'y prendre,

En gros, la, dans ma tete je me dit que $v ne doit pas aller au dessus de la valeur du champ dans la BDD stock ici :

foreach($_SESSION["cart_item"] as $k => $v)

Je n'ai aucune idée de comment faire.

Concrètement il faut que l'ajout dans le panier ne sois pas ou plus possible si $v d'un article donnée est déjà présent a auteur de la valeur max renseigner dans le champ stock.

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 12:12

la première chose à faire, n'est-ce pas récupérer la quantité en stock?

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 15:42

Surement d'où ma question :-)

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 16:45

Peut-être 

$productByCode["stock"]
1
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 16:38

Je pense que tu peux supprimer cette horrible boucle 

foreach($_SESSION["cart_item"] as $k => $v)

Sais-tu que tu peux écrire

$_SESSION["cart_item"][$productByCode["code"]]["quantity"]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 16:49

Je suis étonné par ta boucle while en ligne 5: peux-tu avoir plusieurs lignes en réponse à la requête?

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
Modifié le 2 sept. 2022 à 18:17

Normalement non si j'interprète bien ce qui est écrit je n'ai qu'une ligne d'un article précis a chaque fois.

J'ai mis ta ligne a la place du foreach, le site ne fonctionne plus lol

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 18:27

N'est-ce pas ton code?
Le comprends-tu?

Sinon, ne le modifie surtout pas!

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 18:34

Non ce n'est pas mon code,

Je comprend les grande lignes et j'ai des notions très légères,

Si je ne modifie pas ce code je n'ai pas exactement ce que je veux sur mon site.

Du coup je n'y touche pas et je ne fait pas de site.

Question peut être idiote, mais ce forum ne sert a pas a donner des réponses a quelqu'un qui pose des questions ??

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié le 2 sept. 2022 à 18:39

https://www.commentcamarche.net/infos/25899-forum-ccm-mode-d-emploi-demander-de-l-aide-pour-un-exercice/

Je t'ai donné de nombreuses indications, et je ne pense pas que tu progresseras si je fais le travail à ta place.

Commence peut-être avec des exercices plus simples, cela t'aidera à comprendre.

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
2 sept. 2022 à 18:49

Je viens de lire ton lien en travers, en fait je suis sur un forum d'aide aux élèves ??? Si tel est le cas je suis désolé je me suis planter, aurait tu un forum spe dev "classique" a m'envoyé en message privé par exemple ???

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 19:02

Je ne connais pas de forum qui offre des services de dev.  Il existe sans doute des dev pro qui peuvent t'assister.

1
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
2 sept. 2022 à 19:05

Ok pas de souci, merci quant même

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 19:31

Au départ, tu demandais des idées, cela m'a induit en erreur.  C'est plus clair si tu expliques que tu ne comprends pas "ton" code, et que tu cherches quelqu'un qui peut l'adapter.

La charte: "Le cadre de l'entraide n'est pas de faire faire les choses par les autres mais d'aider en cas de difficultés."

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
2 sept. 2022 à 18:46

Non mais sérieusement ^^

Je ne veux pas apprendre ou progresser, je ne suis pas élève et tu n'est pas professeur, je suis a deux doigt de pouvoir mettre mon site en ligne et j'aimerais ne pas passer un temp énorme pour trouver seul la réponse.

Sinon je ne serais pas admin reseau mais dev.

Ca me parait simple, je suis venu sur le forum pour trouver une réponse a ma question pas pour la résoudre tout seul ou pour faire un jeux de piste ^^

Mais bon merci quant même.

Du coup si quelqu'un a le bout de code qui me permet de vérifier cette condition ca serais super sinon tans pis.

0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 sept. 2022 à 18:59

En effet, le but du forum n'est pas de fournir des solutions toutes faites, mais de guider et d'assister.

Le code que tu souhaites modifier me semble très mal écrit, je pense qu'il faudrait commencer par le réécrire avant d'y ajouter des fonctions.

0
Ceantolika Messages postés 10 Date d'inscription vendredi 2 septembre 2022 Statut Membre Dernière intervention 3 septembre 2022
3 sept. 2022 à 11:44

C'est bon j'ai trouvé, c'est surement pas très beau ^^ mais si ca peu aider quelq'un :

Je ne suis pas aller du coter de l'action, mais du coter du panier :

<!-- Cart ---->
<div id="shopping-cart">

<a id="btnEmpty" href="panier.php?action=empty">Tout supprimer</a>
<?php
if(isset($_SESSION["cart_item"])){
    $total_quantity = 0;
    $total_price = 0;
?>    
<table class="tbl-cart" cellpadding="10" cellspacing="1">
<tbody>
<tr>
<th style="text-align:left;font-size:small;font-weight:700"></th>
<th style="text-align:left;font-size:small;font-weight:700">Type</th>
<th style="text-align:left;font-size:small;font-weight:700">Nom</th>
<th style="text-align:left;font-size:small;font-weight:700">Code</th>
<th style="text-align:right;font-size:small;font-weight:700">Quantitée</th>
<th style="text-align:right;font-size:small;font-weight:700">Prix unitaire</th>
<th style="text-align:right;font-size:small;font-weight:700">Prix</th>
<th style="text-align:center;font-size:small;font-weight:700">Retirer</th>
</tr>    
<?php        
    foreach ($_SESSION["cart_item"] as $item){
        $item_price = $item["quantity"]*$item["prix"];
        if($item["quantity"] > $item["stock"]){
            $item["quantity"] = $item["stock"];
                $item_price = $item["quantity"]*$item["prix"];
            
}        
        
        ?>
                <tr>
                <td><img src=""image"]; ?>" class="cart-item-image" /></td>
                <td><?php echo $item["categorie"]; ?></td>
                <td><?php echo $item["nom"]; ?></td>
                <td><?php echo $item["code"]; ?></td>
                <td style="text-align:right;"><?php echo $item["quantity"]; ?></td>
                <td style="text-align:right;"><?php echo "€ ".$item["prix"]; ?></td>
                <td style="text-align:right;"><?php echo "€ ". number_format($item_price,2); ?></td>
                <td style="text-align:center;"><a href="panier.php?action=remove&code=<?php echo $item["code"]; ?>" class="btnRemoveAction"><p align="center"><img src="" alt="Remove Item" /></p></a></td>
                </tr>
                <?php
                $total_quantity += $item["quantity"];
                $total_price += ($item["prix"]*$item["quantity"]);

        
        }

        ?>

<tr>
<td colspan="4" align="right">Total:</td>
<td align="right"><?php echo $total_quantity; ?></td>
<td align="right" colspan="2"><strong><?php echo "€ ".number_format($total_price, 2); ?></strong></td>
<td></td>
</tr>
</tbody>
</table>        
  <?php

} else {
?>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
<div class="no-records" style="font-size:large;font-weight:800">Votre panier est vide</div>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
<?php 

    }
?>

J'ai rajouté ces trois lignes après le foreach : 

?php        
    foreach ($_SESSION["cart_item"] as $item){
        $item_price = $item["quantity"]*$item["prix"];
        if($item["quantity"] > $item["stock"]){
            $item["quantity"] = $item["stock"];
                $item_price = $item["quantity"]*$item["prix"];
            
}        
        
        ?>

Elle force le panier en permanence a ne pas pouvoir dépasser la quantité stock et recalcule aussi le prix total par article. Du coup un client dans sa session ne peux pas forcer par un rafraichissement le max d'article dispo.  

0