Het loopen van database data met het gebruik van een cookie
Hier heb ik een voorbeeld van de cookie, die alleen de id, quantity en een eventuele note opslaat:
Code (php)
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
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"
}
}
}
[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)
1
2
3
4
5
6
7
8
9
10
11
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;
}
$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)
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
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>
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
Zie ook de BBcodes in de Veelgestelde vragen.
Gewijzigd op 13/06/2018 18:31:22 door - Ariën -
Code (php)
1
2
3
4
5
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"]
];
"3" => ["id" => "3", "quantity" => "12", "note" => "test"],
"5" => ["id" => "5", "quantity" => "279", "note" => "test"],
"5" => ["id" => "4", "quantity" => "124444444444444", "note" => "test note"]
];
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)!
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?
Code (php)
1
2
3
4
5
2
3
4
5
$items = array();
foreach($ids as $item){
$items[] = $item['id'];
}
$ids = implode(',', $items);
foreach($ids as $item){
$items[] = $item['id'];
}
$ids = implode(',', $items);
Maar dat kan dus ook met:Maar gezien de mogelijkheid tot SQL-injectie is je eerste methode misschien niet zo heel gek als je 'm zo toepast:Door intval() te gebruiken weet je in ieder geval zeker dat er geen "andere karakters" worden ingevoegd.
Ik moet sowieso in de query nog dit toepassen :ids en in de ->execute([':ids'=> $ids]); als het zo moet tenminste haha