Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problemy z tabelami w sesji
Forum PHP.pl > Forum > Przedszkole
gitbejbe
Witam.

To mój pierwszy post i zarejestrowałem z tej przykrej przyczyny, ze stoję w miejscu przy robieniu koszyka, a dokładniej - przy usuwaniu dodanych w sesji zakupów.

  1. <input type="submit" name="submit" value="'.$row['id'].'"style="margin-left:10px;"/> <!-- value posiada wartość ID produktu w bazie danych-->


  1. if(isset($_POST['submit']))
  2. {
  3. $z1=$_POST['submit'];
  4. $koszyk = "SELECT * FROM marka2 WHERE id='$z1'";
  5. $result1 = mysql_query($koszyk) or die (mysql_error());
  6. $dane = mysql_fetch_array($result1);
  7. extract($dane); // ^pobiera dane z bazy pod danym id produktu.
  8.  
  9. if(!isset($_SESSION['koszyk'][$_SESSION['idd']]))
  10. {
  11. if(array_search($dane['naglowek']."|".$dane['cena']."|".$_SESSION['idd'].'', $_SESSION['koszyk']) === false) //Blokuje powtarzanie tej samej sesji
  12. {
  13. $_SESSION['koszyk'][$_SESSION['idd']]=$dane['naglowek']."|".$dane['cena']."|''; //dodaje sesje z danymi z bazdy MySQL
  14. $_SESSION['idd']++;
  15. }
  16. }

No i tutaj działa wszystko jak trzeba. Sesje tworzą się po mojej myśli. Schody zaczeły się w głupim i pewnie banalnym miejscu. Mianowicie przy odwołaniu się do usunięcia konkretnej tabeli z sesji.
  1. if(isset($_SESSION['idd']))
  2. {
  3. foreach($_SESSION['koszyk'] as $value)
  4. {
  5. $wynik = explode("|", $value);
  6. echo'<li class="koszyk">nazwa produktu: <b>'.$wynik[0].'</b> - cena: <b>'.$wynik[1].'</b> //wyświetla wszystkie tabele
  7. <input type="submit" name="usun1" value="'.$value.'"> <br></li>'; // input posiada wartość całej tabeli w sesji
  8. }
  9. }

No i teraz gwiazda tego tematu: funkcja UNNSET
  1. if(isset($_POST['usun1']))
  2. {
  3. unset($_SESSION['koszyk'][1]);
  4. }

Efekt tego skryptu jest taki, ze po wykasowaniu wszystkich sesji i dodaniu na nowo paru kolejnych produktów, mogę usunąć tylko jeden z nich. Każdy kolejny po naciśnieciu submita ani drgnie aż do ponownego wyczyszczenia całej sesji. Próbowałem googlowach i tworzyć coś na wzór rzeczy które znalazłem, ale żadna z nich nie działa. Finalnie przedstawiłem tą o to wersje, bo jest chyba najbardziej przejrzysta. Mało ogarniam programowanie w PHP, ale staram się naucz czegoś nowego, a akurat teraz w dodatku dostałem zlecenie zrobienia prostego sklepu. Byłbym bardzo wdzięczny za pomoc. Pozdrawiam
nospor
Patrz proszę gdzie piszesz.... z obiektówką to nie ma żadnego związku..... przenosze.
gitbejbe
jestem tutaj pierwszy raz, będę uważać. Dzięki.
nospor
Co do problemu:

unset($_SESSION['koszyk'][1]);
Przecież kasujesz tutaj zawsze produkt z numerkiem 1 więc niby czemu się dziwisz, że nie kasuje ci innych? Inne są pod innymi numerkami.
gitbejbe
domyślam się, ze o to chodzi. Jednakże mimo to iż wskazuje na element [1], to mogę usunąć jednorazowo każdą z sesji bez znaczenia pod którą tablica jest zapisana - i to jest dziwne. Prosiłbym o jakieś konkretne porady, nie mam pojęcia jak to ugryźć i jak odwołać się dokładnie do elementu, którego wskażę poprzez submita.

pokombinowałem coś i niby powinno być ok ale nie jest...

  1. if(isset($_POST['usun1']))
  2. {
  3. $x = $_POST['usun1']; // wartosc tablicy którą chcę wywalić = " nagłówek 2|40.56||2 "
  4. foreach($_SESSION['koszyk'] as $id)
  5. {
  6. if($id == $x){
  7. echo'id='.$id.'x='.$x.'<br>'; // echo pokazuje mi że znalazł tą wartość którą chcę usunąć = " id= nagłówek 2|40.56||2 x= nagłówek 2|40.56||2 "
  8. unset($_SESSION['koszyk'][$id]);} // a tutaj mimo to nie chce tego wyrzucic................
  9. }
  10.  
  11. }


Nigdy na niczym mi tak nie zależało jak nad rozwiązaniem tej "zagadki". Proszę was o oświecenie ! termin mi się zbliża sad.gif
nospor
unset($_SESSION['koszyk'][$id]);} // a tutaj mimo to nie chce tego wyrzucic................
Przecież dla unset masz podać index tablicy a nie wartosc tablicy...
gitbejbe
cały skrypt polega na tym, ze do tej samej sesji o nazwie "koszyk", dodawane są kolejne wartości (którymi są produkty w sklepie). W przypadku wybrania 6 produktów gdzie sesja przechowuje dane o nazwie produktu i jego cenie, za cholerę nie potrafię odwołać się do indexu np trzeciego produktu. To już 2 dzień walki a ja nadal stoje w miejscu. NAprawdę z mojej strony mam olbrzymią prośbę, aby móc mnie jaśniej naprowadzić o co w tym wszytskim chodzi i jak to działa. Nie bez powodu jestem w dziale "Przedszkole" bo taki jest mój poziom wiedzy o PHP. Za przykład w postaci kodu jestem w stanie oddać pół królestwa i rękę mojej siostry !

