Update Winkelwagen aantal per product

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donovan -

Donovan -

09/11/2019 13:42:00
Quote Anchor link
Hoi,

Ik ben bezig met een webshop voor iemand. Een winkelwagen is hetgeen waar ik niet helemaal uitkom. En dan bedoel ik alleen het deel voor het updaten van het aantal. Ik heb een vakje en een knop voor het 'submitten' van het aantal wat je wilt veranderen. 2D array ziet er zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$itemArray
   = array($productByID[0]["ID"] => array    (
          'Naam'         => $productByID[0]["Naam"],
          'Prijs_nieuw' => $productByID[0]["Prijs_nieuw"],
          'Aantal'         => 1,
          'ProductID'    => $productByID[0]["ID"],
          'Afbeelding'     => 'images/Producten/'.$productByID[0]["ID"].'_0.png',
          'Afmetingen'    => $productByID[0]["Lengte"]. ' x ' .$productByID[0]["Breedte"]. ' x ' .$productByID[0]["Hoogte"] . ' CM',
          'Kleuren'        => $productByID[0]["Kleuren"],
        ));

?>


In het overzicht heb ik een form gemaakt waarin het aantal aan te passen is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
<form method="POST" action="Winkelwagen.php" name="update_aantal">
    <
input type="image" name="submit_aantal" src="images/Update.png"/>
    <
input type="text" name="Aantal" value="<?php echo $item['Aantal']?>" size="3" max="99" required><a href='winkelwagen.php?action=remove&id=<?php echo $item["ProductID"]; ?>'><img src='Images/Delete.png'/></a>
    <
input type="hidden" name="ProductID" value="<?= $item['ProductID']; ?>">
        <
/form>
?>


En zodra je dus op het knopje "update" klikt, de submit knop, dan heb ik laten doorverwijzen naar een fuctie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function Update_cart()
{

    echo "Hoi";
    $prod_id = $_POST["ProductID"];
    foreach ($_SESSION["cart_item"] as $prod_id => $v)
    {

      if ($productByID[0]["ID"] == $prod_id)
      {

          $_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
      }
    }
}

if(isset($_POST['update_aantal']))
{

   Update_cart();
}

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
print_r($_SESSION["cart_item"]):


Array
(
[
0] => Array
     (
            [
Naam] => Productnaam_6
            [Prijs_nieuw] => 2.00
            [b][Aantal] => 4[/b]
            [
ProductID] => 6
            [Afbeelding] => images/Producten/6_0.png
            [Afmetingen] => 9.99 x 9.99 x 9.99 CM
            [Kleuren] => Grijs
        )
)

?>


Ik wil dus de diktedrukte aantallen aanpassen dmv de functie. maar de functie word niet aangeroepen (hoi komt niet in beeld) plus de update werkt ook niet. Wat doe ik verkeerd?

Afbeelding
Gewijzigd op 09/11/2019 13:53:58 door Donovan -
 
PHP hulp

PHP hulp

28/03/2024 20:01:02
 
Thomas van den Heuvel

Thomas van den Heuvel

09/11/2019 16:31:45
Quote Anchor link
Je overschrijft $prod_id :p.

Daarnaast, waarom zou je al die zooi in je sessie zetten?

Meer dan $_SESSION['cart'][<product id>] = <aantal> heb je toch niet nodig (specifieke productconfiguraties et cetera en -aanpassingen daargelaten)?

De rest trek je uit je database bij weergave.

Ook hoop ik eigenlijk dat je direct een refresh doet, of dat je je cart via een AJAX-call update (zowel sessie als op het scherm) want een update van je cart is een state change. Ook wil je niet blijven hangen op een pagina waarin je een POST request verwerkt, dat vertieft je navigatie. Doe na een POST altijd op een of andere manier een refresh, of doe de POST op de achtergrond via AJAX.

NB ik zou ook één stijl aanhouden voor het weergeven van PHP-waarden. Waarbij <?php echo ... ?> waarschijnlijk de voorkeur verdient. Daarbij loont het ook de moeite om alle output te escapen die je weergeeft.
Gewijzigd op 09/11/2019 17:31:43 door Thomas van den Heuvel
 
Donovan -

Donovan -

09/11/2019 18:53:17
Quote Anchor link
Thomas van den Heuvel op 09/11/2019 16:31:45:
Je overschrijft $prod_id :p.

Daarnaast, waarom zou je al die zooi in je sessie zetten?

Meer dan $_SESSION['cart'][<product id>] = <aantal> heb je toch niet nodig (specifieke productconfiguraties et cetera en -aanpassingen daargelaten)?

De rest trek je uit je database bij weergave.

Ook hoop ik eigenlijk dat je direct een refresh doet, of dat je je cart via een AJAX-call update (zowel sessie als op het scherm) want een update van je cart is een state change. Ook wil je niet blijven hangen op een pagina waarin je een POST request verwerkt, dat vertieft je navigatie. Doe na een POST altijd op een of andere manier een refresh, of doe de POST op de achtergrond via AJAX.

