Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Invalid argument supplied for foreach(), błąd pojawia się tylko czasami
Arek00
post
Post #1





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

Ostrzeżenie: (0%)
-----


mam koszyk w którym dodawanie produktów wygląda następująco:

  1. <?php
  2. $dodaj = $_POST['dodaj'][0];
  3.  
  4. if($dodaj){
  5.  if (!isset($_SESSION['koszyk'])){
  6. $_SESSION['koszyk'] = array();
  7.  }
  8.  
  9.  if(isset($_SESSION['koszyk'][$dodaj])){
  10. if ($_SESSION['koszyk'][$dodaj] != 99){
  11.  $_SESSION['koszyk'][$dodaj]++;
  12. }
  13.  }else{
  14. $_SESSION['koszyk'][$dodaj] = 1;
  15.  }
  16. }
  17. ?>


wszystko niby działa bez zarzutu ale co jakiś czas pojawia się taki błąd:
Kod
Invalid argument supplied for foreach() on line 266

linia 266 wygląda tak:
  1. <?php
  2. foreach ($_SESSION['koszyk'] as $id_produktu => $ilosc){
  3. ?>

mi się ten błąd nie pojawił nigdy ale widzę w logach że klienci coś takiego dostają. O co tu może chodzić?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zanim wywolasz swojego foreach'a, to musisz najpierw sprawdzic, czy $_SESSION['koszyk'] istnieje i czy jest tablicą.
Bo przeciez te wartosc ustawiasz dopiero gdy ktos dodaje do koszyka, a jesli jeszcze nic nie dodal to tej wartosci nie ma i dostajesz bledy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Arek00
post
Post #3





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

Ostrzeżenie: (0%)
-----


czy to chodzi o coś takiego:
  1. <?php
  2. if($_SESSION['koszyk'] && array_count_values($_SESSION['koszyk'])){
  3.  foreach ($_SESSION['koszyk'] as $id_produktu => $ilosc){
  4. // tutaj zapisuję produky do bazy
  5.  }
  6. }
  7. ?>

tylko problem w tym że to jest foreach którym pobieram produkty z koszyka i zapisuję w bazie (jako zamówienie), nie da się go wywołać jeżeli w koszyku nic nie ma (jeżeli koszyk jest pusty to nie ma linku który umożliwiłby złożenie zamówienia). wcześniej gdy wyświetlam zawartość koszyka mam zrobione tak jak tu napisałem.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
nie da się go wywołać jeżeli w koszyku nic nie ma
Najwyraźniej jednak sie da, skoro masz takie logi smile.gif

A z tym warunkiem to przekombinowales. zrob tak:
  1. <?php
  2. if(isset($_SESSION['koszyk']) && is_array($_SESSION['koszyk']))
  3. ?>


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Arek00
post
Post #5





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

Ostrzeżenie: (0%)
-----


czyli kod zapisujący zamówienie powinien wyglądać tak:
  1. <?php
  2. if(isset($_SESSION['koszyk']) && is_array($_SESSION['koszyk'])){
  3.  foreach ($_SESSION['koszyk'] as $id_produktu => $ilosc){
  4. // tutaj zapisuję produky do bazy
  5.  }
  6. }else{
  7.  echo "przepraszamy ale wystąpił błąd, proszę spróbować ponownie";
  8. }
  9. ?>


link kierujący do złożenia zamówienia wyświetlany jest pod zawartością koszyka (tylko jeśli coś się w nim znajduje), nie ma innej drogi na złożenie zamówienia
ta sytuacja wygląda tak że gdy klient kliknie "złóż zamówienie" i przejdzie do strony gdzie podaje swoje dane to zanim potwierdzi zamówienie to gubiona jest zawartość koszyka...
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
link kierujący do złożenia zamówienia wyświetlany jest pod zawartością koszyka (tylko jeśli coś się w nim znajduje), nie ma innej drogi na złożenie zamówienia
A jesli ktos zapamietal ten link i potem wklepal go bezposrednio do przeglądarki?

Teraz ten kod wyglada sensownie smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Arek00
post
Post #7





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

Ostrzeżenie: (0%)
-----


znów mi się pojawił ten błąd, tym razem w tym foreach:
  1. <?php
  2. if(isset($_POST['aktualizacja'])){  
  3.  foreach ($_SESSION['koszyk'] as $id_produktu => $ilosc){
  4. if($_POST[$id_produktu]=='0' || !is_numeric($_POST[$id_produktu])){
  5.  unset($_SESSION['koszyk'][$id_produktu]);
  6. }else{
  7.  $_SESSION['koszyk'][$id_produktu] = $_POST[$id_produktu];
  8. }
  9. }
  10. }
  11. ?>

jest to kod który uaktualnia liczbę produktów w koszyku, czyli np. miałem 1, wpisuję że chcę 3 i wciskam przycisk "aktualizuj koszyk" który wywołuje ten kod i powraca do tego samego adresu czyli mojastrona.pl/koszyk
tym razem jeśli ktoś zapamiętałby adres i wszedł bezpośrednio na mojastrona.pl/koszyk to jest sprawdzenie czy istnieje $_SESSION['koszyk'] i czy jest tablicą więc co najwyżej dostałby tekst że koszyk jest pusty
w jaki sposób w powyższym kodzie wywołać taki błąd?
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To jest dokladnie ten sam blad? Napewno wskazuje na ten kod? No i czy teraz caly kod tej petli?
Bo przy tym kodzie co podales, to trudno o ten blad, a przynajmniej mi sie nie udalo a probowalem smile.gif
No i zakladam ze naprawde jesli nie ma sesji koszyk to ten kod sie nie wykona. Bo tu tego warunku nie widze


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Arek00
post
Post #9





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

Ostrzeżenie: (0%)
-----


dodawanie, aktualizacja i wyświetlanie produktów wykonywane jest za pomocą tego kodu (wyrzuciłem tutaj część odpowiedzialną za wyświetlanie zawartości)
  1. <?php
  2. $dodaj = $_POST['dodaj'][0];
  3.  
  4. if($dodaj){
  5.  if (!isset($_SESSION['koszyk'])){
  6. $_SESSION['koszyk'] = array();
  7.  }
  8.  
  9.  if(isset($_SESSION['koszyk'][$dodaj])){
  10. if ($_SESSION['koszyk'][$dodaj] != 99){
  11.  $_SESSION['koszyk'][$dodaj]++;
  12. }
  13.  }else{
  14. $_SESSION['koszyk'][$dodaj] = 1;
  15.  }
  16. }
  17.  
  18. if(isset($_POST['aktualizacja'])){  
  19.  foreach ($_SESSION['koszyk'] as $id_produktu => $ilosc){
  20. if($_POST[$id_produktu]=='0' || !is_numeric($_POST[$id_produktu])){
  21.  unset($_SESSION['koszyk'][$id_produktu]);
  22. }else{
  23.  $_SESSION['koszyk'][$id_produktu] = $_POST[$id_produktu];
  24. }
  25. }
  26. }
  27.  
  28. if($_SESSION['koszyk'] && array_count_values($_SESSION['koszyk'])){
  29.  //wyświetlanie zawartości koszyka
  30. }else{
  31.  $output .= "<br><br><center>Koszyk jest pusty.</center>";
  32. }
  33. ?>

ja nie widzę innej drogi żeby dostać się do tego foreach niż poprzez kliknięcie przycisku "aktualizuj koszyk", a jeśli tak to znaczy że jestem w koszyku w którym się coś znajduje czyli sejsa istnieje (ale oczywiście mogę się mylić)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 15:16