Autor Zpráva
alhpadog
Profil *
Dobrý deň, riešim jeden veľmi jednoduchý košík, všetko v podstate funguje až na odstránenie vecí z košíka.

Štruktúra pola, ktoré vytváram je pri viacerých tovaroch takáto (jedná sa teda o pole v poli):

    [kosik] => Array
      (
          [0] => Array
          (
                  [id] => 1
                  [ks] => 2
          )
          [1] => Array
          (
                  [id] => 12
                  [ks] => 5
          )    
          [2] => Array
          (
                  [id] => 15
                  [ks] => 5
          )                
      )



S poľom sa dá pracovať bez problémov, až na prípad ak chcem odstrániť z košíka záznam 1 z poľa. V takom prípade my síce dáta odstráni, ale samotný klúč ostane. Nie je to až taký problém ale zdá sa m to nepraktické. Je možné tie polia nejako automaticky "prečíslovať" bez toho aby som to musel prechádzať cyklom (do toho sa mi príliš nechce)? Prechádzal som v manuály funkcie na prácu z poľom ale nič také čo by ma zaujalo som nenašiel. Preto sa pýtam či Ste sa s tým náhodou niekto nestretol, resp. či niekto nepoznáte nejaké elegantné riešenie? Ďakujem za nápady.
nightfish
Profil
nebylo by lepší pole indexovat pomocí "id" položky?

   [kosik] => Array
      (
          [1] => Array
          (
                  [ks] => 2
          )
          [12] => Array
          (
                  [ks] => 5
          )    
          [15] => Array
          (
                  [ks] => 5
          )                
      )
alhpadog
Profil *
Pôsobí to na prvý pohľad logickejšie ale čo sa týka práce v tom nevidím žiadny rozdiel, resp. môj problém to nevyrieši.

unset($_SESSION['kosik'][$which];  //pričom which predstavuje záznam ktorý chcem z košíka odstrániť.


alebo

unset($_SESSION['kosik'][$id];  //pričom id predstavuje to iste


výsledok je stále taký istý, v session kosik ostáva (v prípade že odstanujem 12):

   [kosik] => Array
      (
          [1] => Array
          (
                  [ks] => 2
          )
          [12] => Array
          (
                  [ks] => 
          )    
          [15] => Array
          (
                  [ks] => 5
          )                
      )


resp.

    [kosik] => Array
      (
          [0] => Array
          (
                  [id] => 1
                  [ks] => 2
          )
          [1] => Array
          (
                  [id] => 
                  [ks] => 
          )    
          [2] => Array
          (
                  [id] => 15
                  [ks] => 5
          )                
      )


Resp. položím otázku inak je takéto chovanie sa pola / session normálne? Pokiaľ niečo unsetnem tak by to tam predsa nemalo vôbec byť.

Inak Ďakujem za reakciu a čo sa týka tých polí pravdepodobne to prerobím podľa Vašeho návrhu.
alhpadog
Profil *
* pardon v unsete som zabudol ), však v skripte samozrejme mám :)
perun
Profil
Zaujímavé... skús takto:

$_SESSION['kosik'][$id] = null;
unset($_SESSION['kosik'][$id]);
Leo
Profil
Nemate zapnute register_globals? Pak je někdy potřeba unsetovat i odpovidajici globalni promenou, Leo
alhpadog
Profil *
Ďakujem za nápad, ale nepomohlo to.
alhpadog
Profil *
add Leo: testujem to na hostingu, kde je nastavené register_globals = On, skúsim sa na to pozrieť Ďakujem .
Leo
Profil
Kdysi jsem s tím zápasil a myslím, že ta skrčka musela být nějak takhle:

$kosik_id = $_SESSION['kosik'][$id];
unset($kosik_id);
unset($_SESSION['kosik'][$id]);