NB ik zou ook één stijl aanhouden voor het weergeven van PHP-waarden. Waarbij <?php echo ... ?> waarschijnlijk de voorkeur verdient. Daarbij loont het ook de moeite om alle output te escapen die je weergeeft.


Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen. Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.
 
Adoptive Solution

Adoptive Solution

09/11/2019 19:07:09
Quote Anchor link
Je test op de naam van het FORM.

$_POST['update_aantal']

Maar die wordt niet meegestuurd.

Je moet testen op de naam van een input.
 
Thomas van den Heuvel

Thomas van den Heuvel

09/11/2019 19:08:46
Quote Anchor link
Donovan - op 09/11/2019 18:53:17:
Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen.

Het escapen betreft security, iets dat tijdens het ontwerp en het bouwen een prominente rol zou moeten spelen. Dit is niet een soort van suikerlaag die je over de uiteindelijke taart strooit, maar zou in alle stages en facetten van je applicatie opgenomen moeten worden.

Donovan - op 09/11/2019 18:53:17:
Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.

Heb je gezien wat ik aangaf? Je overschrijft $prod_id.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function Update_cart() {
    $prod_id = $_POST["ProductID"]; // hier gebruik je $prod_id
    foreach ($_SESSION["cart_item"] as $prod_id => $v) { // hier overschrijf je $prod_id
        if ($productByID[0]["ID"] == $prod_id) {
            $_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
        }
    }
}

?>

Gooi die "Hoi" eruit, mogelijk doet dat iets met je sessies (voorkomt schrijven of wat dan ook).

Het heeft geen zin om naar een situatie te kijken waarvan je weet dat deze niet klopt (zie $prod_id). Los dit eerst allemaal op en kijk of dan de problemen nog spelen.

Controleer vervolgens hoe dat lijstje wordt opgebouwd. Gebruik je ook echt waarden uit $_SESSION en staat overal waar je een sessie gebruikt ook session_start()?

En wat @Adoptive zei: het feit dat je geen "Hoi" zag en dat er niets werd bijgewerkt was daar eigenlijk al een indicatie van - de functie werd nooit aangeroepen omdat de conditie in het if-statement niet voldeed.

Quote:
Je moet testen op de naam van een input.

Actually, je zou moeten controleren of er iets gePOST wordt middels:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ...
}
?>
Gewijzigd op 09/11/2019 19:11:58 door Thomas van den Heuvel
 
Donovan -

Donovan -

09/11/2019 21:11:24
Quote Anchor link
Thomas van den Heuvel op 09/11/2019 19:08:46:
Donovan - op 09/11/2019 18:53:17:
Dat tweede klinkt erg interessant. Is iets om later is te bekijken, maar ik wil het eerst zo is werkend krijgen.

Het escapen betreft security, iets dat tijdens het ontwerp en het bouwen een prominente rol zou moeten spelen. Dit is niet een soort van suikerlaag die je over de uiteindelijke taart strooit, maar zou in alle stages en facetten van je applicatie opgenomen moeten worden.

Donovan - op 09/11/2019 18:53:17:
Maakt op zich niet uit wat ik zou vervangen, er word niks geüpdatet in de array. Wat ik er ook neer zet. Dat vind ik zo raar.

Heb je gezien wat ik aangaf? Je overschrijft $prod_id.



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
function Update_cart() {
    $prod_id = $_POST["ProductID"]; // hier gebruik je $prod_id
    foreach ($_SESSION["cart_item"] as $prod_id => $v) { // hier overschrijf je $prod_id
        if ($productByID[0]["ID"] == $prod_id) {
            $_SESSION["cart_item"][$prod_id]["Aantal"] = $_POST["Aantal"];
        }
    }
}

?>

Gooi die "Hoi" eruit, mogelijk doet dat iets met je sessies (voorkomt schrijven of wat dan ook).

Het heeft geen zin om naar een situatie te kijken waarvan je weet dat deze niet klopt (zie $prod_id). Los dit eerst allemaal op en kijk of dan de problemen nog spelen.

Controleer vervolgens hoe dat lijstje wordt opgebouwd. Gebruik je ook echt waarden uit $_SESSION en staat overal waar je een sessie gebruikt ook session_start()?

En wat @Adoptive zei: het feit dat je geen "Hoi" zag en dat er niets werd bijgewerkt was daar eigenlijk al een indicatie van - de functie werd nooit aangeroepen omdat de conditie in het if-statement niet voldeed.

Quote:
Je moet testen op de naam van een input.

Actually, je zou moeten controleren of er iets gePOST wordt middels:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ...
}
?>


Genoeg stof tot nadenken. Ik ga er morgen mee aan de slag. Thanks for the input!
 
