Het aanmaken van een cookie verloopt niet helemaal soepel.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

21/02/2018 18:58:20
Quote Anchor link
Ik gebruik cookies voor een winkel wagen, hiermee stuur ik alleen het id, het aantal en het aantal vierkante meter mee via de cookie, in de winkelwagen zelf worden de producten geladen door een query die de id's gebruikt van de cookie. Ik heb op de product detail pagina simpel een knop met de waarde 'add' hiermee voeg ik het product toe aan de cookie array. Helaas gaat het fout bij het aantal. Als je op 'voeg toe aan winkelwagen' klikt, zou hij er 1 moeten optellen bij het huidige aantal en dus niet overschrijven.

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
19
20
21
22
23
24
25
26
<?php
if(isset($_POST['add'])){
        if(!empty($_POST['m'])){
            
            if (isset($_COOKIE['cart'])){
                $cart = json_decode($_COOKIE['cart'], TRUE, 512, JSON_OBJECT_AS_ARRAY); // if cookie is set, get the contents of it
            } else{
                $cart = [];// else create an empty cart
            }    
            
            // append new product and add to cart
            $cart[$product['id']] = [];
            $cart[$product['id']]['m'] = empty($_POST['m']) ? 1 : $_POST['m'];
            if(!empty($cart[$product['id']]['quantity'])){
                $cart[$product['id']]['quantity'] += 1;
            }
else {
                $cart[$product['id']]['quantity'] = 1;
            }

    
            setcookie('cart', json_encode($cart), time()+3600, '/');
        }
else {
            $error = "U moet minimaal 1m invullen";
        }
        
    }

?>


Ook is het zo dat op de winkelwagen pagina zelf, per product de waarde van het aantal in het algemeen aangepast moet kunnen worden door zelf een getal in te vullen.

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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
if(isset($_COOKIE['cart'])){
        $cart = json_decode($_COOKIE['cart'], TRUE, 512, JSON_OBJECT_AS_ARRAY);
    }
else {
        $cart = [];
    }

    // dd($cart);

    if(isset($_POST['remove'])){
        unset($cart[$_POST['item']]);
        setcookie('cart', json_encode($cart), time()+3600, '/');
    }

    
    $list = $model->selectMultipleById($cart, 'carpet');

?>

<html>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <table id="cart" class="table table-hover table-condensed">
                <thead>
                    <tr>
                        <th style="width:50%">Product</th>
                        <th style="width:10%">Prijs</th>
                        <th style="width:8%">Aantal</th>
                        <th style="width:22%" class="text-center">Subtotaal</th>
                        <th style="width:10%"></th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                        while($row = $list->fetch(PDO::FETCH_ASSOC)):
                    ?>

                    <tr>
                        <td data-th="Product">
                            <div class="row">
                                <div class="col-sm-2 hidden-xs"><img src="<?=img_url();?>/tapijt-voorbeeld.jpg" alt="..." class="img-responsive"/></div>
                                <div class="col-sm-10">
                                    <h4 class="nomargin"><?=$row['name'];?></h4>
                                    <p><?=$row['brand'];?></p>
                                    <p><?=$cart[$row['id']]['m'];?></p>
                                </div>
                            </div>
                        </td>
                        <td data-th="Price">$1.99</td>
                        <td data-th="Quantity">
                            <form action="#" method="post">
                                <input type="number" name="quantity" class="form-control text-center" value="<?=$cart[$row['id']]['quantity'];?>">
                            </form>  
                        </td>
                        <td data-th="Subtotal" class="text-center">1.99</td>
                        <td class="actions" data-th="">
                            <form action="#" method="post">
                                <input type="hidden" name="item" value="<?=$row['id'];?>">
                                <button name="remove" value="remove" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>        
                            </form>                            
                        </td>
                    </tr>
                    <?php
                        endwhile;
                    ?>

                </tbody>
                <tfoot>
                    <tr class="visible-xs">
                        <td class="text-center"><strong>Total 1.99</strong></td>
                    </tr>
                    <tr>
                        <td><a href="<?=site_url();?>/tapijten" class="btn btn-warning"><i class="fa fa-angle-left"></i> Verder winkelen</a></td>
                        <td colspan="2" class="hidden-xs"></td>
                        <td class="hidden-xs text-center"><strong>Total $1.99</strong></td>
                        <td><a href="#" class="btn btn-success btn-block">Checkout <i class="fa fa-angle-right"></i></a></td>
                    </tr>
                </tfoot>
            </table>
        </div>
    </div>
</div>
</html>


Toevoeging op 21/02/2018 18:59:26:

Mijn excuses, ik weet niet hoe ik html code kan highlighten :(
Gewijzigd op 22/02/2018 14:53:49 door Jorn Reed
 
PHP hulp

PHP hulp

22/04/2019 23:03:14
Honeypot
 
Thomas van den Heuvel

Thomas van den Heuvel

21/02/2018 19:20:37
Quote Anchor link
Dit doe je middels de [code][/code] tags.

Pas na uitvoering van bovenstaande code (serverside) zal de webpagina (en daarmee de client) geupdate zijn met de nieuwe cookie-informatie, en dat alleen als je de pagina pas begint op te bouwen na uitvoering van bovenstaande code. Pas vanaf dat moment zal ook $_COOKIE deze nieuwe situatie reflecteren.

Dat gezegd hebbende, op regel 12 gooi je $cart[$product['id']] leeg, of hier nu iets in zat of niet. Mogelijk moet dat onderdeel binnen je empty-statement getrokken worden.

En beter is dan dit te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if (something) {
    do B
} else {
    do A
}

In plaats van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if (! something) {
    do A
} else {
    do B
}

Omdat je een ! nogal snel mist. Of maak een expliciete vergelijking met false zodat het onderscheid duidelijk is.
Gewijzigd op 21/02/2018 19:21:39 door Thomas van den Heuvel
 



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.