Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z foreach
Forum PHP.pl > Forum > Przedszkole
lukasz_web
Opisem wstępu robię w sklepie internetowym moduł szybkich zakupów w którym trzeba podać numer katalogowy i ilość zamawianego produktu

  1.  
  2. foreach($_POST['products_model'] as $products_model) {
  3. $thulequery="SELECT products_id FROM products WHERE products_model = '{$products_model}' ";
  4. $thule_products_id_query = mysql_query($thulequery) or die(mysql_error());
  5. $thule_products_id = mysql_result($thule_products_id_query,0);
  6.  
  7.  
  8. foreach($_POST['quantity'] as $ilosc_p) {
  9.  
  10.  
  11. $cart->add_cart($thule_products_id, $cart->get_quantity($thule_products_id)+$ilosc_p);
  12.  
  13. }
  14. }

Pierwsza pętlą foreach zachowuje się poprawnie dodaje mi numery katalogowe do koszyka w sklepie internetowym. Problem polega z drugą która ma dodawać ilości sztuk do koszyka.

Problem polega na tym że jak dodam taki input:
[nr. kat][ilość]
[0001][2]
[0002][4]

Do koszyka doda mi te dwa numery katalogowe ale ilości sumuje z inputów do pojedynczego numeru katalogowego w KOSZYKU:
[nr. kat][ilość]
[0001][6]
[0002][6]

A powinno dodać do numeru 0001 2 szt. a do numeru 0002 4szt.

SmokAnalog
Przeanalizuj taki kod:
  1. $products = array();
  2.  
  3. $products_number = count($_POST['products_model']);
  4.  
  5. for($i = 0; $i < $products_number; $i += 1) {
  6. $products_model = $_POST['products_model'][$i];
  7. $quantity = $_POST['quantity'][$i];
  8.  
  9. if(isset($products[$product_model])) {
  10. $products[$product_model]['quantity'] += $quantity;
  11. } else {
  12. $thulequery="SELECT products_id FROM products WHERE products_model = '{$products_model}' ";
  13. $thule_products_id_query = mysql_query($thulequery) or die(mysql_error());
  14.  
  15. $products[$product_model] = array(
  16. 'id' => mysql_result($thule_products_id_query,0),
  17. 'quantity' => $quantity,
  18. );
  19. }
  20. }
  21.  
  22. foreach($products as $product) {
  23. $cart->add_cart($product['id'], $cart->get_quantity($product['id']) + $product['quantity']);
  24. }
lukasz_web
Dzięki ale nadal ten sam wynik:
[nr. kat][ilość]
[0001][6]
[0002][6]
A powinno dodać do numeru 0001 2 szt. a do numeru 0002 4szt.

Ale analizuje twój kod i może się uda na nim coś znaleźć by rozwiązać ten problem
SmokAnalog
To coś źle robisz. Pokaż formularz.
lukasz_web
Pełen kod z twoja zmianą:

  1. case 'add_product_quick' :
  2. $query_price_to_guest_result = ALLOW_GUEST_TO_SEE_PRICES;
  3. if ((($query_price_to_guest_result=='true') && !(tep_session_is_registered('customer_id'))) || ((tep_session_is_registered('customer_id')))) {
  4. if (isset($_POST['products_model'])) {
  5.  
  6. $products = array();
  7.  
  8. $products_number = count($_POST['products_model']);
  9.  
  10. for($i = 0; $i < $products_number; $i += 1) {
  11. $products_model = $_POST['products_model'][$i];
  12. $quantity = $_POST['quantity'][$i];
  13.  
  14. if(isset($products[$product_model])) {
  15. $products[$product_model]['quantity'] += $quantity;
  16. } else {
  17. $thulequery="SELECT products_id FROM products WHERE products_model = '{$products_model}' ";
  18. $thule_products_id_query = mysql_query($thulequery) or die(mysql_error());
  19.  
  20. $products[$product_model] = array(
  21. 'id' => mysql_result($thule_products_id_query,0),
  22. 'quantity' => $quantity,
  23. );
  24. }
  25. }
  26.  
  27. foreach($products as $product) {
  28. $cart->add_cart($product['id'], $cart->get_quantity($product['id']) + $product['quantity']);
  29. }
  30. }
  31.  
  32. tep_redirect(tep_href_link($goto, tep_get_all_get_params(array('action'))));
  33.  
  34. } else {
  35. $navigation->set_snapshot();
  36. tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  37. }
  38. break;
  39.  



Formularz:

  1. <?php echo '<label for="p_scnts"><input type="text" size="30" name="products_model['.$licznik_produktow.']" value="" placeholder="Wpisz numer katalogowy GRENE" /><input type="text" name="quantity['.$licznik_produktow.']" value="" maxlength="3" size="5" placeholder="ilość" /></label>'; ?>


pola input powielam sobie przez jquery.
SmokAnalog
Tak myślałem, masz błąd w formularzu. Usuń indeksy z nazw pól:
  1. <?php echo '<label for="p_scnts"><input type="text" size="30" name="products_model[]" value="" placeholder="Wpisz numer katalogowy GRENE" /><input type="text" name="quantity[]" value="" maxlength="3" size="5" placeholder="ilość" /></label>'; ?>