@edit: z tego ja wnioskuje, to mam w tym projekcie 2 sesje, "koszyk" oraz "idd". Tylko sesja Id ulega inkrementacji.
  1. if(array_search($dane['naglowek']."|".$dane['cena']."|", $_SESSION['koszyk']) === false)
  2. {
  3. $_SESSION['koszyk'][$_SESSION['idd']]=$dane['naglowek']."|".$dane['cena']."|";
  4. $_SESSION['idd']++;
  5. }

W takim razie jak mam odszukać index sesji "koszyk". Nawet nie wiem czy się on tworzy , a już tym bardziej -jeśli się tworzy, jak go wyszukać.
nospor
Cytat
Za przykład w postaci kodu jestem w stanie oddać pół królestwa i rękę mojej siostry !
Osobiśćie strasznie nie lubię takich kłamstw....

Napisałem ci co robisz źle. $id to wartość koszyka a nie indeks koszyka. DLa unset masz podać indeks a nie wartość.

foreach($_SESSION['koszyk'] as $id) $id to wartość. Zajrzyj do manuala i zobaczy jak należy zmodyfikować FOREACH by otrzymać indeks
gitbejbe
...W końcu się uporałem ! Bardzo dziękuję @nospor za naprowadzenie mnie na właściwy tok myślenia : ) Dla potomnych z podobnym problemem, zamieszczam w temacie prawidłowe rozwiązanie. Z pewnością się przyda dla każdego początkującego z koszykiem opartym na sesjach : )

ps. Z połową królestwa to był tylko żart. Chciałem podkreślić powagę sytuacji w której się znajdowałem. Ale za to apropos siostry, to nie żartowałem. Mam aż 3 sztuki więc jedną mógłbym ewentualnie odstąpić ;D Pozdrawiam serdecznie i dzięki za pomoc : )

  1. <?php
  2. if(isset($_SESSION['idd']))
  3. {
  4. foreach($_SESSION['koszyk'] as $value) // Pierwszy foreach został umieszczony w (niewidniejącym tutaj divie). Odpowiedzialny jest za wyświetlenie pełnej wartości tablicy.
  5. {
  6. $wynik = explode("|", $value); // w tablicy usuwam niepotrzebny znak w postaci " | " w ramach estetycznych.
  7. echo'<li class="koszyk">'.$us.') nazwa produktu: <b>'.$wynik[0].'</b> - cena: <b>'.$wynik[1].'</b><br></li>';
  8. }
  9.  
  10. }
  11. ?>
  12. <?php
  13. foreach($_SESSION['koszyk'] as $key2 => $index2) // Ten foreach służy do przekazania dla wartości value - w przycisku submit, indeksów tablic zawartych w sesji.
  14. {
  15. echo'Usuń:<input type="submit" name="usun1" value="'.$key2.'"><br>';
  16. }
  17. ?>
  18. <?php
  19.  
  20. if(isset($_POST['usun1']))
  21. {
  22. $x = $_POST['usun1']; // zmienna $x zawiera numer indexu tablicy, pobrany z przycisku submit.
  23.  
  24. foreach($_SESSION['koszyk'] as $key => $index) // $pętla do wyszukiwania w sesji indeksów tablic. Indeksem jest stworzona w pętli zmienna $key.
  25. {
  26. if($x==$key) //jeśli pętla napotka numer indexu tablicy o takim samym numerze co numer indeksu przekazanej w $_POST['usun1'], to....
  27. {
  28. unset($_SESSION['koszyk'][$key]); // wskazujemy ten index do usunięcia z sesji : )
  29. }
  30. }
  31. }
  32. ?>
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.