Winkelwagentje
Ik ben bezig met een webwinkel. Nu ben ik aangekomen bij het plaatsen van producten in de winkelwagen en dit wil ik graag met cookies doen omdat sessies verlopen zodra je de browser sluit, en ik wil het graag ook nog in het winkelwagentje hebben staan als de bezoekers terugkomen.
Het enige wat in de cookies moet worden opgeslagen is de product_id en het aantal producten.
Nu loop ik vast bij het laatste, het lukt me wel om de coockies een "array" mee te geven ongeveer.
Eigenlijk wil ik:
Product[1]
id => 1
amount => 1
Alleen nu wil ik dus, dat als iemand bijvoorbeeld vier dezelfde producten toevoegt, de amount moet worden opgehoogd, alleen ik weet even niet hoe ik dat moet doen.
Iemand een idee?
$producten = array(1 // product id
=> array('ammout'=>1));
dan kan je gewoon $producten[$productid]['ammount'] +=4; doen o.i.d.
Maar een cookie pakt geen arrays, alleen strings
Met explode kun je ze weer 'lodhalen'. Zie ook de tut over webwinkel hier op phphulp
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
33
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product']))
{
$productcount = count($_COOKIE['product']) +1;
//setcookie("product[".$productcount."][id]", 1);
echo $productcount.'<br /><br /><br />';
for($i = 1; $i < $productcount; $i++)
{
foreach($_COOKIE['product'][$i] as $name => $value)
{
echo $name;
}
}
}
else
{
setcookie("product[1][id]", 1);
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product']))
{
$productcount = count($_COOKIE['product']) +1;
//setcookie("product[".$productcount."][id]", 1);
echo $productcount.'<br /><br /><br />';
for($i = 1; $i < $productcount; $i++)
{
foreach($_COOKIE['product'][$i] as $name => $value)
{
echo $name;
}
}
}
else
{
setcookie("product[1][id]", 1);
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
Nu moet ik nog zorgen dat ik de huidige ID vergelijk met alle records in de cookie product. Als ik een vergelijkbare ID heb gevonden kan ik de amount +1 doen.
Gewijzigd op 21/11/2010 13:31:23 door Justin S
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
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
33
34
35
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product']))
{
foreach($_COOKIE['product'] as $name => $value)
{
if($_COOKIE['product'][$name]['id'] == $_GET['id'])
{
setcookie("product[".$name."][amount]", $_COOKIE['product'][$name]['amount'] + $_GET['amount']);
}
else
{
setcookie("product[". intval($name + 1) ."][id]", $_GET['id']);
setcookie("product[". intval($name + 1) ."][amount]", $_GET['amount']);
}
}
}
else
{
setcookie("product[1][id]", $_GET['id']);
setcookie("product[1][amount]", $_GET['amount']);
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product']))
{
foreach($_COOKIE['product'] as $name => $value)
{
if($_COOKIE['product'][$name]['id'] == $_GET['id'])
{
setcookie("product[".$name."][amount]", $_COOKIE['product'][$name]['amount'] + $_GET['amount']);
}
else
{
setcookie("product[". intval($name + 1) ."][id]", $_GET['id']);
setcookie("product[". intval($name + 1) ."][amount]", $_GET['amount']);
}
}
}
else
{
setcookie("product[1][id]", $_GET['id']);
setcookie("product[1][amount]", $_GET['amount']);
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
Maaaaaar: nu gaat het ok, als je bijv: id=1&amount=1 doet dan blijft ie de amount van die ene ID ophogen met 1, alleen als ik dan id=2&amount=1 doe, dan voegt ie 'm 1 keer toe, maar matcht 'm daarna niet meer en verhoogt ie de amount niet meer...
het is $_COOKIE
en dat schrijf je ook nog eens met hoofdletters
Als je niks nuttigs te melden hebt ;-)..
Jacco Engel op 21/11/2010 13:54:39:
Je doet te moeilijk denk ik
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
het ging hierom
Jordi kroon op 21/11/2010 14:00:11:
het ging hierom
Jacco Engel op 21/11/2010 13:54:39:
Je doet te moeilijk denk ik
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
het ging hierom
No shit sherlock, maar dat koekje COOKIE moet zijn snap ik zelf ook ;-).. Fijn dat je ook wakker bent!
Jordi kroon op 21/11/2010 14:00:11:
het ging hierom
Jacco Engel op 21/11/2010 13:54:39:
Je doet te moeilijk denk ik
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
Als je gewoon $_koekje[product_id][amount] is het een stuk makkelijker
het ging hierom
Dat is het voorbeeld. Cookies worden ook wel eens koekjes genoemd om er naar te verwijzen.
De opzet die Jacco geeft bedoelde ik ook.
Maar hoe haal ik dan het vorige aantal op? Die kan ik niet matchen met foreach want dan krijg ik beide values terug.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product'][$_GET['id']]))
{
// Hoe krijg ik hier dan de match?
}
else
{
setcookie("product[".$_GET['id']."][".$_GET['amount']."]");
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product'][$_GET['id']]))
{
// Hoe krijg ik hier dan de match?
}
else
{
setcookie("product[".$_GET['id']."][".$_GET['amount']."]");
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
Waarom zou je het vorige aantal willen?
EDIT: Hoe overschrijf ik dan een cookie als ik de amount niet weet maar alleen de ID? Ik weet natuurlijk het vorige amount niet, dus kan alleen matchen op id
Dit werkt niet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product'][$_GET['id']]))
{
$_COOKIE['product'][$_GET['id']][""] = $_COOKIE['product'][$_GET['id']][$_GET['amount']];
}
else
{
setcookie("product[".$_GET['id']."][".$_GET['amount']."]");
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_COOKIE['product'][$_GET['id']]))
{
$_COOKIE['product'][$_GET['id']][""] = $_COOKIE['product'][$_GET['id']][$_GET['amount']];
}
else
{
setcookie("product[".$_GET['id']."][".$_GET['amount']."]");
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
Gewijzigd op 21/11/2010 14:24:50 door Justin S
setcookie("product[".$_GET['id']."]" , $_GET['amount']);
optellen $_COOKIE['product'][$_GET['id']] += $_GET['amount'];
aftrekken $_COOKIE['product'][$_GET['id']] -= $_GET['amount'];
Code (php)
Als ik nu dus bijvoorbeeld id set naar 2 en de amount naar 9, en ik set vervolgens id=1 en amount=4 verandert 'ie de array naar
[1] => 4
[2] => 1
Online voorbeeld klik hier
Je moet even refreshen om de print_r te krijgen en even spelen met de id en amount.
Geen probleem hier.
Weer een vraag:
Hoe wijzig je de waarde van een cookie? Ik wil dat hij op blijft tellen met 1 als er geen amount wordt meegegeven (dus als iemand voor de tweede keer op "voeg toe aan winkelmandje" klikt moet hij 1 toevoegen. Dit doet hij echter maar één maal.. Nu is de amount bijvoorbeeld 55 maar hij verhoogt niet verder dan 56..
Edit 2:
Gelukt met onderstaande code!
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
33
34
35
36
37
38
39
40
41
42
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_GET['amount']))
{
if(isset($_COOKIE['product'][""]))
{
foreach($_COOKIE['product'] as $name => $value)
{
if($name == $_GET['id'])
{
$_COOKIE['product'][$_GET['id']] = $_GET['amount'];
}
}
}
else
{
setcookie("product[".$_GET['id']."]" , $_GET['amount']);
}
}
else
{
if(isset($_COOKIE['product'][$_GET['id']]))
{
$value = $_COOKIE['product'][$_GET['id']];
setcookie("product[".$_GET['id']."]", $value += 1);
}
else
{
setcookie("product[".$_GET['id']."]" , 1);
}
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//$callback_url = $_SERVER['HTTP_REFERER'];
if(isset($_GET['amount']))
{
if(isset($_COOKIE['product'][""]))
{
foreach($_COOKIE['product'] as $name => $value)
{
if($name == $_GET['id'])
{
$_COOKIE['product'][$_GET['id']] = $_GET['amount'];
}
}
}
else
{
setcookie("product[".$_GET['id']."]" , $_GET['amount']);
}
}
else
{
if(isset($_COOKIE['product'][$_GET['id']]))
{
$value = $_COOKIE['product'][$_GET['id']];
setcookie("product[".$_GET['id']."]", $value += 1);
}
else
{
setcookie("product[".$_GET['id']."]" , 1);
}
}
echo '<pre>';
print_r($_COOKIE['product']);
echo '</pre>';
?>
Gewijzigd op 21/11/2010 16:51:22 door Justin S
Volgende probleem aan de man. Ben bezig met de winkelwagen.
Ik geef elk productveld (die ik uit de cookies haal met foreach) een input veld mee waar je het aantal op kan hogen.
dit gaat prima, het script wordt verwerkt en update elke cookie. Maar zodra de pagina dan refreshed staan daar nog de oude waarden. Zodra ik de pagina opnieuw inlaad update hij de view wel.
Edit: never mind, het is al gelukt...
Gewijzigd op 24/11/2010 12:38:38 door Justin S