webForumDet fria alternativet

Hjälp med kundkorg och session önskas...

PHP

11 svar · 1 784 visningar · startad av Proton

Medlem sedan okt. 2000242 inlägg
Frågan#1

Hej,

Jag håller på med att skapa en webbshop och vill kunna välja antal av en vara och skicka iväg detta med en submit-knapp..

Jag har ett fält som heter, antal och ett gömt fält som heter PID, alltså produktid. För att få just det antalet av just den produkten.

Detta ska sedan tillfälligt lagras i en session. Väljer jag att lägga till en ny vara ska denna vara samt antalet jag valt av varan också lagras i sessionen.

Jag har provat att lösa det med en vektor i en session men misslyckats.

HJÄLP!

Hälsningar
Johnny

Medlem sedan dec. 2002789 inlägg
#2

Här är en klass som jag håller på och bygger för tillfället. Hoppas det hjälper.

<?php
/*    Användning:

        // tilldela ny instans av varukorgen till variabeln $shop
        $shop = new cart();

        // lägg till artiklar i varukorgen
        $shop -> addItem('artikel_nr', 'artikel_pris', 'antal');

        // ta bort artiklar ur varukorgen
        $shop -> deleteItem('artikel_nr');

        // uppdatera artiklar i varukorgen
        $shop -> updateItems('artikel_nr', 'antal');

        // visa artiklar i varukorgen
        // kort visning:
        // visar antal artiklar i varukorgen samt den totala priset
        $shop -> showItems('short');
        // lång visning
        // listar alla artiklar i varukorgen
        $shop -> showItems('long');

        // visa den totala kostnaden inkl. moms
        echo $shop -> showTotal(false);
        // visa den totala kostnaden exkl. moms
        echo $shop -> showTotal(true);

*/

class cart {
    var $total = 0;
    var $vat = 0.25;

    function addItem($pid, $price, $quantity){
        if (!isset($_SESSION['cart'][$pid])){
            $_SESSION['cart'][$pid] = array('price' => $price, 'quantity' => $quantity);
            $this -> total += ($price * $quantity);
        } else {
            $_SESSION['cart'][$pid]['quantity'] += $quantity;
            $this -> total += ($_SESSION['cart'][$pid]['price'] * $quantity);
        }
    }

    function deleteItem($pid){
        $this -> total -= ($_SESSION['cart'][$pid]['price'] * $_SESSION['cart'][$pid]['quantity']);
        unset($_SESSION['cart'][$pid]);
    }

    function updateItems($pid, $quantity){
        $this -> total -= $_SESSION['cart'][$pid]['price'] * $_SESSION['cart'][$pid]['quantity'];
        $_SESSION['cart'][$pid]['quantity'] = $quantity;
        $this -> total += ($_SESSION['cart'][$pid]['price'] * $quantity);
    }

    function showItems($type){
        if($type == 'short'){
            echo "Du har <strong>".sizeof($_SESSION['cart'])."</strong> artiklar i varukorgen.<br />
                 Den totala kostnaden är <strong>".$this -> showTotal(true)."</strong> inklusive moms.";
        } else {
            foreach ($_SESSION['cart'] as $item => $p){
            echo "<tr><td>".$item."</td>";

            foreach ($p as $key => $i){
                echo "<td>".$key.": ".$i."</td>";
            }

            echo "</tr>";
            }
        }
    }

    function showTotal($v){
        if ($v){
            return $this -> total * (1 + $this -> vat);
        } else {
            return $this -> total;
        }
    }
}
?>
Medlem sedan okt. 2000242 inlägg
#3

Har glömt att tacka!

Din kod fick mig att tänka i nya banor, tack!

Hälsningar
Johnny

Medlem sedan jan. 2002227 inlägg
#4

hur anropar man classen?
addItem(1,900,2);
funkar inte för mig?

Medlem sedan apr. 2002830 inlägg
#5
// tilldela ny instans av varukorgen till variabeln $shop
 $shop = new cart();

 // lägg till artiklar i varukorgen
 $shop -> addItem('artikel_nr', 'artikel_pris', 'antal');

EDIT: Alltså, du måste först tilldela variabeln $shop en ny instans av classen. Det gör du på första raden. Sedan för att anropa funktionen som finns i klassen så skriver du $shop->addItem('artikel_nr', 'artikel_pris', 'antal');

Det som står innan -> är med andra ord den klassen du vill anropa, det som står efter är den funktionen inom klassen $shop du vill använda dig av.

//Nippe

Medlem sedan sep. 2003143 inlägg
#6

