Avatar billede agz Nybegynder
09. juni 2010 - 22:55 Der er 16 kommentarer og
1 løsning

PHP: indkøbskurv (sessions)

Jeg skal lave en så simpel som mulig indkøbskurv i php vha. sessions. Jeg ved, at der er utallige emner herinde omkring emnet, men jeg vil gerne have en samlet løsning i stedet for en masse halve.

I headeren (header.php) skal der være en linje hvor der står "Indkøbskurven er tom!" / "<x> produkter: <y>,-".

Derudover skal man ved, at klikke på ovenstående linje komme ind på kurven (kurv.php).

Ved at læse en masse tutorials er jeg kommet frem til, at det her er måden (en måde) at gøre det på:

[kurv.php]
$kommando=$_GET['kommando'];
switch ($kommando){
  case "tilfoej":
    // Tjek om produkt-id'et allerede er i kurven. Hvis ja: opdater, hvis nej: tilføj produktet.
    break;
  case "opdater":
    // Ret antallet for det givne produkt-id.
    break;
  case "slet":
    // Hvis produktet findes: fjern det.
    break;
  case "opdater":
    // Ret antal (som under 'hvis ja' i 'tilføj').
    break;
}

Jeg er rimelig i tvivl om hvordan det skal gøres helt konkret. Om man skal have en array med session-id'et med en array for hvert produkt-id i kurven eller hvordan:

$<session-id>['<produkt-id>']=<antal>
$<session-id>['<produkt-id2>']=<antal> osv..

Og så på en eller anden måde rende dem igennem når man skal se kurven, og tjekke med 'isset' om en given array er sat og så enten slette, opdatere eller tilføje?

Jeg er kørt lidt død i at prøve mig frem, hvorfor jeg skriver her.
Avatar billede majbom Novice
10. juni 2010 - 00:31 #1
din switch ser meget fornuftig ud.

din session ville jeg opbygge således:

$_SESSION['basket'][0]['product_id'] //id'et på produktet i databasen
$_SESSION['basket'][0]['product_name'] //navn
$_SESSION['basket'][0]['product_quantity'] //antal
$_SESSION['basket'][0]['product_price'] //pris
Avatar billede agz Nybegynder
10. juni 2010 - 17:57 #2
Og hvis der er flere forskellige produkter i kurven, er det så [0]'et der ændres til [1] osv.?
Avatar billede majbom Novice
10. juni 2010 - 19:16 #3
præcis :)

men hvis du gør det sådan her når du tilføjer en vare til kurven:

<?php
$basket = array(
  "product_id" => 12,
  "product_name" => "navn på vare",
  "product_quantity" => 3,
  "product_price" => 12.95
);
$_SESSION['basket'][] = $basket;


så vil den automatisk smide det ind efter den sidste i arrayet, så du ikke skal holde styr på hvor langt du er nået :)
Avatar billede agz Nybegynder
10. juni 2010 - 21:14 #4
Nu har jeg skrevet så meget af det jeg kan og sat kommentarer de steder hvor jeg ikke har kunnet finde ud af det (der er sikkert også fejl andre steder).

[kurv.php]
http://pastebin.com/0MbXJUpr

[kurv_funk.php] (funktionerne)
http://pastebin.com/5mevXhFU
Avatar billede majbom Novice
11. juni 2010 - 08:34 #5
det der med wildcard holder ikke helt, men det tror jeg heller ikke du havde regnet med? :)

du kan i stedet løbet dit array igennem og som varen allerede ligger i kurven:

<?php
session_start();
$basket_length = size_of($_SESSION['basket']);
$product_id = 12 //fiktivt id på en vare

for($i=0; $i<$basket_length-1;$i++){
  if($_SESSION['basket'][$i]['product_id'] == $product_id){
      //produkt findes i kurv - opdater antal (eller slet, hvis antal er 0)
  }else{
      //produkt findes ikke i kurv - tilføj
  }
}
?>
Avatar billede agz Nybegynder
11. juni 2010 - 22:47 #6
Jeg har ændret lidt i det, bl.a. fjernet "opdater". Jeg skal ikke bruge den, da der kun er et af hvert produkt.

Det virker lidt, men går i kage, hvis man tilføjer og fjerner nogle forskellige varer en del gange.

Jeg har lagt det op her, så du selv kan prøve det:
www.mdvpn.dk/2

Og koderne:
[index.php]
http://pastebin.com/qMx7X6av

[kurv.php]
http://pastebin.com/qELJxxt8
Avatar billede majbom Novice
12. juni 2010 - 12:32 #7
jeg har svært ved lige at se hvor det går galt, men jeg vil foreslå dig at udskrive dit session-array - eller i hvert fald bare "kurv"-delen med print_r()

så får du hurtigt et overblik over hvad der ligger i kurven, og nok også hvor det kager.
Avatar billede agz Nybegynder
12. juni 2010 - 13:17 #8
Nu har jeg opdateret den med print_r() på www.mdvpn.dk/2. Jeg kan ikke se hvad der er galt. Nogen gange sletter den en som den skal, men der forsvinder to fra listen, og antallet på index.php passer  også med at der kun er slettet en.
Avatar billede majbom Novice
13. juni 2010 - 11:00 #9
ja det er jo klart :)

prøv at smid en array_values() på dit basket array:

<?php
$_SESSION['kurv'] = array_values($_SESSION['lurv']);
?>


så rykker du arrayet sammen om du vil, så når du har slettet en linje, bliver den fjernet og de resterende linjer bliver rykket op, så der ikke er tomme linjer :)

håber det gav mening...
Avatar billede agz Nybegynder
13. juni 2010 - 18:54 #10
Jo det gav mening. Det fungerer helt nu, bortset fra følgende:

I header.php, som er require'et i kurv.php, har jeg linjen med "x antal produkter i kurven". Den opdaterer dog ikke når jeg tilføjer/sletter et produkt. Først når jeg trykker F5. Hvordan får jeg den til at opdatere med det samme?

Du må i øvrigt gerne smide et svar nu. Tak for hjælpen med det hele.
Avatar billede majbom Novice
13. juni 2010 - 19:33 #11
jeg går ud fra at headeren er requiret før du opdaterer kurven - så giver det jo mening - men du kan jo flytte koden op før require-delen...
Avatar billede agz Nybegynder
13. juni 2010 - 20:17 #12
Så opstår der et nyt problem. Css-filen bliver hentet i header.php, så nu bliver teksten ikke formateret.
Avatar billede majbom Novice
13. juni 2010 - 20:23 #13
jamen hvis headeren bliver requiret I kurv.php er det vel bare at flytte opdateringen af kurven op før require('header.php') og så stadig have den del af koden der udskriver kurven efter...?
Avatar billede agz Nybegynder
13. juni 2010 - 20:47 #14
Nu virker det.

Jeg har været nødt til at have session_start() i kurv.php, nu hvor header.php (hvori jeg også har session_start()) først requires efter jeg bruger sessions. Derfor får jeg en notice på den, da der er session_start() to gange. Hvordan "stopper" jeg den, så jeg undgår notice'en. Da det er til skolebrug, må der ikke være nogen af dem.
Avatar billede majbom Novice
13. juni 2010 - 21:00 #15
hvad med:

<?php
if(!session_id()){
  session_start();
}
?>


?
Avatar billede agz Nybegynder
13. juni 2010 - 21:01 #16
Bingo. Jeg takker mange gange for hjælpen.
Avatar billede majbom Novice
13. juni 2010 - 21:12 #17
selv tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester