Php kosár módosítás hiba

Php kosár módosítás hiba
2017-08-08T16:57:04+02:00
2017-08-09T12:40:44+02:00
2022-08-10T18:25:29+02:00
fav0r
Sziasztok! 

Az alábbi kód egy php kosáré. Minden terméknél és annak opcióinál (méret stb.) van egy limit, hogy mennyi van raktáron. Azt próbálom a kosár résznél elérni, hogy ha változtat (mennyiséget növel), akkor ha eléri a raktáron lévő limitet, ne tudjon többet hozzáadni. 

Valamiért azt írja nincs definiálva az elérhető mennyiség (Notice: Undefined variable: available in C:\xampp\htdocs\teszt\cart.php on line 47)

Nézem, hogy elírtam-e valamit, de nem látom hol lehet a hiba. A 47-es sornál is úgy nézem rendben van, nem értem...

<?php require_once 'core/init.php'; include 'includes/header.php'; include 'includes/navigation.php'; if($cart_id !=''){ $cartQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'"); $result = mysqli_fetch_assoc($cartQ); $items = json_decode($result['items'],true); $i = 1; $sub_total = 0; $item_count = 0; } ?> <h3>Kosár tartalma</h3> <?php if($cart_id == ''): ?> <p class="text-center">A kosár üres.</p> <br> <br> <?php else: ?> <table class="table table-bordered table-condensed table-striped"> <tbody> <thead> <th>#</th><th>Termék neve</th><th>Egységár</th><th>Mennyiség</th><th>Opció</th><th>Összegzés darab szerint</th> </thead> <?php foreach($items as $item){ $product_id = $item['id']; $productQ = $db->query("SELECT * FROM estate WHERE id = '{$product_id}'"); $product = mysqli_fetch_assoc($productQ); $sArray = explode(',',$product['sizes']); foreach($sArray as $sizeString){ $s = explode(':',$sizeString); if($s[0] == $item['size']){ $available = $s[1]; } } ?> <tr> <td><?=$i;?></td> <td><?=$product['title'];?></td> <td><?=$product['price'];?> Ft.</td> <td> <button class="btn btn-default btn-ms" onclick="update_cart('removeone','<?=$product['id'];?>','<?=$item['size'];?>')">-</button> <?=$item['quantity'];?> db <?php if($item['quantity'] < $available): ?> <button class="btn btn-default btn-ms" onclick="update_cart('addone','<?=$product['id'];?>','<?=$item['size'];?>')">+</button> <?php else: ?> <span class="text-danger">Max.</span> <?php endif; ?> </td> <td><?=$item['size'];?></td> <td><?=$item['quantity'] * $product['price'];?> Ft.</td> </tr> <?php $i++; $item_count += $item['quantity']; $sub_total += ($product['price'] * $item['quantity']); $grand_total = $sub_total; ?> <?php } ?> </tbody> </table> <table class="table table-bordered table-condensed text-right"> <thead class="totals-table-header"><th>Összes termék</th><th>Végösszeg</th></thead> <tbody> <tr> <td><?=$item_count;?> db</td> <td><?=$grand_total;?> Ft.</td> </tr> </tbody> </table> <?php endif; ?> <button class="btn btn-primary"><span class="glyphicon glyphicon-shopping-cart"></span> Pénztár >>></button> <?php include 'includes/footer.php'; ?>
Mutasd a teljes hozzászólást!

  • Az $available-nek foreach-en belül adsz értéket, gondolom bizonyos esetekben a ciklusmagba be sem lép a kód, ekkor inicializálatlan marad a változó. Írasd ki a változó értékét, és nézd meg a ciklusban, hogy megfelelően be van-e állítva a változód.
    Mutasd a teljes hozzászólást!
  • Ja, ciklus és  azon belül még egy if is
    Mutasd a teljes hozzászólást!
  • Kicsit kezdő vagyok még php-ban, ha nem okoz túl sok gondot, meg tudnád mutatni mire gondolsz?
    Mutasd a teljes hozzászólást!
  • Itt nem kap értéket az $available, mert vagy a foreach-be nem lépsz be, vagy az if feltétele hamis.

    foreach($sArray as $sizeString){ $s = explode(':',$sizeString); if($s[0] == $item['size']){ $available = $s[1]; } }
    Mutasd a teljes hozzászólást!
  • Igen értem, hogy mi okozza feltehetően a problémát, köszi, hogy rávilágítottatok, csak azt nem tudom, hogy módosítsam :/
    Mutasd a teljes hozzászólást!
  • Nézd meg, hogy melyik változónak mi az értéke és mit akarsz kifejezni azzal, hogy valami "elérhető", aztán módosítsd a forráskódot ennek megfelelően.
    Mutasd a teljes hozzászólást!
  • Amúgy a furcsa az, hogy elvileg ennek működnie kéne. Mármint őszinte leszek, kosarat még sosem csináltam php-ban, csak egyszerűbb tartalomkezelő rendszereket (CRUD). Nemrégiben találtam rá egy youtube csatornára és ott találkoztam egy ecommerce tutorial-al.  A csávó elég érthetően és részletesen magyarázza a dolgokat miközben kódol, ezért is követem.

    11:38-nél kezdi el a számomra problémás rész írását. Furcsa mód neki működik hibátlanul. Láttam lentebb a kommenteknél, hogy másnak is előjött ez a probléma, viszont náluk csak gépelési hiba volt, ha minden igaz. 

    Linkelem a videót: PHP eCommerce 28
    Mutasd a teljes hozzászólást!
  • Egy kis debug - a if($cart_id !=''){ ... } után rakj egy ilyet:

    echo '<pre>'; var_dump($items); echo '</pre>';
    Be tudod másolni a kimenetét?
    Mutasd a teljes hozzászólást!
  • Aham, tessék:

    array(4) { [0]=> array(3) { ["id"]=> string(2) "50" ["size"]=> string(21) "Elsu0151 opció" ["quantity"]=> string(1) "7" } [1]=> array(3) { ["id"]=> string(2) "50" ["size"]=> string(21) "Elsu0151 opció" ["quantity"]=> string(1) "1" } [2]=> array(3) { ["id"]=> string(2) "48" ["size"]=> string(8) "Elsu0151" ["quantity"]=> string(1) "3" } [3]=> array(3) { ["id"]=> string(2) "50" ["size"]=> string(21) "Elsu0151 opció" ["quantity"]=> string(1) "1" } }
    Mutasd a teljes hozzászólást!
  • estate tábláról is tudsz készíteni egy screenshotot? Ahol az id 48 és 50.

    Valami a size-al nem kerek: 

    string(21) "Elsu0151 opció"

    ez 14-15 karakter - de ő 21-et ír. Kérdéses, hogy mi a többi 6-7 karakter amit nem látunk. Jobb klikk forráskód megtekintésénél van valamilyen extra karakter ami itt nem látszik? (mondjuk html tag)
    Mutasd a teljes hozzászólást!
  • ez elé a sor elé szúrd be:

    if($s[0] == $item['size']){ echo "*".$s[0]."*"; echo "*".$item['size']."*"; echo "<br>";
    így kiderül miért nem talál egyezést a sizes résznél.

    ugyanis Elsu0151 vagyis Első karaktereiben eltérések lehetnek.
    Mutasd a teljes hozzászólást!
  • Illetve utánanéznék, hogy valahol át van-e adva a teljes json string paraméterként és van-e valahol futtatva rajta stripslashes() - talán a sanitize() függvényben van ilyen is (nem néztem át a teljes sorozatot) - valószínűleg ott veszett el valahol az "ő" betű:

    $data = array("első"); var_dump($data); /* array(1) { [0]=> string(5) "első" } */ $json = json_encode($data); var_dump($json); /* string(13) "["els\u0151"]" */ $json = stripslashes($json); var_dump($json); /* string(12) "["elsu0151"]" */ $json = json_decode($json, true); var_dump($json); /* array(1) { [0]=> string(8) "elsu0151" } */
    Mutasd a teljes hozzászólást!
  • Megnezem majd ezeket csak mar nem vagyok gepkozelben. Amugy kiprobaltam, hogy az 
    if
    utan adtam neki egy 
    else{ $available = $s[0]; }
    sort. Ez megszuntette a hibauzenetet viszont nem eppen helyesen mukodik.
    Ha peldaul az egyik opcional, ami a size (pl legyen az "Elso opcio") van ugye 7 db termek beallitva es kivalasztok 6-ot a kosarba rakasnal, akkor 1 db szabad termek meg marad. Viszont a kosarban mellette a + gomb megszunik es a Max-ot rakja a helyere, mintha tobbet nem tudnek hozzaadni. De ugyan ez van, ha pl 4-et rakok a kosarba.
    Mutasd a teljes hozzászólást!
  • Valami a size-al nem kerek:

    Igen, ott lesz valahol a probléma. Próbaképpen ékezet nélküli opciókat írtam be a sizes részhez és úgy fest most rendeltetés szerűen működik.
    Mutasd a teljes hozzászólást!
  • utan adtam neki egy
    else

    Program egy eléggé vicces módot használ az éppen aktuális szín paraméter meghatározáshoz.
    Így az else rész berakás biztosan nem várt működést fog okozni nálad.

    Ciklusban kereséskor ha nincs egyezés, egy else ággal sose adj értéket egy $available változónak, mert így első találat esetén ha belép újból a ciklusba, az else miatt felülírja az előtte megtalált változódat.
    Természetesen ez csak magánvélemény, de egy körmönfont módszert próbál rád erőltetni az oktatóvideó.
    Oldd meg a karakterkódolást, majd utána térj vissza az elavult módszerek finomításához szerintem.

    Tégy fel egy opencart-ot, nézd meg ő  hogy tárolja az opciókat, paramétereket a termékekhez,
    kosárba rakást és rendelés tárolást is ellesheted belőle adatbázis szintjén.
    Mutasd a teljes hozzászólást!
  • Kicsit kezdő vagyok még php-ban

    Ez nem mentség arra, hogy összeba... másolsz egy szeméthalmot, amit kódnak titulálsz. Egy teljesen kezdőnek is képesnek kell lennie egy az aktuális tudásszintjének megfelelő, működő kódot írnia. Ha ez egy "Hello, World!" vagy egy lottószám generátor, akkor azt.

    Kezd az alapoknál, találj ki egyre nehezedő feladatokat és akkor sikerélményed is lesz, meg a tudásod is gyarapodni fog. A mai tudásoddal eszedbe ne jusson webáruházat írni!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd