Avatar billede Hans1 Praktikant
21. marts 2011 - 12:07 Der er 36 kommentarer og
1 løsning

Indkøbskurv

Hej

Jeg benytter mig af følgende kode til at tilføje vare i indkøbskurven:

[code]
$cart  = $_SESSION['cart'];
switch ($action) {
case 'add':
    if (!$cart) {
        $cart = '';
    }
   
    for($i = 1; $i <= $amount; $i++) {
        $cart .= ','.$item;
    }
   
    $cart = trim($cart, ",");
$_SESSION['cart'] = $cart;
  header( 'Location: /basket' );
break;
}
[/code]

Problemet er at de forskellige vare har flere forskellige variationer i form af farve. Så når jeg tilføjer vare id 1 med en i sort og en i gul så tæller det kun som en linie under hvad man har i indkøbskurven. Jeg kunne godt tænke mig at hver farve af vare er en selvstændig vare.

Fx under indkøbskurven

Vare id: 1
Farve: sort

vare id: 1
farve: gul

I stedet for:

Vare id: 1
Farve: sort, gul
Avatar billede majbom Novice
21. marts 2011 - 12:20 #1
kan du ikke bruge div og pre tags i stedet for code? det virker ikke synderlig godt herinde... :(
Avatar billede Hans1 Praktikant
21. marts 2011 - 12:24 #2
Hold da op nej det kan jeg se....

Vi prøver da bare igen :)


$cart  = $_SESSION['cart'];
switch ($action) {
case 'add':
    if (!$cart) {
        $cart = '';
    }
   
    for($i = 1; $i <= $amount; $i++) {
        $cart .= ','.$item;
    }
   
    $cart = trim($cart, ",");
$_SESSION['cart'] = $cart;
  header( 'Location: /basket' );
break;
}
Avatar billede majbom Novice
21. marts 2011 - 12:31 #3
så skal du jo lave din kurv om til et array, så du kan have flere informationer på den enkelte vare i stedet for kun et id:

$cart = array(
  array(
      'id' => 2,
      'color' => 'gul'
  ),
  array(
      'id' => 2,
      'color' => 'sort'
  )
);
Avatar billede Hans1 Praktikant
21. marts 2011 - 12:39 #4
Aha og hvad så med selve indkøbskurven når det skal vises:

Lige nu bruger jeg dette og den gør intet med farven kun id.


function Cart() {
    global $db;
        $cart = $_SESSION['cart'];
if ($cart) {
        $items = explode(',',$cart);
$contents = array();
        foreach ($items as $item){
            $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
}

foreach ($contents as $id=>$qty) {
$sql = 'SELECT * FROM vare WHERE id = '.$id;
$result = $db->query($sql);
$row = $result->fetch();
extract($row);
$total += $price * $qty;   
}} else {
echo 'Indkøbskurven er tom!';
}}
Avatar billede repox Seniormester
21. marts 2011 - 12:42 #5
Lav et multidimensionelt array til din indkøbskurv i stedet for den mærkelige streng - den måde at lave indkøbskurv på er jeg stødt på flere gange her på eksperten, men ikke om jeg forstår hvor den opbygning kommer fra? Jeg har aldrig set den andre steder end her.

Fordelen ved at bruge et multidimensionelt array er at du kan lave det du ønsker, men samtidig bibeholde en fleksibel kurv, hvis nu farve-muligheden pludselig ikke er nok...

Eksempel:
<?php

    $_SESSION["cart"] = array();
   
    $vare_id = "1234";
    $antal = 1;
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) ); // For at unikt identificere valget af vare samt valg af varens attributter
   
    $_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
    $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
    $_SESSION["cart"][$cart_row_id]["attributter"] = $options;
   
   
    // Vi skal også lige bruge den samme t-shirt, bare i sort
    $vare_id = "1234";
    $antal = 5;
    $options = array( "farve" => "sort" );
    $cart_row_id = md5( $vare_id . implode("", $options) );
   
    $_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
    $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
    $_SESSION["cart"][$cart_row_id]["attributter"] = $options;
   
   
    // Og så kommer jeg i tanke om jeg gerne vil have en mere i gul
    $vare_id = "1234";
    $antal = 1;
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) );
   
    $_SESSION["cart"][$cart_row_id]["antal"] += $antal;



    //Resultat?
    $br = "<br />"; // for nemheds skyld...
    foreach($_SESSION["cart"] as $item)
    {
        echo "vare ID: ".$item["vare_id"].$br;
        echo "Antal: ".$item["antal"].$br;
        echo "Valg:".$br;
        foreach($item["attributter"] as $key => $value)
            echo " - ".$key.": ".$value.$br;
       
        echo $br.$br;
    }

