Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koszyk w PHP dubluje wyniki powyżej 3tys rekordów
Forum PHP.pl > Forum > PHP
slawek19926
Witam wszystkich.
Jeśli to zły dział proszę o przeniesienie do odpowiedniego.

Przechodząc do tematu problem polega na tym, że:
mam sobie taki kod - http://hastebin.com/ucopinadax.xml
Do 3 tysięcy rekordów wszystko było ok tzn można było zmienić ilość w koszyku bez żadnego problemu oraz można było usunąć produkt z koszyka.
Teraz rekordów jest 13 tysięcy i właśnie tu zaczynają się problemy:
1. przy próbie zmiany ilości jak jest więcej niż 1 produkt w koszyku dubluje mi zmieniany produkt (pierwszy zostaje z początkową ilością, a drugi jest z poprawioną)
2. nie można usunąć żadnego produktu powyżej ID 3000 jeśli jest w koszyku więcej niż 1 produkt, nawet tego zdublowanego.

Na próbę dodałem rekord o ID 1301 i odziwo ten działa poprawnie tzn można go zmieniać, usuwać

Siedzę już nad tym 4 dni i wymiękam więc proszę o pomoc.
aras785
Cześć.

Fragment do "update" wygląda tak:

  1. case "update":
  2. $found = false;
  3. foreach($_SESSION['cart_item'] as $product)
  4. {
  5. if($_REQUEST['reference'] == $product['reference']) {
  6. $found = true;
  7. break;


i gdzie tutaj jest jakaś aktualizacja?
slawek19926
To akurat była moja kombinacja bo normalnie działało to na case"add"
maly_swd
http://www.php.net/manual/en/info.configur....max-input-vars

Lub
max_input_vars = 3000
suhosin.post.max_vars = 3000
suhosin.request.max_vars = 3000

Musisz zwiększyć te wartości
slawek19926
Niestety nic to nie daje co_jest.gif
maly_swd
A ja Ci mówię, że to to.

Pokaż co masz w phpinfo?
nospor
@maly_swd zwroc uwage ze on wysyla oddzielnego forma dla kazdego produktu a nie wszystkie produkty w jednym formie

@slawek Twoj kod jest fatalny.
Skoro kluczem w $_SESSION["cart_item"] jest reference to:
1) Nie ma sensu bys latal po calej tablicy i sprawdzal kazdy elelement, skoro mozesz od razu zrobic:
$_SESSION["cart_item"]['szukanyrefence']

2) Skoro kluczem jest UNIKALNY reference to nie ma prawa sie nic dublowac bo jak zrobisz w tablicy
$tab[1] = 'jeden';
$tab[1] = 'dwa';
to drugie 1 nadpisze ci pierwsze i nie ma mowy o duplikatach
Tak wiec cos krecisz, albo nagle ci refence zmienia na inne.

Popraw ten kod, uporzadkuj bo teraz to jest, przepraszam, wielki burdel - pomimo ze kodu duzo nie ma.


Masz niepoprawna strukture html, np. <tr><form><td>
Zajrzyj do dokumentacji html i zobacz jak wyglada poprawna tabela, HINT: miedzy TR a TD nie ma prawa nic innego byc.

edit:
ten kod z akcji ADD a nie UPDATE wyglada ze moze robic to co mowisz
  1. if(in_array($productByCode[0]["reference"],$_SESSION["cart_item"])) {
  2. foreach($_SESSION["cart_item"] as $k => $v) {
  3. if($productByCode[0]["reference"] == $k)
  4. $_SESSION["cart_item"][$k]["quantity"] = $_POST["quantity"];
  5. }
  6. } else {
  7. $_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
  8. }