bez zaruky.
Majkl578
Profil
[#9] Leo
???
Vytvoříš novou proměnnou a vzápětí ji smažeš?
perun
Profil
Veľmi divné je, že ti zruší hodnoty iného poľa, ako rušíš ty. Unset sa takto nespráva. V prípade, že do toho šibrinkuje register_globals, tak ten môj nápad by to vyriešil. Osobne to vidím na nejakú inú chybu v kóde.

Tie ukážky na unset, čo nám dávaš, sú vystrihnuté z reálnej aplikácie?

Vyskúšaj si
var_dump($kosik);


pred tým, než urobíš unset a potom.
alhpadog
Profil *
to Perun: áno, ukážky sú z reálne fungujúcej aplikácie, kde by sa akákoľvek chyba prejavila (vylúčiť to samozrejme nemôžem, ale nezdá sa mi že by tam nejaká bola). Druhá vec ktorá je naprosto udivujúca (aspoň pre mňa) je to že ruší vždy to čo chcem až nato že to robí nejako veľmo zvláštne. Nezruší celý klúč a teda záznam z prvého pola ale len to čo v tom zázname je a klúč v ramci prvého pola ostáva. Skúšal som aj dump..

Jediná vec ktorá ma napáda je že by bol problém v "materskej aplikácia" jedna sa totiž o modul do Joomla CMSka. Nadruhú stranu, tento problém viem vyriešiť aj inak. Išlo mi len o to že som chcel vedieť aký tam môže byť problém.
perun
Profil
alhpadog:
reálne fungujúcej aplikácie, kde by sa akákoľvek chyba prejavila

Na ostrom serveri pravdepodobne bude nastavený iný error_reporting a možno aj celkom vypnuté hlásenia chýb. Takže na ňom problém nemusíš vôbec odhaliť.

Tie dumpové výpisy, ktoré si nám poslal, sú urobené hneď po tom unsete? (Ako bezprostredne nasledujúci príkaz?)
alhpadog
Profil *
ano.. ten skript je dlhý a sú tam aj nejaké overovania dát, zjednodušene to vyzerá takto:

switch($action)
    {        
        case "clearBasket":
        $controller->clearBasket($which);
        break;

        case "submitBasket":
        $controller->submitBasket();
        break;

        ....atd.....
    }


funkcia clearBasket

function clearBasket($id)
{
      print_r($_SESSION);  //tu bolo aj dumpovanie
      unset($_SESSION['kosik'][$id]; 
      print_r($_SESSION);  //tu bolo aj dumpovanie
}
perun
Profil
alhpadog:
function clearBasket($id)
{
print_r($_SESSION); //tu bolo aj dumpovanie
unset($_SESSION['kosik'][$id];
print_r($_SESSION); //tu bolo aj dumpovanie
}

Opäť Ti chýba ukončovacia zátvorka...

Čo sa chyby týka, neviem. Vzdávam to. problém bude niekde v kóde, do ktorého nevidím. Máš zapnuté register_globals, myslím, že niekde je problém s referenciami. Ale neviem kde, musel by som mať viac kódu k dispozícii. Ak môžeš, vypni register_globals. Aj tak je to dosť závažná bezpečnostná chyba.
Leo
Profil
[#10] Majkl578

"Vytvoříš novou proměnnou a vzápětí ji smažeš?"

Přesně tak. Neptejte se proč, byla to starší verze PHP s register_globals On, dnes si je nechávám vypínat.

Leo
alhpadog
Profil *
to perun: tu zatvorku tam samozrejme mám, nedopatrenie pri odmazavanie komentaru zo skriptu pri unsete

to all: Ďakujem za pomoc a ochotu. Z register_globals on to funguje normálne (takže ostanú zapnuté) + vyriešil som to aj trošku inak, tzv. statusom dáta v košíku ostávajú len v

          [12] => Array
          (
                  [ks] => 1
                  [status] => 0 
                  /*
                  0 vypnute
                  1 zapnute 
                  */
          )
          

V košíku sa vypnuté dáta zobrazujú odlíšené a dajú sa opätovne obnoviť, pokiaľ ale chce zákazník košík potvrdiť nepracuje sa s nimi.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0