?>
Avatar billede Hans1 Praktikant
21. marts 2011 - 12:56 #6
Det ser godt nok godt ud repox.

Lige et spørgsmål. Før man kan opdatere en vare som allerede er der skal man så bruge:

$_SESSION["cart"][$cart_row_id]["antal"] += $antal;

Denne linie har du jo selv tilføjet da du ved at den allerede eksistere.

Hvad hvis jeg nu har tilføjet 1 gul.
Så skal den jo først vide om den allerede findes før den skal bruge

$_SESSION["cart"][$cart_row_id]["antal"] += $antal;
Avatar billede Hans1 Praktikant
21. marts 2011 - 13:00 #7
Det er jo klart at man skal bruge:


$_SESSION["cart"][$cart_row_id]["antal"] += $antal;


Hvis man opdatere ved hjælp af fx linket: ?action=update

men den ved ikke at den skal opdatere den når den er inde på varens side fx ?action=add

Hvis man nu skal tilføje flere derinde fra.
Avatar billede repox Seniormester
21. marts 2011 - 13:05 #8
Du kunne jo lave en hurtig kontrol, hver gang du skal tilgå et cart_row_id:

<?php
    if( !isset($_SESSION[$cart_row_id]) )
    {
        $_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
        $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
        $_SESSION["cart"][$cart_row_id]["attributter"] = $options;
    }
    else
        $_SESSION["cart"][$cart_row_id]["antal"] += $antal;

?>
Avatar billede Hans1 Praktikant
21. marts 2011 - 13:10 #9
Dvs sådan her:



    $_SESSION["cart"] = array();
    $vare_id = $item;
    $antal = $amount;
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) );   

    if( !isset($_SESSION[$cart_row_id]) )
    {
        $_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
        $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
        $_SESSION["cart"][$cart_row_id]["attributter"] = $options;
    }
    else
        $_SESSION["cart"][$cart_row_id]["antal"] += $antal;
Avatar billede repox Seniormester
21. marts 2011 - 13:16 #10
Jeps.
Avatar billede Hans1 Praktikant
21. marts 2011 - 13:21 #11
Men så overlapper den...

Hvis jeg har tilføjet id: 1 og farve: sort
og jeg så tilføjer id: 1 igen samt farve: sort

Så skriver den at jeg kun har tilføjet 1 under antal.

Og hvis jeg tilføjet id: 2
så over lapper den så der står id 2 under kurven frem for 2 linier hvor der står id 1 ved den første og så id 2 efter
Avatar billede repox Seniormester
21. marts 2011 - 13:34 #12
Du har vel ikke tilfældigvis linien $_SESSION["cart"] = array(); med hver gang du indsætter en vare, vel?
Avatar billede Hans1 Praktikant
21. marts 2011 - 13:39 #13
Jo det havde jeg...

Men det gør ikke nogen forskel
Avatar billede repox Seniormester
21. marts 2011 - 13:41 #14
Så har du glemt at få session_start() med, hvis det er fordi du skal bruge det på en anden side.
Avatar billede Hans1 Praktikant
21. marts 2011 - 14:33 #15
hmm har husket session.
Jeg tror mere at det er $_SESSION["cart"] = array(); som jeg mangler på den anden side. Men så viser den intet...

Virker den hos dig ?
Avatar billede repox Seniormester
21. marts 2011 - 14:36 #16
$_SESSION["cart"] = array(); var kun for at vise at det var et array - den skal generelt ikke bruges.
Avatar billede Hans1 Praktikant
21. marts 2011 - 14:44 #17
Okay den overlapper bare stadig...
Avatar billede repox Seniormester
21. marts 2011 - 14:46 #18
Så må der noget kode på bordet - mit simple eksempel ovenfor virker jo efter hensigten; lige nu gætter jeg jo bare...
Avatar billede Hans1 Praktikant
21. marts 2011 - 14:51 #19
Faktisk så virker det med at den lister flere ting nu :)

vare ID: 3
Antal: 1
farve: gul


vare ID: 1
Antal: 4
farve: gul


vare ID: 7
Antal: 1
farve: gul


Men den overskriver stadig
Her er koden.

Tilføjning


session_start();
    $vare_id = $item;
    $antal = $amount;
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) );   

    if( !isset($_SESSION[$cart_row_id]) )
{
$_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
$_SESSION["cart"][$cart_row_id]["antal"] = $antal;
$_SESSION["cart"][$cart_row_id]["attributter"] = $options;
}
else
$_SESSION["cart"][$cart_row_id]["antal"] += $antal;


Visning


session_start();
foreach($_SESSION["cart"] as $item)
    {
        echo "vare ID: ".$item["vare_id"].$br;
        echo "Antal: ".$item["antal"].$br;
        echo "Valg:".$br;
        foreach($item["attributter"] as $key => $value)
            echo " - ".$key.": ".$value.$br;
       
        echo $br.$br;
    }
Avatar billede repox Seniormester
21. marts 2011 - 14:58 #20
Og hvad mener du så med den overskriver?
Avatar billede Hans1 Praktikant
21. marts 2011 - 15:07 #21
Når jeg mener overskriver så er det fordi at fx hvis jeg nu har tilføjet dette altså 1 stk id=3 med farve=gul

vare ID: 3
Antal: 1
farve: gul

Og jeg så under tilføj vælger det samme altså 1 stk id=3 med farve=gul så skriver den det samme nemlig


vare ID: 3
Antal: 1
farve: gul


Jeg ville jo gerne have at den skrev 2 stk frem for 1 stk da jeg har tilføjet den 2 gange. Ikke som nu hvor at hvis jeg skal have antal 2 så skal jeg tilføje 2 på en gang:

vare ID: 3
Antal: 2  <------- 2 stk
farve: gul
Avatar billede Slettet bruger
21. marts 2011 - 19:19 #22
Bare en sidebemærkning, ville det ikke være smart at lave dette objektorienteret og bruge klasser i stedet?
Avatar billede Hans1 Praktikant
21. marts 2011 - 19:41 #23
Kan du uddybe lidt nærmere :)
Bedre fordele?
Avatar billede Slettet bruger
21. marts 2011 - 22:33 #24
Ja jeg kan da prøve, tjek evt: http://php.net/manual/en/keyword.class.php

Hvis du bruger klasser kan du lave en samling af variable og funktioner i en pakke. Jeg har lavet et simpelt eksempel, men hvis du ikke rigtig har har arbejdet med klasser før er det måske nemmere at holde det i arrays.

Eks.


session_start();
// Der oprettes en produktklasse (et overordnet skelet for et produkt)
class Produkt{
    // Her er nogle variable som et produkt kan indeholde.
    private $id;
    private $farve;
   
    // Denne funktion kaldes når der oprettes et nyt produkt.
    function __construct($id, $farve){
        $this->id = $id;
        $this->farve = $farve;
    }
}

// Der laves et par nye produkter
$produkt_1 = new Produkt(1, "gul");    // Produkt med id=1 og farven gul.
$produkt_2 = new Produkt(2, "rød");    // Produkt med id=2 og farven rød.


// Der laves en indkøbskurv
class Kurv{
    private $produkter;
   
    function tilfoejProdukt($produkt){  // Funktion til at tilføje et produkt.
        $this->produkter[]=$produkt;
    }
}

$_SESSION["kurv"] = new Kurv;  // Ny indkøbskurv oprettes i session.
$_SESSION["kurv"]->tilfoejProdukt($produkt_1);  // Produkt_1 puttes i indkøbkurv.
$_SESSION["kurv"]->tilfoejProdukt($produkt_2);

Forresten hvordan laver jeg sådan en fin boks til koden, har prøvet lidt forskelligt men kan ikke få det til at virke.
Avatar billede repox Seniormester
22. marts 2011 - 08:08 #25
#21
Du må gøre noget forkert i din kode et sted - umiddelbart virker den stump kode jeg har givet dig 'out-of-the-box'. Jeg bliver nød til at se noget mere kode for at identificere problemet...

#24
Det du har lavet overtræder ganske voldsomt KISS koncepte, du har ikke uddybet hvilke fordele du opnår ved at bruge objekter i indkøbskurven og slutteligt har jeg svært ved at se hvordan du vil opdatere din indkøbskurv uden at iterere hen over den for at identificere et objekt og dets attributter. I øvrigt er dit objekt ikke skalerbart, hvorfor dit objekt så mister sin reelle OOP værdi.
Avatar billede Hans1 Praktikant
22. marts 2011 - 08:37 #26
#25

Okay tjek så lige denne kode her.
Jeg bruger GET adressen: ?action=add&item=1&amount=4
hvis jeg så opdatere i browseren når jeg er inde på netop denne adresse. Så skal den jo vise Antal: 8

Den viser bare antal: 4 lige meget hvor mange gange jeg opdatere browseren.


<?php
session_start();
$action = $_GET['action'];
$item = $_GET['item'];
$amount = $_GET['amount'];

