Teen ostoskoria. Omalla koneellani on PHP 5.0.4. ja int2000:lla 4.3.10. Kun kokeilen koodia omalla koneellani, se toimii hyvin, mutta kun uploadaan sen int2000:n palvelimelle, sille tulee oma tahto.
Kun klikkaan ensimmäisen tuotteen koriin - urlinn tulee ?id=1 (tms. riippuen tuotteen id:stä). Se tulostuu aivan oikein. Sitten kun lisään toisen tuotteen, yhtäkkiä ensin lisätyn tuotteen lukumäärä onkin neljä?
Sitten kun vielä lisään kolmannen tuotteen, toisen tuotteen lukumääräksi tulee 0?
Apua arvostetaan huimasti. Tällä olisi nimittäin kiire. Tässä koodi kriittisiltä osin:
<? session_start(); if(isset($_GET["id"])){ $_GET["id"] = intval($_GET["id"]); handlecart(); } function handlecart(){ if(!isset($_SESSION["tuotteet"][0])){ #Lisätään tuote $_SESSION["tuotteet"][0] = $_GET["id"]; #1 kpl $_SESSION["maara"][0] = 1; #Läksitään pois return(0); } else{ for($i = 0;$i<count($_SESSION["tuotteet"]);$i++){ #Jos nykyisen rivin id $_GET[id] niin lisää yksi if($_SESSION["tuotteet"][$i] == $_GET['id']) { $_SESSION["maara"][$i] = $_SESSION["maara"][$i] + 1; #Pois return(0); } } $_SESSION["maara"][count($_SESSION["tuotteet"])] = 1; $_SESSION["tuotteet"][count($_SESSION["tuotteet"])] = $_GET['id']; } } ?>
$_SESSION["maara"][count($_SESSION["tuotteet"])] = 1; $_SESSION["tuotteet"][count($_SESSION["tuotteet"])] = $_GET['id'];
Tuon pitäisi varmaankin olla:
$_SESSION["maara"][count($_SESSION["tuotteet"])-1] = 1; $_SESSION["tuotteet"][count($_SESSION["tuotteet"])-1] = $_GET['id'];
Silloinhan uusi tuote menisi viimeisen päälle?
Jos arrayssa olisi vaikka 5 alkiota, 0-4, count olisi 5 ja kuudes tuote lisättäisiin indeksiin 5 eli aivan oikein se on.
Jos tuon muuttaa siten, kuten neuvoit, koriin mahtuu vain kaksi tuotetta, sillä uusi lisätään jälkimmäisen päälle. Ja ensimmäinen tuote muuttuu yhä neljäksi?
Olenko minä vain tyhmä vai näyttääkö tuo koodi täysin toimivalta? En kyllä keksi minkä ihmeen vuoksi se bugaa. Sessionin arvoja ei sörkitä muualla. Olisiko php.ini konffattu väärin tjsp.?
Alan olla aika epätoivoinen, sillä tällä alkaa olla kiire ja olen tätä kohta viikon metsästänyt.
Muutama epäilytys tuossa koodissa kyllä on:
1) Globaaleista ainoastaan $_SESSION ja $_COOKIES on tarkoitettu readwrite-moodiin, muita pitäisi käsitellä readonlyna
2) Kulkeutuuko $_GET varmasti funktiolle asti? Turvallisempi tapa olisi function handlecart($id) ja $id = intval($_GET['id']);
3) miksi tehdä vaikeita luuppeja yms. kun tuotteen id on kuitenkin uniikki? Että vältät arrayn muotoa [1] [3] [107] aiheuttamat ongelmat, latase eteen kirjain (esim. ['x_1'] ['x_3'] ['x_107']) ja elämä helpottuu.
Nyt kyllä vihastuttaa. Oli sen verran hölmö virhe. Olin käyttänyt muuttujaa $maara koodissa, koska oletin int2000:lla register_globalsin olevan pois päältä, muttei se ollutkaan. Ja minä sitä viikon päivät mietin pääni puhki.
No, näin sitä opitaan paremmiksi ohjelmoijiksi. Tuli hypittyä katossa kun ongelma ratkesi ja nyt on hyvä olo :)
leftover: Kiitos hyvistä neuvoista. Tiesin kyllä, että $_GET on readonly, mutta minkä sitä pinttyneille tavoilleen voi...
Aihe on jo aika vanha, joten et voi enää vastata siihen.