Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Invalid argument supplied for foreach()
Forum PHP.pl > Forum > PHP
Arek00
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ć?
nospor
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
Arek00
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.
nospor
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. ?>
Arek00
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...
nospor
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
Arek00
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?
nospor
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
Arek00
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ć)
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.