if($action == "add"){



    $vare_id = $item;
    $antal = $amount;
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) );   

    if( !isset($_SESSION[$cart_row_id]) )
{
$_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
$_SESSION["cart"][$cart_row_id]["antal"] = $antal;
$_SESSION["cart"][$cart_row_id]["attributter"] = $options;
}
else
$_SESSION["cart"][$cart_row_id]["antal"] += $antal;

}
foreach($_SESSION["cart"] as $item)
    {
        echo "vare ID: ".$item["vare_id"].$br;
        echo "Antal: ".$item["antal"].$br;
        echo "Valg:".$br;
        foreach($item["attributter"] as $key => $value)
            echo " - ".$key.": ".$value.$br;
       
        echo $br.$br;
    }
?>
Avatar billede repox Seniormester
22. marts 2011 - 09:01 #27
Fejlen fundet - den var på min side, da vi tilføjede den ekstra kontrol i #8.

Det her virker efter hensigten:
<?php
    session_start();

    if($_GET["action"] == "add")
    {
    $vare_id = $_GET["item"];
    $antal = $_GET["amount"];
    $options = array( "farve" => "gul" );
    $cart_row_id = md5( $vare_id . implode("", $options) ); 

    if( !isset($_SESSION["cart"][$cart_row_id]) )
        {
           
            $_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
            $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
            $_SESSION["cart"][$cart_row_id]["attributter"] = $options;
        }
        else
            $_SESSION["cart"][$cart_row_id]["antal"] += $antal;

    }
        foreach($_SESSION["cart"] as $item)
    {
          $br = "<br />";
        echo "vare ID: ".$item["vare_id"].$br;
        echo "Antal: ".$item["antal"].$br;
        echo "Valg:".$br;
        foreach($item["attributter"] as $key => $value)
            echo " - ".$key.": ".$value.$br;
     
        echo $br.$br;
    }
?>
Avatar billede Hans1 Praktikant
22. marts 2011 - 09:05 #28
Hov vent nu lige lidt der ved "if" skal der ikke der være et + ved: $_SESSION["cart"][$cart_row_id]["antal"] = $antal;
i stedet for else?


if( !isset($_SESSION[$cart_row_id]) )
{
$_SESSION["cart"][$cart_row_id]["vare_id"] = $vare_id;
$_SESSION["cart"][$cart_row_id]["antal"] = $antal;
$_SESSION["cart"][$cart_row_id]["attributter"] = $options;
}else
$_SESSION["cart"][$cart_row_id]["antal"] += $antal;
Avatar billede repox Seniormester
22. marts 2011 - 09:11 #29
#28
Nej - det skal der ikke.
Avatar billede Hans1 Praktikant
22. marts 2011 - 09:17 #30
#29 Okay. Skrev beskeden imens du fandt problemet.

Jeg tænkte på måden at jeg tjekker om der overhoved er tilføjet nogeti kurven. Kan jeg der benytte mig af dette?


if($_SESSION["cart"] == "")
echo "Kurven er tom!";
}else{
foreach($_SESSION["cart"] as $item)    {          $br = "<br />";        echo "vare ID: ".$item["vare_id"].$br;        echo "Antal: ".$item["antal"].$br;        echo "Valg:".$br;        foreach($item["attributter"] as $key => $value)            echo " - ".$key.": ".$value.$br;              echo $br.$br;   
}
}


Og Hvordan tjekker jeg hvor mange der totalt er tilføjet?
Avatar billede repox Seniormester
22. marts 2011 - 09:29 #31
Det ville give mere mening at gøre noget ala:
if( !isset($_SESSION["cart"]) || count($_SESSION["cart"]) == 0)
{
  echo "Kurven er tom";
}
else
{
...
Avatar billede Hans1 Praktikant
22. marts 2011 - 09:34 #32
Okay. Men hvordan udskriver jeg antal vare som totalt er tilføjet hvis man ligger dem sammen.

Fx 10 vare i indkøbskurven.
Avatar billede repox Seniormester
22. marts 2011 - 09:45 #33
Så skal du lave et gennemløb:
<?php

  $varer_i_kurven = 0;
  foreach($_SESSION["cart"] as $item)
    $varer_i_kurven += $item["antal"];

  echo "Du har ".$varer_i_kurven." vare(r) i din kurv";

?>
Avatar billede Hans1 Praktikant
22. marts 2011 - 09:47 #34
Tusinde tak repox :)
Det vil jeg arbejde videre med.
Lig et svar...
Avatar billede repox Seniormester
22. marts 2011 - 09:55 #35
Det fik du her...
Avatar billede Hans1 Praktikant
22. marts 2011 - 10:35 #36
Sorry men har ikke lige set at der nu mangler at stå varens id.
Det bliver ikke udskrevet med koden i post #27
Avatar billede Hans1 Praktikant
22. marts 2011 - 10:41 #37
Glem det Fejl 40 :(
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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