Ehrm.. Skulle nån kunna vara vänlig och berätta lite mer om hur man kan använda sig av de här funktionerna?
Jag har fått i uppdrag att skapa en kundkorg för ca 30 varor fördelade på fyra olika sidor. Jag kan ingenting om PHP, började titta lite på exempelkoder igår... :r

När jag lägger en vara i korgen skickas antal, produktID och pris med till en sida där kundkorgen finns och skrivs ut. På den sidan har jag lagt följande kod:

if( $_GET[ 'antal' ] != "" )
{
$shop = new cart();
$shop -> addItem($_GET[ 'pid' ], $_GET[ 'pris' ], $_GET[ 'antal' ]);
$shop -> showItems('long');
}

Varan läggs i kundkorgen som den ska och resultatet skrivs ut, helt i sin ordning, men hur får jag i fler varor? Om jag från sidan med varor klickar på en annan vara och lägger till så visas bara det senast ilagda.
Det beror väl på att jag anropar en ny instans av cart först, men om jag tar bort den så får jag givetvis ett felmeddelande som säger att jag inte har skapat någon cart.

Jag behöver någon som kan berätta för mig lite steg-för-steg hur jag ska gå till väga. Jag fattar det mesta som Darrens kod ovan gör. Men att få i flera varor i korgen är knivigast just nu...

Snälla, kan nån förklara för en stackars nolla (som gärna börjar i fel ände när hon ska lära sig något nytt)? :q

Medlem sedan maj 2001797 inlägg
#7

Gammal tråd men jag har samma problem som Annakay, hur gör man med instansieringen egentligen?
Min kod:

<?php
include("classCart.php");

$shop = new cart();

$pris = 25;
$antal = 1;

if ($_GET[p]) {
	$shop -> addItem($_GET[p],$pris,$antal);
}
?>
<html>
	<head>
		<title>
		</title>
	</head>
	<body>
		<?php $shop -> showItems('long'); ?>
		<br /><br />
		<hr />
		<br /><br />
		<a href="index.php?p=1">Köp produkt 1</a><br />
		<a href="index.php?p=2">Köp produkt 2</a><br />
		<a href="index.php?p=3">Köp produkt 3</a><br />
	</body>
</html>
Medlem sedan juni 20014 421 inlägg
#8

En webbshop är annars ett väldigt bra exempel på där man borde skriva sin egen sessionshanterare, då kan man även reservera varor i databasen till dess att sessionen går ut, då man kan sätta upp sin egen garbage collector funktion.
http://se.php.net/session-set-save-handler

Medlem sedan maj 2001797 inlägg
#9

Ser intressant ut. Men varför är det bättre än klassen ovan?
Och vad gör jag och Annakay för fel när vi försöker lista produkterna i korgen?

Medlem sedan mars 20034 471 inlägg
#10

web00132 skrev:

Och vad gör jag ... för fel när vi försöker lista produkterna i korgen?

Vad händer om du skriver följande:

<?php foreach($_SESSION as $ix => $value)
         echo "$ix => $value, ";
$shop -> showItems('long'); ?>

Finns det något i korgen? Får du ut något ur foreach-slingan? $_SESSION är ju global och alltså är alla värden i den åtkomliga också utanför klassen.

Du kan också pröva att lägga till en rad i metoden showItems(.) som skriver ut "Tom korg" när det är lämpligt.

Medlem sedan juni 20001 251 inlägg
#11

Lite noteringar:

* Glöm inte session_start(); högst upp i filen ni vill ha sessionhantering i.

<?php
session_start();
include("classCart.php");

$shop = new cart();

* Glöm inte att showItems('long'); ?> saknar <table> och </table>

<table>
<?php $shop -> showItems('long'); ?> 
</table>

Testar/Dumpar sessioner gör ni enklast med https://www.php.net/var_dump

<?php
var_dump($_SESSION);
?>
Medlem sedan dec. 20011 860 inlägg
#12

Gammal tråd men hur gör jag för att enbart plocka ut vissa värden i sessionsarrayen istället för att använda denna som finns i showItems:

            foreach ($p as $key => $i){
                echo "<td>".$key.": ".$i."</td>";
            }
array[??][??]

Typ ??? Eller hur gör man? Vad är det man skall använda för värden? Anledningen till detta är att jag vill där man skriver
ut det skapa ett fält med summa för varor där man beställer fler än 1 st.

Alltså jag skriver ut det så här... har lagt till lite i addCart så det passar mig:

ID, Namn, Antal, á Pris, Pris

Nu skriver den bara ut ID, antal och á Pris

269 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)