Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koszyk :|
Forum PHP.pl > Forum > Gotowe rozwiązania
noose
Witam
Mam sobie napisany koszyk.
Niestety nie wyswietla on nic :? nie wiem czemu :? (bledow tez nie wywala :?)
[php:1:2bb8c0d822]<?php
session_start();
ini_set('display_errors','1');

class Koszyk
{
var $artykuly;

function dodaj($numer, $ilosc){

$this->artykuly["$numer"] += $ilosc;

}

function usun($numer, $ilosc){

if($this->artykuly["$numer"]>$ilosc)

$this->artykuly["$numer"]-=$ilosc;

else

$this->artykuly["$numer"]=0;

}

function wyswietl(){

while(list($k, $v) = each($this->artykuly))
if($v>0)
echo "Artykul nr $k - $v sztuk<br>";

}

}
if (!isset($_SESSION['koszyk']))
{
$koszyk = new Koszyk;
}
else
{
$koszyk = new Koszyk;
$koszyk1 = $_SESSION['koszyk'];
while (list($art, $ilosc) = each ($koszyk1))
{
while(list($a,$i) = each ($ilosc))
{
if ($a != null)
{
$koszyk->dodaj($a,$i);
echo("Artykul: $a został dodany<br>");
}
}
}
}
$akcja = $_GET["akcja"];
$co = $_GET["co"];
$ilosc = $_GET["ile"];
if ($akcja = "dodaj")
{
$koszyk->dodaj($co,$ilosc);
}

$_SESSION['koszyk'] = $koszyk;
while (list($art, $ilosc) = each ($koszyk1))
{
while(list($a,$i) = each ($ilosc))
{
$sql = "SELECT * FROM artykuly where id = '$a'";
$rez = mysql_query($sql);
include_once("../db.php");
while($w = mysql_fetch_array($rez))
{
$nazwa = $w["nazwa"];
echo("<a href = "?strona=koszyk&akcja=usun&co=$id&ile=1">Usuń z koszyka $nazwa</a><br>Masz $i sztuk $nazwa<br>");
}
}
}
$koszyk->wyswietl();
?>[/php:1:2bb8c0d822]
jakies sugestie :?:

edit:
wrzucilem na inny serwer i wyskakuje mi
Cytat
Warning: Variable passed to each() is not an array or object in /home/www/data/jaw.pl/www.hh.jaw.pl/public_html/praca/poprawka/koszyk/index.php on line 46
:?
zombie
Dostałeś komunikat, że koszyk jest pusty. Funkcja each próbuje zostać wykonana na pustej tablicy. Zabezpiecz się jakimś if'em lub @each.
noose
dodalem artykul do koszyka i wywalilo:
Cytat
Warning: Variable passed to each() is not an array or object in /home/www/data/jaw.pl/www.hh.jaw.pl/public_html/praca/poprawka/koszyk/index.php on line 46
Artykul: 9 został dodany
Artykul nr 9 - 1 sztuk