Pola, których nazwy są zakończone otwartym i zamkniętym nawiasem kwadratowym [] są automatycznie indeksowane i tego chcemy. Ty powielasz pola, z tym samym indeksem, czyli na dobrą sprawę masz tylko jedno pole (jedną unikalną nazwę).

Poza tym dbaj o wcięcia, bo Twój kod jest nieczytelny.
lukasz_web
Za rady wielki + Ale nadal jest efekt ten sam, jeżeli uzupełnię jedno pole z numerem katalogowym i ilością to nie ma problemu dodaje ładnie do koszyka, ale jeżeli mam już dwa to ciągle to samo:
[nr. kat][ilość]
[0001][6]
[0002][6]
A powinno dodać do numeru 0001 2 szt. a do numeru 0002 4szt.
SmokAnalog
Jesteś pewien, że prawidłowo używasz tej metody dodającej do koszyka?

Możesz sobie zrobić test tego mojego fragmentu robiąc po nim:
  1. var_dump($products);


Polecam wykonać taki test, może po drodze pomyliłeś jakieś wartości.
lukasz_web
To działa:

  1. case 'add_listing' :
  2.  
  3. $query_price_to_guest_result = ALLOW_GUEST_TO_SEE_PRICES;
  4.  
  5. if ((($query_price_to_guest_result=='true') && !(tep_session_is_registered('customer_id'))) || ((tep_session_is_registered('customer_id')))) {
  6.  
  7. if (isset($_POST['products_id'])) {
  8.  
  9. $tablica = $_POST['products_id'];
  10.  
  11. $ilosc = $_POST['quantity'];
  12.  
  13. for($i = 0; $i < sizeof($tablica); $i++)
  14.  
  15. {
  16.  
  17. if ((int)$ilosc[$i] > 0) {
  18.  
  19. $attributes_tab = $_POST['atrib'];
  20.  
  21. if (isset($attributes_tab[$tablica[$i]])) {
  22.  
  23. $tabs = substr($attributes_tab[$tablica[$i]],0,strlen($attributes_tab[$tablica[$i]])-1);
  24.  
  25. $tabsa = explode(',',$tabs);
  26.  
  27. $attributes = array();
  28.  
  29. for($b = 0; $b < sizeof($tabsa); $b++) {
  30.  
  31. $podtablica = explode(':',$tabsa[$b]);
  32.  
  33. $attributes[$podtablica[0]] = $podtablica[1];
  34.  
  35. }
  36.  
  37. $cart->add_cart($tablica[$i], $cart->get_quantity(tep_get_uprid($tablica[$i], $attributes))+$ilosc[$i], $attributes);
  38.  
  39. } else {
  40.  
  41. $cart->add_cart($tablica[$i], $cart->get_quantity($tablica[$i])+$ilosc[$i]);
  42.  
  43. }
  44.  
  45. }
  46.  
  47. }
  48.  
  49. }
  50.  
  51. tep_redirect(tep_href_link($goto, tep_get_all_get_params(array('action', 'pid'))));
  52.  
  53. } else {
  54.  
  55. $navigation->set_snapshot();
  56.  
  57. tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  58.  
  59. }
  60.  
  61. break;
  62.  


Ale dodaje po ID produktu (products_id) a nie po numerze katalogowym (products_model), próbowałem to przerobić by po products_model dodawał.
SmokAnalog
Zrób taki test jak napisałem powyżej i pokaż wynik.
lukasz_web
Zrobiłem test i nic mi nie zwraca.
Cytat
Jesteś pewien, że prawidłowo używasz tej metody dodającej do koszyka?

Próbowałem przerobić ten kod co ostatnio dodałem: case 'add_listing' -> który dodaje prawidłowo tylko że po wpisaniu id produktu, ale klient posługuje się numerami katalogowymi a nie id produktu z bazy danych tongue.gif i próbuje to przerobić by działało z products_model
SmokAnalog
Jak to nic nie zwraca? Coś musi zwracać.

Przed tą linią:
  1. foreach($products as $product) {


Daj:
  1. var_dump($products); exit;


Jak to nic nie wypisze na ekranie to znaczy, że cały ten blok kodu w ogóle się nie wykonuje. Dałeś dość mały fragment kodu więc zgadywał nie będę, rób testy, o których mówię.
lukasz_web
Dokładnie w złym miejscu wpisałem sorki ale mam już wynik:

array(1) { [""]=> array(2) { ["id"]=> string(6) "918360" ["quantity"]=> int(7) } }

Po wpisaniu dwóch produktów do koszyka
SmokAnalog
I mamy buga z mojej strony. W całym moim fragmencie kodu zamień wszystkie frazy $product_model na $products_model, po czym uruchom test ponownie i pokaż wynik.
lukasz_web
Działa! Jest idealny efekt

array(2) { ["1275-001005"]=> array(2) { ["id"]=> string(6) "918350" ["quantity"]=> string(1) "5" } ["1275-001012"]=> array(2) { ["id"]=> string(6) "918356" ["quantity"]=> string(1) "6" } }

Wielkie dzięki, chętnie bym cię zaprosił na piwo bo rozwiązanie rozwiązaniem ale wiele też się nauczyłem.
SmokAnalog
Jak jesteś z Krakowa to zaproszenie przyjęte wink.gif
lukasz_web
Kurcze kawałek mam ja z wielkopolski smile.gif podziękować
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.