Thomas van den Heuvel

Thomas van den Heuvel

09/11/2019 21:52:50
Quote Anchor link
Je hoeft overigens niet het hele vorige bericht elke keer te quoten tenzij hier relevante dingen in staan waar je het verder over wilt hebben.
 
Donovan -

Donovan -

10/11/2019 15:23:11
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['Aantal'])) )
{

    $prod_id = $_POST["ProductID"];
    foreach ($_SESSION["cart_item"] as $item)
    {

        if ($item["ProductID"] == $_POST["ProductID"])
        {

            $item["Aantal"] = $_POST["Aantal"];
        }
    }
}

?>


Dit is wat ik er nu van heb gemaakt. Zowel $_POST["ProductID"] als $_POST["Aantal"] heb ik zichtbaar kunnen echoën maar het aantal update niet in de array. Elke pagina heb ik de Sessie gestart inderdaad en ik redirect naar de winkelwagen toe.
Gewijzigd op 10/11/2019 15:25:21 door Donovan -
 
- SanThe -

- SanThe -

10/11/2019 15:36:39
Quote Anchor link
Regel 4 is zo te zien overbodig.

Dat het aantal niet in de session staat is logisch.
Je stopt het namelijk in $item en $item is tijdelijk (in de foreach).

Donovan - op 10/11/2019 15:23:11:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
    foreach ($_SESSION["cart_item"] as $key => $item)
    {

        if ($item["ProductID"] == $_POST["ProductID"])
        {

            $_SESSION["cart_item"][$key]["Aantal"] = $_POST["Aantal"];
        }
    }

?>
Gewijzigd op 10/11/2019 15:38:02 door - SanThe -
 
Donovan -

Donovan -

10/11/2019 15:56:08
Quote Anchor link
Gelukt!! En een klein beetje uitgebreid. Dank voor de reacties.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (isset($_POST['Aantal']))
        {
            $prod_id = $_POST["ProductID"];
            foreach ($_SESSION["cart_item"] as &$item)
            {
                if ($item["ProductID"] == $_POST["ProductID"] && $_POST["Aantal"] > 0 && $_POST["Aantal"] <= 99)
                {
                    $item['Aantal'] = $_POST["Aantal"];
                    
                    header('Location:winkelwagen.php');
                    exit;
                }
            }
        }
Gewijzigd op 10/11/2019 15:56:44 door Donovan -
 
Thomas van den Heuvel

Thomas van den Heuvel

10/11/2019 17:55:57
Quote Anchor link
Zou het niet logischer zijn om, als je op enig moment een enkel item aanpast, om gewoon te controleren of deze aanwezig is in $_SESSION?

En dat if-statement is (nog steeds) raar. Stel nu dat ik het aantal aanpas naar 100, dan kan ik deze niet meer wijzigen? En je controleert wat het was, en niet wat het wordt. Dus als ik van $_POST['Aantal'] "banaan" maak, dan wordt "banaan" opgeslagen? Iets wat hier ontbreekt is "input filtering", dit zou altijd de eerste stap moeten zijn als je een formulier verwerkt: controleren of je invoer klopt.
 
Ivo P

Ivo P

11/11/2019 09:36:20
Quote Anchor link
Om het eindeloze foreach-en door $_SESSION['cart_item] te voorkomen:

Als je bij het opslaan van product met id="AA123" nu eens niet

$_SESSION['cart_item'][0] vult maar $_SESSION['cart_item']['AA123']?

Dan kun je rechtstreeks testen of $_SESSION['cart_item']['AA123'] bestaat
en $_SESSION['cart_item']['AA123']['Aantal'] ophogen.

Daarmee voorkom je gelijktijdig ook dat je meermaals hetzelfde artikel in je winkelmandje hebt zitten.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/11/2019 17:17:40
Quote Anchor link
Mja dat zei ik dus al.

Daarnaast zie ik ook niet waarom je alle data in de sessie mikt. Dit is afleidbare informatie. Tenzij dit een ontwerpbeslissing is? Magento maakt volgens mij wel een volledige "kopie" van alle informatie van een aankoop, dus dat is een momentopname met alle op dat moment geldende prijzen et cetera. Maar dit lijkt mij pas relevant als er daadwerkelijk iets aangeschaft wordt. Dus dat hoef je niet allemaal in je sessie te zetten.

Een sessie is geen rijdend archief. Op het moment dat je waarden gaat kopiëren creëer je ook een potentieel "probleem": je gaat op twee plaatsen dezelfde informatie bijhouden. Die informatie kan na verloop van tijd uit de pas gaan lopen. Het lijkt mij beter om één bron te hebben voor je data. Als je productinformatie nodig hebt trek deze dan gewoon uit de database op grond van het product id...

Enkel een mapping id -> aantal is wat mij betreft afdoende, zoals ik al eerder aangaf.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.