Tylko ze to jest ADD a nie UPDATE jak pisales wczesniej. Do rzeczy:
to
if(in_array($productByCode[0]["reference"],$_SESSION["cart_item"])) {
nigdy nie jest prawdziwe bo szukasz reference na liscie tablic a nie liscie referencji wiec wchodzi co do ELSE czyli do
$_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
a array_merge gdy tablice maja indexy numeryczne to poprostu numeruje wszystko od nowa wiec tak, to ci moze dublowac i zmieniac totalnie wszystko wiec nic dziwnego ze potem nie jest w stanie kasowac jak indesky sie pozmienialy.

Dobrze by bylo jakbys pisal opis problemu troche bardziej porzadnie na przyszlosc bo opisales ze podczas UPDATE ci sie duplikuje a tu raczej podczas ADD jest duplikacja
slawek19926
Może zrobię tak, że podam link do tego co nie działa i już. Wtedy każdy sobie zobaczy w czym tkwi problem.
katalog online
PHP INFO

Pozdr.
aniolekx
sprawdzales za pomoca debuggera co sie dzieje w kodzie?
nospor
Cytat
Może zrobię tak, że podam link do tego co nie działa i już
A moze poprostu popraw rzeczy ktore ci wskazalem?
slawek19926
Pozmieniałem i nadal nic :/
nospor
I oczywiscie ja wiem na co pozmieniales...
Tak trudno podac poprawiony kod?
slawek19926
Tzn zmieniłem form w html i wyrzuciłem case update. Tylko qrcze ciągle nie wiem jak zmienić to co pisałeś odnośnie tablic.

KOD
nospor
Czyli zrobiles cale nic ale oczywiscie musiales napisac:
Cytat
Pozmieniałem i nadal nic :/

Guzik pozmieniales, struktura html nadal nie poprawna. Prosilem, zajrzyj do dokumentacji jak ma wygladac poprawna struktura TABLE.
slawek19926
Co mi to da jak poprawię strukturę table poza czytelnością?
nospor
Czasami niepoprawna struktura html jest powodem blednie wysylanych formow. Nie mowie, ze tak jest w tym przypadku, nie mniej jednak strasznie kluje po oczach. smile.gif
Pyton_000
A masz, co mi tam...
Resztę sobie sam ogarniaj, koniec dobroci smile.gif
  1. <?php
  2. require_once("dbcontroller.php");
  3. $db_handle = new DBController();
  4. if(!empty($_GET["action"])) {
  5.  
  6. if(!isset($_SESSION["cart_item"])) {
  7. $_SESSION["cart_item"] = [];
  8. }
  9.  
  10. switch($_GET["action"]) {
  11. case "add":
  12. if(!empty($_POST["quantity"])) {
  13. mysql_query("SET CHARSET utf8"); // polskie znaki
  14. mysql_query("SET NAMES `utf8` COLLATE `utf8_polish_ci`"); // polskie znaki
  15. $productByCode = $db_handle->runQuery("SELECT * FROM cenniki WHERE reference='" . $_GET["reference"] . "' ORDER BY reference LIMIT 1");
  16.  
  17.  
  18. $quantity = (int)$_POST["quantity"];
  19. $product = $productByCode[0];
  20. $product['quantity'] = $quantity;
  21.  
  22. if(array_key_exists($product['reference'], $_SESSION["cart_item"])) {
  23. $_SESSION["cart_item"][$product['reference']]['quantity'] = $quantity;
  24. break;
  25. }
  26.  
  27. $_SESSION["cart_item"][$product['reference']] = $product;
  28. break;
  29. }
  30. break;
  31. case "remove":
  32. if(array_key_exists($_GET["reference"], $_SESSION["cart_item"])) {
  33. unset($_SESSION["cart_item"][$_GET["reference"]]);
  34. }
  35. break;
  36. case "empty":
  37. $_SESSION["cart_item"] = [];
  38. break;
  39. }
  40. }
  41. ?>


Oczywiście to może nie działać w 100% i na 100% nie jest wolne od wad...
slawek19926
Rozumiem, że mam teraz to połączyć ze swoim nieudolnym kodem?
nospor
Masz zastapic caly swoj kod php z poczatku twojego pliku tym co dostales od Pytona
slawek19926
Początkowo zastąpiłem, ale jest błąd 500
nospor
Nauczysz sie w koncu czy nie? Nie pisz, ze cos poprawiles, tylko pokaz kod po poprawkach. No skad mamy wiedziec co znowu napsules.
Pyton_000
No i Temat: Najczestsze bledy
slawek19926
Kod po zmianach
nospor
I ten kod daje ci teraz error 500?
slawek19926
Dokładnie tak
nospor
To chyba przez [] ktore nie sa obslugiwane w twoim php. zmien
$_SESSION["cart_item"] = [];
na
$_SESSION["cart_item"] = array();
i wszedzie indziej gdzie zdefiniowana jest w ten sposob tablica
slawek19926
WOW! W końcu działa jak należy biggrin.gif

Dobrze rozumiem, że żebym mógł wpisać rabat z ręki muszę zrobić ?
  1. $rabat = (int)$_POST["rabat"];
  2. $product = $productByCode[0];
  3. $product['rabat'] = $rabat;
  4.  
  5. if(array_key_exists($product['reference'], $_SESSION["cart_item"])) {
  6. $_SESSION["cart_item"][$product['reference']]['quantity'] = $quantity;
  7. $_SESSION["cart_item"][$product['reference']]['rabat'] = $rabat;
  8. break;
  9. }
nospor
Tak
slawek19926
No i teraz jak zwykle musiałem coś zepsuć. Jak dodałem opcję rabatu z ręki to po wkładaniu do koszyka niema ilości tylko muszę ją wpisywać ręcznie :/
nospor
Zauwazyles, iz poraz trzeci nie podales poprawionego kodu?
slawek19926
Poprawiony kod
Form pewnie znów jest błędnie, ale inaczej nie chce działać :/
nospor
Po grzyba drugi raz z rzedu dajesz to:
$product = $productByCode[0];
zaraz po pierwszym?
Przeciez w ten sposob nadpisujesz $product ktory ustaliles dwie linie wczesniej
slawek19926
Poprawiłem. Teraz nie pobiera mi rabatu :/

EDIT:

Tzn wkłada same zera zamiast np 48.00%
nospor
Ostatni raz mowie POKAZ KOD. Potem poprostu zaczne ignorowac twoj temat.
slawek19926
Już zrobiłem.

Dopisałem

  1. if(!empty($_POST["quantity"]["rabat"])) {


Proszę bardzo cały kod
nospor
czyli juz dziala?
Zdajesz sobie sprawe ze teraz bez rabatu nie bedziesz w stanie dodac nic do koszyka?

edit:
a co to jest
if(!empty($_POST["quantity"]["rabat"])) {
?
Bierzesz jakies losowe kody i strzelasz czy ten kod moze jednak wyszedl po wiekszej zadumie?
slawek19926
Każda pozycja ma rabat chociażby 0.
Ten kod to był strzał być może sobie w kolano.

Co do rabatu byłoby super gdyby pobierał wartość np 54.13% a nie 54% :/

Kolumna rabat: rabat decimal(20,2) [0.00]
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.