Json_encode és foreach probléma

Json_encode és foreach probléma
2017-08-16T09:23:18+02:00
2017-08-16T21:27:12+02:00
2022-08-10T18:35:29+02:00
fav0r
Sziasztok!

Van egy "cart" táblám, amelynek az "items" oszlopában json_encoded stringeket tárolok. Ezeket próbálom dekódolni, loopolni és mint array megfogni. Ez működik is szépen, de csak addig, amíg a tárolt sorok különböző ID-t kapnak. Pl. [{"id":"56","size":"Kicsi","quantity":"1"},{"id":"53","size":"Nagy","quantity":"2"}]

Viszont, amikor az ID-k megegyeznek, a kimenetben mindig csak az egyik "itemet" kapom meg. [{"id":"53","size":"Közepes","quantity":"1"},{"id":"53","size":"Nagy","quantity":"2"}]

Csináltam egy kis debugot. Itt még megkapom mind a két tárolt Item-et (közepes és nagy),

$products = array();var_dump($items);
viszont az $x-nél már csak az egyiket (és csak akkor, ha egyeznek az ID-k)

$products[] = array_merge($x,$p);var_dump($x);
Az alábbi részletről lenne szó:

$txn_id = sanitize((int)$_GET['txn_id']); $txnQuery = $db->query("SELECT * FROM transactions_alternative WHERE id = '{$txn_id}'"); $txn = mysqli_fetch_assoc($txnQuery); $cart_id = $txn['cart_id']; $cartQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'"); $cart = mysqli_fetch_assoc($cartQ); $items = json_decode($cart['items'],true); $idArray = array(); $products = array();var_dump($items); foreach($items as $item){ $idArray[] = $item['id']; } $ids = implode(',',$idArray); $productQ = $db->query("SELECT i.id as 'id', i.title as 'title', c.id as 'cid', c.category as 'child', p.category as 'parent' FROM products i LEFT JOIN categories c ON i.categories = c.id LEFT JOIN categories p ON c.parent = p.id WHERE i.id IN ({$ids})"); while($p = mysqli_fetch_assoc($productQ)){ foreach($items as $item){ if($item['id'] == $p['id']){ $x = $item; continue; } } $products[] = array_merge($x,$p);var_dump($products); } ?> <h2 class="text-center">Rendelés részletei</h2> <div class="col-md-12"> <h3 class="text_center">Rendelt termékek</h3> <table class="table table-condensed table-bordered table-striped"> <thead> <th>Mennyiség</th><th>Név</th><th>Kategória</th><th>Méret</th> </thead> <tbody> <?php foreach($products as $product): ?> <tr> <td><?=$product['quantity'];?> db</td> <td><?=$product['title'];?></td> <td><?=$product['parent'].' / '.$product['child'];?></td> <td><?=$product['size'];?></td> </tr> <?php endforeach ?> </tbody> </table>
Mutasd a teljes hozzászólást!
... ... while($p = mysqli_fetch_assoc($productQ)){ $products[ $p["id"]] = $p; } ?> <h2 class="text-center">Rendelés részletei</h2> <div class="col-md-12"> <h3 class="text_center">Rendelt termékek</h3> <table class="table table-condensed table-bordered table-striped"> <thead> <th>id</th><th>Rendelt mennyiség</th><th>Termék neve</th><th>Kategória</th><th>Opció</th> </thead> <tbody> <?php foreach($items as $item): ?> <tr> <td><?=$item['id'];?></td> <td><?=$item['quantity'];?> db</td> <td><?=$products[$item['id']]['title'];?></td> <td><?=$p['parent'].' / '.$p['child'];?></td> <td><?=$item['size'];?></td> </tr> <?php endforeach; ?></tbody> </table>
Mutasd a teljes hozzászólást!

  • Az ID az egyedi azonosító, nem lehet belőle több!!!
    Megj: Lehetőleg az angol abc karakterével kezdődjön és lehet benne szám és kötőjel is => favOr_1, favOr_2, stb...
    Mutasd a teljes hozzászólást!
  • Értem én, hogy egyedi, de nem lehet ezt valahogy megkerülni?

    Egy angol fórumon ajánlották, hogy mivel felülírom az $x-et, próbáljam meg meg lecserélni így: 

    $x[] = $item;
    majd inicializálni a foreach loop előtt:
    $x = [];
    Ez annyiban segített, hogy most már az $x-nél is megkapom mind a két item-et, ha csinálok egy var_dump-ot

    $products[] = array_merge($x,$p);var_dump($x);
    Annyi a bibi ezzel, hogy ebben az esetben hibaüzenetet kapok: Undefined index: for quantity 
    és Undefined index: for size
    Mutasd a teljes hozzászólást!
  • Nem lenne logikusabb és célszerűbb átgondolni az ID-k generálását, hogy ne legyen belőlük azonos?
    De Te tudod mennyire akarod megbonyolítani a saját dolgod...
    Mutasd a teljes hozzászólást!
  • Dehogy akarom én bonyolítani az életem :) 
    A products ID-k megváltoztatására gondolsz?  

    Nem hiszem, hogy az segítene mivel, ha a kosárba egy termékből két különböző méretűt rakok (megvátoztatott ID vagy sem) a cart táblába, akkor is egy ID-hez (a termék ID-jéhez) fogja csatolni a mennyiség és méret opciókat, nem?
    Mutasd a teljes hozzászólást!
  • Bár nem tudom, hogy épülnek fel a tábláid, de ha egy termékhez (a kerekpar_markanev csak egyszer van a termék-táblában) több méret is lehet, akkor lehetnének egy külön táblába a méretek (és adatai) azonos "termék ID"-re hivatkozással és akkor ha egyezik egy "termék ID", akkor egy plusz lekérdezéssel / ciklussal jeleníted meg a méretek szerinti azonos termékeket, viszont a "termék ID"-t csak egyszer kérdezed le és jeleníted meg "hivatkozásként"...
    Pl:
    Kerékpár (ID_markanev):
        26-os (ID_26), egységár, szín, 1db, osszar
        28-as (ID_28). egységár, szín, 2 db, osszar
    Ha félreértettelek, akkor
    Mutasd a teljes hozzászólást!
  • Ha összetett kulcsokat akarsz használni (létező DB fogalom: nem egy mező egyedi, hanem néhány mező kombinációja), akkor ezt az összehasonlításodban is figyelembe kéne venni. 
    Nem látom át teljesen a design-odat, de valószínűleg az id-t és a cid-et kéne együtt nézned.
    Mutasd a teljes hozzászólást!
  • Igen, valahogy így fest. 
    Amúgy hülyéskedett a mobilnetem így magamtól próbáltam közben alakítgatni a dolgot a gépemen.

    Most annyival "jobb" a helyzet, hogy szépen kiír mindent ahogy kell, ami a json stringben van (még ha az ID ugyan az is) . A baj ugye ezzel csak az, hogy a "title"-re illetve a "parent + child+-ra nem kapok semmit. Valahogy a foreachon belül nem lehetne a termék táblát is meghívni? 

    <?php foreach($items as $item): ?>
    <tr>
    <td><?=$item['id'];?></td>
    <td><?=$item['quantity'];?> db</td>
    <td><?=$p['title'];?></td>
    <td><?=$p['parent'].' / '.$p['child'];?></td>
    <td><?=$item['size'];?></td>
    </tr>
    <?php endforeach; ?>

    $txn_id = sanitize((int)$_GET['txn_id']); $txnQuery = $db->query("SELECT * FROM transactions_alternative WHERE id = '{$txn_id}'"); $txn = mysqli_fetch_assoc($txnQuery); $cart_id = $txn['cart_id']; $cartQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'"); $cart = mysqli_fetch_assoc($cartQ); $items = json_decode($cart['items'],true); $idArray = array(); $products = array(); foreach($items as $item){ $idArray[] = $item['id']; } $ids = implode(',',$idArray); $productQ = $db->query("SELECT i.id as 'id', i.title as 'title', c.id as 'cid', c.category as 'child', p.category as 'parent' FROM products i LEFT JOIN categories c ON i.categories = c.id LEFT JOIN categories p ON c.parent = p.id WHERE i.id IN ({$ids})"); while($p = mysqli_fetch_assoc($productQ)){ } $products[] = $p; ?> <h2 class="text-center">Rendelés részletei</h2> <div class="col-md-12"> <h3 class="text_center">Rendelt termékek</h3> <table class="table table-condensed table-bordered table-striped"> <thead> <th>id</th><th>Rendelt mennyiség</th><th>Termék neve</th><th>Kategória</th><th>Opció</th> </thead> <tbody> <?php foreach($items as $item): ?> <tr> <td><?=$item['id'];?></td> <td><?=$item['quantity'];?> db</td> <td><?=$p['title'];?></td> <td><?=$p['parent'].' / '.$p['child'];?></td> <td><?=$item['size'];?></td> </tr> <?php endforeach; ?> </tbody> </table>
    Mutasd a teljes hozzászólást!
  • Felvetted p változót a products tömbbe, tehát kiíratásnál ne a p-re hivatkozz, hanema productsra.
    Mutasd a teljes hozzászólást!
  • <?php foreach($items as $item): ?> <tr> <td><?=$item['id'];?></td> <td><?=$item['quantity'];?> db</td> <td><?=$products['title'];?></td> <td><?=$p['parent'].' / '.$p['child'];?></td> <td><?=$item['size'];?></td> </tr> <?php endforeach; ?>
    Igen, próbáltam már csak ebben az esetben: Notice: Undefined index: title
    Mutasd a teljes hozzászólást!
  • amit a SELECT -ben nem kérsz le, nem fog szerepelni a tömbben.
    Mutasd a teljes hozzászólást!
  • while($p = mysqli_fetch_assoc($productQ)){ } $products[] = $p;

    while cikluson belül töltsd fel a $products tömböt.
    Mutasd a teljes hozzászólást!
  • Sajnos így sem találja a title-t

    $txn_id = sanitize((int)$_GET['txn_id']); $txnQuery = $db->query("SELECT * FROM transactions_alternative WHERE id = '{$txn_id}'"); $txn = mysqli_fetch_assoc($txnQuery); $cart_id = $txn['cart_id']; $cartQ = $db->query("SELECT * FROM cart WHERE id = '{$cart_id}'"); $cart = mysqli_fetch_assoc($cartQ); $items = json_decode($cart['items'],true); $idArray = array(); $products = array(); foreach($items as $item){ $idArray[] = $item['id']; } $ids = implode(',',$idArray); $productQ = $db->query("SELECT i.id as 'id', i.title as 'title', c.id as 'cid', c.category as 'child', p.category as 'parent' FROM products i LEFT JOIN categories c ON i.categories = c.id LEFT JOIN categories p ON c.parent = p.id WHERE i.id IN ({$ids})"); while($p = mysqli_fetch_assoc($productQ)){ $products[] = $p; } ?> <h2 class="text-center">Rendelés részletei</h2> <div class="col-md-12"> <h3 class="text_center">Rendelt termékek</h3> <table class="table table-condensed table-bordered table-striped"> <thead> <th>id</th><th>Rendelt mennyiség</th><th>Termék neve</th><th>Kategória</th><th>Opció</th> </thead> <tbody> <?php foreach($items as $item): ?> <tr> <td><?=$item['id'];?></td> <td><?=$item['quantity'];?> db</td> <td><?=$products['title'];?></td> <td><?=$p['parent'].' / '.$p['child'];?></td> <td><?=$item['size'];?></td> </tr> <?php endforeach; ?> </tbody> </table>
    Mutasd a teljes hozzászólást!
  • te egy tömböt feltöltesz $products néven.

    de annak tömb elemei lesznek, abban nem hivatkozhatsz így:

    $products['title']

    while-on belül esetleg indexeld a tömböt,

    $products[ $p["id"] ] = $p;
    és ahol kell elérheted így:

    $id = $item['id']; $products[$id]['title']
    Mutasd a teljes hozzászólást!
  • Még mindig nem találja :/ Na jó, ha nem túl nagy kérés meg tudnád mutatni az általam posztolt kódrészletben?
    Mutasd a teljes hozzászólást!
  • ... ... while($p = mysqli_fetch_assoc($productQ)){ $products[ $p["id"]] = $p; } ?> <h2 class="text-center">Rendelés részletei</h2> <div class="col-md-12"> <h3 class="text_center">Rendelt termékek</h3> <table class="table table-condensed table-bordered table-striped"> <thead> <th>id</th><th>Rendelt mennyiség</th><th>Termék neve</th><th>Kategória</th><th>Opció</th> </thead> <tbody> <?php foreach($items as $item): ?> <tr> <td><?=$item['id'];?></td> <td><?=$item['quantity'];?> db</td> <td><?=$products[$item['id']]['title'];?></td> <td><?=$p['parent'].' / '.$p['child'];?></td> <td><?=$item['size'];?></td> </tr> <?php endforeach; ?></tbody> </table>
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen, most már rendeltetés szerűen működik! Sokat segítettél!
    Mutasd a teljes hozzászólást!
  • El kéne azon gondolkodni hogyha ennyire nehézkes valamit lekérdezni, akkor érdemes lenne átgondolni hogy rossz esetleg a tábla struktúra és emellett a technika elavult amit a videóban láttál.
    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