zreszta... projekt macie tutaj : http://www.hh.jaw.pl/praca/poprawka/?strona=koszyk aby cos dodac, trzeba wejsc do "oferta" i tam sobie cos wybrac....
noose
Nikt nie wie :?: sad.gif
splatch
Wiesz też miałem coś takiego, ale postanowiłem to rozwiązać w inny sposób (wiem że to nie na temat). Gdy chcesz dodać cośdo kosza to sprawdzam czy produkt o podanym id istnieje, jesli tak to dodaję. Następnie przy wyświetlaniu pobieram ceny itp. produktu. Dodatkowo tabela użytkownika ma pole, w którym sumuję wartość produktów. Jeśli użytkownik jest zalogowany to używam jego id, a jeśli jest to gość do używam ip bez kropek. Myślę, że taka opcja jest w miarę. Ja zrezygnowałem z klasy, bo ciężko mi było dostosować ją do szablonów. Oczywiście teraz już by mi się udało smile.gif.
scanner
Cytat
[php:1:a9b4578c9d]<?php
// ...
while (list($art, $ilosc) = each ($koszyk1))
{
while(list($a,$i) = each ($ilosc))
{
// ...
?>[/php:1:a9b4578c9d]
Dwie pętle? Czy to aby nie za dużo?questionmark.gif Co masz w zmiennej $ilosc ? Jeśli ilość sztuk danego towaru, to druga petla p[asuje tutaj jak swini siodło...
Zresztą wystarczy przeczytać komunikat błędu... Przeczytać i zrozumieć...

Dodatkowo:[php:1:a9b4578c9d]<?php
foreach($koszyk1 as $art => $ilosc)
{
?>[/php:1:a9b4578c9d]jest konstrukcją czytelniejszą i chyba nieco szybszą...
noose
dwie petle sa po to, ze
print_r($koszyk);
Cytat
koszyk Object ( [artykuly] => Array ( [15] => 1 ) )

a teraz to w ogole nawet do sesji nie zapisuje :?
Masterkiller
Witam,
miałem podobny problem. Rozwiązanie jest banalne biggrin.gif Nie można do sesji pakować obiektów i dlatego koszyk nawet po dodaniu jest pusty. Aby to obejść należy koszyk przed wsadzeniem do sesji serializować a wyciągając go z sesji deserializujemy. Lece teraz do szkoły, jak wróce to podrzuce kawałek kody.

Narka
Masterkiller
a na początku skryptu umieszczamy:
Kod
if(isset($_SESSION['koszyk']))

     $koszyk=unserialize($_SESSION['koszyk']);

else

     $koszyk=new Koszyk(); //lub coś innego


a na końcu skryptu umieszczamy taki kawałek kodu:
Kod
$_SESSION['koszyk'] = serialize($koszyk);


Zmiana sesji na końcu skryptu nie jest najlepszym pomysłem więc trzeba jeszcze na początku skryptu włączyć buforowanie (ob_start()), a po poleceniu serializującym opróżniamy i zamykamy bufor.

Greetings biggrin.gif
noose
nic mi nie wychodzilo wiec napisalem od nowa smile.gif wpadlem na pomysl jak to zrobic bez zadnych klas i tak dalej tongue.gif
[php:1:0ad50036e5]<?
session_start();
session_name("Koszyk");
$akcja = $_GET["akcja"];
if ($akcja != "usun_kosz")
{
$koszyk = $_SESSION["koszyk"];
$id = $_GET["id"];
$ilosc = $_GET["ilosc"];
if ($akcja == "dodaj")
{
$stara_ilosc = $koszyk[$id];
$koszyk[$id] = $ilosc + $stara_ilosc;
}
elseif ($akcja == "usun")
{
$stara_ilosc = $koszyk[$id];
if ($stara_ilosc - $ilosc <= 0)
{
$koszyk[$id] = null;
} else {
$koszyk[$id] = $stara_ilosc - $ilosc;
}
}
else
{
if ($koszyk != null)
{
foreach($koszyk as $id => $ilosc)
{
echo "Artykuł: ".$id." sztuk ".$ilosc." <br>";
}
}
else
{
echo "Koszyk pusty!";
}
}
$_SESSION["koszyk"] = $koszyk;
echo "<br> <a href = "?akcja=usun_kosz">Usun koszyk</a>";
}
else
{ session_destroy();
echo "Usuniety!";
}
?>[/php:1:0ad50036e5]
mam nadzieje, ze komus sie przyda smile.gif
MaxRipper
Ok panowie skrypt koszyka jest bardzo fajny ale... jak zwykle mam problem smile.gif. Otóż teraz chce zrobic podliczanie wartości wszystkich towarow (cena pobrana bedzie z bazy danych). Zupelnie nie wiem jak sie do tego zabrac do tej pory moj koszyk wyglada tak:

[php:1:9bfc220158]
<?php
session_register("koszyk"); // rejestrujemy sesje
$akcja = $_POST["akcja"];
if ($show != "usun_kosz")
{
$koszyk = $_SESSION["koszyk"];
$id = $_POST["spid"];
if ($_POST["ilosc"] == "")
{
$ilosc = 1;
} else {
$ilosc = $_POST["ilosc"];
}

if ($show == "koszyk")
{
$stara_ilosc = $koszyk[$id];
$koszyk[$id] = $ilosc + $stara_ilosc;
}
elseif ($akcja == "usun")
{
$stara_ilosc = $koszyk[$id];
if ($stara_ilosc - $ilosc <= 0)
{
$koszyk[$id] = null;
} else {
$koszyk[$id] = $stara_ilosc - $ilosc;
}
}
else
{
if ($koszyk != null)
{
foreach($koszyk as $id => $ilosc) ## wyświetlamy nazwy produktow z bazy oraz ich ilość ##
{
$zapytanie = "SELECT nazwa, id FROM produkty WHERE id='$id' ";
$wykonaj = mysql_query ($zapytanie);
$wiersz = mysql_fetch_array ($wykonaj);
$n=1;
$n++;
$cena['$n'] = 1;
$ilosctowaru['$n'] = $ilosc;
echo "<a href="index.php?show=produkty&id=$id&".SESID."">".$wiersz['nazwa']."</a><br> x ".$ilosc." szt.<br>";
}
echo "==============<br>
Suma: ";
## no i tu zonk - nie wiem jak zliczyc sume wszystkich produktow uwzgledniajac ilośc zamowionych sztuk czyli cos takiego jak cena*ilosc gdziecena jest pobierana z bazy :/ ##
for ($i=1; $i<=$n ; $i++) // tu coś kombinowalem ale nici :/
{
$dupa = "".$ilosctowaru['$n']."";
}

}
else
{
echo "Koszyk pusty!";
}
}
$_SESSION["koszyk"] = $koszyk;
echo "<br> <a href = "?show=usun_kosz">Usun koszyk</a>";
}
else
{ session_unregister("koszyk");
echo "Usuniety!";
}
?>[/php:1:9bfc220158]

Z gory dziekuję smile.gif
LeWaR
Może przedstawie swoją wersję koszyka:
[php:1:fc865bb9a1]<?php
class koszyk
{
/* tablica asocjacyjna zawierajaca stan koszyka */
/* klucz, to wartosc id produktu, wartosc to ilosc elementow */
var $zawartosc;
function dodaj($element, $ilosc)
{
$this->zawartosc[$element] += $ilosc;
}
function zmien($element, $ilosc)
{
if ($ilosc=="0")
{
unset($this->zawartosc[$element]);
}
else
{
$this->zawartosc[$element] = $ilosc;
}
}
function usun($element, $ilosc)
{
/*
if ($this->zawartosc[$element] > $ilosc)
$this->zawartosc[$element] -= $ilosc;
else
*/ unset($this->zawartosc[$element]);
}
function kasuj()
{
unset($this->zawartosc);
}
function stan()
{
return $this->zawartosc;
}
}

?>[/php:1:fc865bb9a1]

Obsługa:

[php:1:fc865bb9a1]<?php
if ($stan)
{ reset($stan);
$razem=0;
while (list($key, $value) = each($stan))
{
/* tu mamy do obróbki dane o towarze i ilości
}
}

?>[/php:1:fc865bb9a1]

A teraz moje:
[php:1:fc865bb9a1]<?php

# generowanie id zamówienia
if (!$id_kosz)
{
include('serial.php');
$id_kosz=$id_zamka;
session_register('id_kosz');
}

/* obsługa koszyka */
# jeśli nie ma koszyka, to utwórz..
if ($log_ok!="ok")
{
if (!$koszyk)
$koszyk = new koszyk;
#dodawanie do koszyka
if ($dodaj)
{
if (is_array($dodaj))
{
while (list($key, $value) = each($dodaj))
{
$koszyk->dodaj($key, $value);
}
}
else
{
$koszyk->dodaj($dodaj, 1); # zamiast 1 bylo $$dodaj
}
}
# zmiana ilości danego towaru
if ($zmien)
$koszyk->zmien($zmien, $$zmien);

# usuwanie z koszyka
if ($usun)
$koszyk->usun($usun, $$usun);
# kasowanie całego koszyka
if ($action == "kas_kosz")
{
$koszyk->kasuj();
}

# uporządkowanie stanu rzeczy
session_register("koszyk");
$stan = $koszyk->stan();
}


?>[/php:1:fc865bb9a1]

Myśle, że sie komuś przyda. Troche dużo, ale przeglądając kod ktoś sie nauczy biggrin.gif
noose
[php:1:c9b9014fbf]<?php
$n=1;
$n++;
$cena['$n'] = 1;
$ilosctowaru['$n'] = $ilosc;
$suma = ($cena*$ilosc) + $suma; ### tutaj jest poprawka :]
echo "<a
href="index.php?show=produkty&id=$id&".SESID."">".$wiersz['nazwa']."</a><br> x
".$ilosc." szt.<br>";
}
echo "==============<br>
Suma: ". $suma." zł"; ### TUTAJ DRUGA
## no i tu zonk - nie wiem jak zliczyc sume wszystkich produktow uwzgledniajac ilośc
zamowionych sztuk czyli cos takiego jak cena*ilosc gdziecena jest pobierana z bazy
:/ ##?> [/php:1:c9b9014fbf]
moze w ten sposob :?: tongue.gif (tam gdzie jest ###)
MaxRipper
Dziekuję za zainteresowanie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.