Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problemy z koszykiem i sesją z PHPSESSID
Forum PHP.pl > Forum > PHP
sebap123
Napisałem ostatnio funkcję, która ma w zamyśle tworzyć w tabeli o nazwie carts nowy koszyk z podanym cartid i cart, który będzie jakby przegródką w koszyku, czyli zawartość cart w pewnym momencie zostaje przypisana do cartid w tabeli i cart zostaje wyczyszczony, żeby znowu zbierać dane. Powiedzmy, że wstępnie coś mi się udało napisać, jednak mam mały problem. Aktualnie funkcja tworząca cartid i podległe mu cart wygląda tak:
roley()
  1. function roley(){
  2. $cart_id=md5(rand(1,300));
  3. $rol=mysql_query("INSERT INTO carts (cartid)
  4. VALUE ('".$cart_id."')");
  5. $_SESSION['cart_id']=$cart_id;
  6. $_SESSION['cart']="";
  7. }


a na początku pliku gdzie można dodawać produkty (nazwijmy go sklepik.php) jest taka komenda:
  1. roley();


No i wszystko ładnie działa, jednak nie w 100% aż tak dobrze. Problemem jest tutaj to, że gdy użytkownik odświeży stronę to jest tworzony nowy koszyk i nowa sesja. Dlatego pomyślałem nad jakimś zabezpieczeniem. No i wpadłem na coś takiego:
roley()
  1. function roley($sesja){
  2. $cart_id=$sesja;
  3. $test=mysql_query("SELECT FROM carts (cartid,productid)
  4. VALUE ('".$cart_id."','""')");
  5. if(!mysql_fetch_array($test)==1){
  6. $rol=mysql_query("INSERT INTO carts (cartid)
  7. VALUE ('".$cart_id."')");
  8. $_SESSION['cart_id']=$cart_id;
  9. $_SESSION['cart']="";
  10. }
  11. }


a wywołanie:
  1. roley($_COOKIE['PHPSESSID']);


Tutaj jednak znowu są problemy. Pierwszy, że nie chce mi teraz nic ruszyć. Po prostu biały ekran, a po drugie to rozwiązanie nie jest jednak dobre, bo wierszy z cartid tym samym będzie więcej, bo każdy ma obsługiwać jednego carta dlatego tez zabezpieczenie to, że równe 1 mi nie pasuje.

Bardzo proszę was o pomoc, bo tutaj już za bardzo się zakręciłem w analizowaniu i potrzebne mi jakieś świeże spojrzenie. A może w ogóle jakiś inny sposób macie na takie przekazywania.
Quadina
W pierwszej wersji po prostu dodaj sobie w pierwszej linijce funkcji;
  1. if(isset($_SESSION['cart']))return;

Wtedy po odświeżeniu nie będzie się tworzyć nowy koszyk na podstawie warunku: czy już jest koszyk zapisany w sesji?

Wydaje mi się to odpowiedzią na Twoje pytanie.

W drugiej wersji wykonujesz zapytanie do SQL które nie ma sensu. Miało byc chyba:
  1. SELECT cartid,productid FROM carts WHERE cartid = "$cart_id";

Dodaj też sobie do swojego md5 time(), bo sam rand(0,300) ma ogromną powtarzalność.
Rid
Jeśli nie chcesz aby sesja ci ginęła użyj także cookies
  1. setcookie('cart_id',$cart_id,time()+(60));

gdzie 60 to czas życia ciasteczka mierzona w sekundach.
Natomiast w drugim dokumencie:
  1. echo 'to jest moja sesja:' .$_SESSION['cart_id']=$_COOKIE['cart_id'];

Mimo ,że zamkniesz przeglądarkę ,lub odświeżysz, cookies będzie nadal podtrzymywać sesje przez 60 sekund -naturalnie możesz ustawić inny czas życia twojego ciasteczka.
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-2025 Invision Power Services, Inc.