Het loopen van database data met het gebruik van een cookie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

13/06/2018 18:27:17
Quote Anchor link
Ik heb een hele shopping cart class die ik gebruik om producten toe te voegen aan een winkelwagen object. dit sla ik op met een cookie. dit werkt verder allemaal prima.
Hier heb ik een voorbeeld van de cookie, die alleen de id, quantity en een eventuele note opslaat:
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
array(1) {
  [0]=>
  array(3) {
    [0]=>
    array(3) {
      ["id"]=>
      string(1) "3"
      ["quantity"]=>
      string(2) "12"
      ["note"]=>
      string(4) "test"
    }
    [1]=>
    array(3) {
      ["id"]=>
      string(1) "5"
      ["quantity"]=>
      int(279)
      ["note"]=>
      string(4) "test"
    }
    [2]=>
    array(3) {
      ["id"]=>
      string(1) "4"
      ["quantity"]=>
      string(15) "124444444444444"
      ["note"]=>
      string(9) "test note"
    }
  }
}


Ik gebruik een model class om queries makkelijker te gebruiken.

Zo doe ik: $list = $model->selectMultipleById($cart, 'carpet'); om alle objecten uit $cart te loopen met de bijbehordende database data.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
public function selectMultipleById($ids, $table){
        $items = array();
        foreach($ids as $item){
            $items[] = $item['id'];
        }
        $ids = implode(',', $items);
        $stmt = $this->dbh->prepare("SELECT * FROM $table where `id` in ($ids) ");
        $stmt->execute();

        return $stmt;
    }


In de while loop zelf, krijg ik het alleen niet voor elkaar om de quantity erbij uit te printen, omdat er het een en ander in de code is verandert.

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
<?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']]['quantity'];?></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>


Dit komt omdat ik eerst het array object id gebruikte voor een product, maar later toch realiseerde dat een product een id kan hebben die aangepast kan worden, om weet ik het welke reden dan ook. Ik zoek hiervoor een goede oplossing. Bij ontbreken van bepaalde code, hoor ik het graag.
Gewijzigd op 13/06/2018 18:32:48 door Jorn Reed
 
PHP hulp

PHP hulp

22/04/2019 23:02:19
Honeypot
 
- Ariën -
Beheerder

- Ariën -

13/06/2018 18:30:57
Quote Anchor link
Kan je jouw code tussen [code]-tags plaatsen? Dat maakt de boel beter leesbaarder.
Zie ook de BBcodes in de Veelgestelde vragen.
Gewijzigd op 13/06/2018 18:31:22 door - Ariën -
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 18:51:14
Quote Anchor link
Als die array die je helemaal bovenin hebt staan je $cart is, dan gaat dit inderdaad niet zo werken. Je zoekt hierin namelijk op basis van je $row['id'] (= item ID), terwijl de index gewoon een volgnummer is. Bijvoorbeeld het eerste record: id = 3, index = 0. Als het id altijd uniek is, dan kun zul je je $cart zo op moeten zetten dat de index (key) gelijk is aan het id:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$cart = [
  "3" => ["id" => "3", "quantity" => "12", "note" => "test"],
  "5" => ["id" => "5", "quantity" => "279", "note" => "test"],
  "5" => ["id" => "4", "quantity" => "124444444444444", "note" => "test note"]
];
Dit kun je meteen zo doen, of achteraf even "knutselen" met een foreach().

Wat je trouwens in dat tweede blok doet ($items opbouwen) kan eenvoudiger met de array_column() functie: https://secure.php.net/manual/en/function.array-column.php . Overigens zit je daar ID's, die je dus blijkbaar uit een cookie haalt, letterlijk in je SQL te plakken. Daarmee kun je dus SQL-injecteren (= niet goed)!
 
Jorn Reed

Jorn Reed

13/06/2018 18:56:00
Quote Anchor link
Klopt wat je zegt inderdaad over die sql injecties. Bedoel je met die array_column() dat ik daarmee de id's opsla in als het ware een string, die ik kan gebruiken om de juiste id's in de database te selecteren?
 
Rob Doemaarwat

Rob Doemaarwat

13/06/2018 19:17:09
Quote Anchor link
Je doet nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$items = array();
        foreach($ids as $item){
            $items[] = $item['id'];
        }
        $ids = implode(',', $items);

Maar dat kan dus ook met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$ids = implode(',',array_column($ids,'id'));
Maar gezien de mogelijkheid tot SQL-injectie is je eerste methode misschien niet zo heel gek als je 'm zo toepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$items = array();
        foreach($ids as $item){
            $items[] = intval($item['id']);
        }
        $ids = implode(',', $items);
Door intval() te gebruiken weet je in ieder geval zeker dat er geen "andere karakters" worden ingevoegd.
 
Jorn Reed

Jorn Reed

13/06/2018 19:20:09
Quote Anchor link
Ik moet sowieso in de query nog dit toepassen :ids en in de ->execute([':ids'=> $ids]); als het zo moet tenminste haha
 



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.