ostoskorin sessionin tulostus taulukkoon?

sunnuntaikoodari

Heti alkuun kerrottakoon, etten osaa erikoisemmin koodata, joten tämä kirjoitus on valitettavan pitkä. Silti on mahdollista, että unohdan tästä jotain olennaisia tietoja.

Päätin siis kokeilla ihan mielenkiinnon vuoksi pienehkön verkkokaupan toteutusta. Alussa tarkoitus oli käyttää pelkästään yksisivuista lomaketta, jonka tiedot lähetetään sähköpostiin. Tuohan onnistui helposti jopa minulta. Sitten tulikin mieleen, että jospa onkin useita eri sivuja (esim. eri tuotetyypit omilla sivuillaan) ja kullakin sivulla vaikka 10 tuotetta. Tuollaisessa lomakkeen muuttujien käsittely tuntuu menevän hankalaksi, joten otin käyttöön lomakkeiden lisäksi sessiot. Sessioilla saan kyllä tallennettua tietoja esim. seuraavaan tapaan:
tuote1.php:


Tuossa siis ideana tallentaa kunkin tuotteen valitut ominaisuudet yhden muuttujan avulla sessioon. Sitten ostoskorissa on tarkoitus tulostaa korin (session) sisältö html-taulukkoon tällä periaatteella:
kori.php:


Tuossa on tietysti sellainen juttu, että kuhunkin soluun tulee pilkulla erotettuna yhden tuotteen kaikki tiedot tyyliin: tuote 1, musta , L ,2,320. Tämähän ei haittaa, koska tällöin kuitenkin kaikkien tuotteiden tiedot tulostuvat omille riveilleen ja saan rivin tiedot jaettua edelleen omiin soluihinsa näin:

$rivi1 = explode(",", $arvo[0]);

Seuraavaksi yritän tulostaa tiedot omiin soluihinsa:
foreach($rivi1 as $solu)
   {
   echo " $solu";
   }
Ongelmat alkavat tuossa vaiheessa. Saan taulukkoon vain yhden rivin, ja siinä on vain ostoskoriin viimeisimpänä lisätyn tuotteen tiedot - kuitenkin ihan oikein kukin tieto omassa solussaan. Olen kokeillut muuttaa $arvo:n indeksiä esim. $arvo[1], mutta ilman tulosta. Missähän menee pieleen?

Toinen ongelma on siinä kun yritän laskea kunkin ostoskorin rivin kokonaissummaa (määrä * hinta). En saa tuosta mitään tietoa ulos. Tämä lasku on yllä olevan koodinpätkän jälkeen näin:
$summa = $solu[3]*$solu[4];

Tuosta tulos on nolla. Kun katson mitä eri soluissa on, niin en vielä keksinyt mistä luvut tulevat:
solun 0 arvo: $solu[0] //tulostaa 1, html-taulukossa näkyy "tuote 1"
solun 1 arvo: $solu[1] //tulostaa 2 html-taulukossa näkyy "punainen"
solun 2 arvo: $solu[2] //tulostaa 0, html-taulukossa näkyy koko "L"
solun 3 arvo: $solu[3] //tulostaa tyhjän, html-taulukossa näkyy määrä "7"
solun 4 arvo: $solu[4] //tulostaa tyhjän, html-taulukossa näkyy hinta "120"

Olisko kellään ideoita mitä pitäisi tehdä toisin? Olisiko helpompaa ja järkevämpää esim. tehdä joku tiedosto, joka sisältää kaikki tuotteet listattuna, ja hakea siitä vaikka tuote-ID:n perusteella tuotteen perustiedot? Tavoitteena olisi siis saada jokaisen tuotteen jokainen tieto omaan soluunsa, jolloin saisin tehtyä helposti luettavissa olevan html-taulukon. Tietysti jos olisin perustamassa oikeasti verkkokauppaa, niin varmaankin ostaisin palvelun jostain, mutta näin harjoittelumielessä kiinnostaisi saada sessionit ja tulostukset toimimaan niin kuin haluan.

10

1140

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • juhakorkeapudas

      Missä kohdassa PHP sessio aloitetaan, entä lopetetaan? Aloittaminen on tärkeää koska muuten muuttujaa käsitellään kuten mitä tahansa muuttujaa => tallentuu vain viimeiseksi lisätty tuote. Jokaisella sivun alussa on siis oltava komento session_start().

      Sessionin poisto tehdään sitten omalla sivulla näin, jonka jälkeen voi olla uudelleenohjaus esim. palvelun etusivulle. Siitäkin voi tulla ongelmia, ellei sessiota poisteta.

      • sunnuntaikoodari

        "Kaupan" varsinaisella etusivulla on koodin ensimmäiset rivit näin:


        Tämän jälkeen alkaa html. Myös tuote1.php (ja muut tuotesivut) sekä ostoskorisivu alkavat koodilla:


        Vasta tuon jälkeen alkaa html-osuus. Millään sivuilla ei siis lähetetä mitään koodia ennen noita rivejä. Tarkoitus on siis, että ostoskorista tuotteet siirretään yhteystietojen täyttämisen jälkeen lomakkeen avulla esim. sähköpostilla tilauksen käsittelijälle.

        Ihmetystä minussa herättää tuo jälkimmäinen foreach-looppi, koska saan siitä tulostettua vain viimeisimpänä lisätyn tuotteen. En kyllä vielä tajua sitäkään miksi en saa tulostettua $solu[]-arvoja yksitellen haluamiini kohtiin (esim. $solu[0] johonkin, $solu[3] jonnekin muualle jne.). Tai siis saan tulostettua, mutta en ymmärrä niissä olevia arvoja, kuten aiemmassa viestissäni selostin. Vielä siis riittää opeteltavaa...


      • juhakorkeapudas
        sunnuntaikoodari kirjoitti:

        "Kaupan" varsinaisella etusivulla on koodin ensimmäiset rivit näin:


        Tämän jälkeen alkaa html. Myös tuote1.php (ja muut tuotesivut) sekä ostoskorisivu alkavat koodilla:


        Vasta tuon jälkeen alkaa html-osuus. Millään sivuilla ei siis lähetetä mitään koodia ennen noita rivejä. Tarkoitus on siis, että ostoskorista tuotteet siirretään yhteystietojen täyttämisen jälkeen lomakkeen avulla esim. sähköpostilla tilauksen käsittelijälle.

        Ihmetystä minussa herättää tuo jälkimmäinen foreach-looppi, koska saan siitä tulostettua vain viimeisimpänä lisätyn tuotteen. En kyllä vielä tajua sitäkään miksi en saa tulostettua $solu[]-arvoja yksitellen haluamiini kohtiin (esim. $solu[0] johonkin, $solu[3] jonnekin muualle jne.). Tai siis saan tulostettua, mutta en ymmärrä niissä olevia arvoja, kuten aiemmassa viestissäni selostin. Vielä siis riittää opeteltavaa...

        "Ihmetystä minussa herättää tuo jälkimmäinen foreach-looppi, koska saan siitä tulostettua vain viimeisimpänä lisätyn tuotteen."

        Koska asettamalla uuden tuotteen, korvaat taulukossa olevan edellisen tuotteen. Käytä tyhjiä hakasulkeita niin $_SESSION['ostoskori']tauluun luodaan uusi tietue:

        $_SESSION['ostoskori'][] = $kori.

        Miksi muuten ylipäätään käytät session['ostoskori'] taulussa (staattista) nimeä 'tuote1'? Se on turha ja aiheuttaa vain turhien sisäkkäisten silmukoiden tarvetta myöhemmässä koodissa.


        Koriin asetettua tuotetta ei ole tarpeen asettaa taulukkoon koska tiedot eivät ole taulukkomuodossa, joten kerää tiedot tav. muuttujaan:

        $kori = $tuote1 .",". $vari1 .",". $koko1 .",". $maara1 .",". $hinta1.


        Print_r komennolla saat tulostettua taulukon sisällön jolloni sen hahmottaminen on helpompaa. Sisäkkäisissä taulukoissa vaaditaan myös sisäkkäisten silmukoiden käyttöä, print_r(session['ostoskori']).

        Huom: Puolipisteet on jätetty pois koska foorumi ei oikein huoli niitä.


      • sunnuntaikoodari
        juhakorkeapudas kirjoitti:

        "Ihmetystä minussa herättää tuo jälkimmäinen foreach-looppi, koska saan siitä tulostettua vain viimeisimpänä lisätyn tuotteen."

        Koska asettamalla uuden tuotteen, korvaat taulukossa olevan edellisen tuotteen. Käytä tyhjiä hakasulkeita niin $_SESSION['ostoskori']tauluun luodaan uusi tietue:

        $_SESSION['ostoskori'][] = $kori.

        Miksi muuten ylipäätään käytät session['ostoskori'] taulussa (staattista) nimeä 'tuote1'? Se on turha ja aiheuttaa vain turhien sisäkkäisten silmukoiden tarvetta myöhemmässä koodissa.


        Koriin asetettua tuotetta ei ole tarpeen asettaa taulukkoon koska tiedot eivät ole taulukkomuodossa, joten kerää tiedot tav. muuttujaan:

        $kori = $tuote1 .",". $vari1 .",". $koko1 .",". $maara1 .",". $hinta1.


        Print_r komennolla saat tulostettua taulukon sisällön jolloni sen hahmottaminen on helpompaa. Sisäkkäisissä taulukoissa vaaditaan myös sisäkkäisten silmukoiden käyttöä, print_r(session['ostoskori']).

        Huom: Puolipisteet on jätetty pois koska foorumi ei oikein huoli niitä.

        Tein koodiin ehdottamasi muutokset. Tulostukset ovat samat kuin aiemmin, mutta ehkä jatkossa vältyn niiltä ylimääräisiltä sisäkkäisiltä silmukoilta. Laitan tähän malliksi mitä mistäkin ostoskori-sivun printtauksesta tulee ulos.
        KOODI 1:
        print_r ($_SESSION["ostoskori"])
        -> tulostaa:
        Array ( [0] => tuote 1, punainen , S ,1,320 [1] => tuote 2, keltainen , L ,4,120 )

        KOODI 2:
        //luetaan ostoskorin sisältö taulukon soluihin
        foreach($_SESSION["ostoskori"] as $key=>$arvo)
        {
        echo '
           
               '.$arvo.'
              
           '
           }
        -> tulostaa seuraavan:
           
               tuote 1, punainen , S ,1,320
              
           
           
               tuote 2, keltainen , L ,4,120
              
           
        Tuo tulostus on siis ihan ok.

        KOODI 3:
        $rivi1 = explode(",", $arvo)
           echo "
           
           
           tuotevärikokomäärähinta €rivi yht. €
           
           "
           foreach($rivi1 as $solu)
              {
              echo " $solu"
              }
           $summa = $solu[3]*$solu[4];
           echo "
           $summa
           "
        -> tulostaa:
           
              tuotevärikokomäärähinta €rivi yht. €
           
           
              tuote 2 keltainen L 4 120 0
           
        Joku tämän muuttujan asettelussa menee minulla nyt väärin. print_r($rivi1) tulostaa seuraavan:
        Array ( [0] => tuote 2 [1] => keltainen [2] => L [3] => 4 [4] => 120 )

        Jätin nyt puolipisteet vihjeestäsi pois, mutta koodissa ne kyllä ovat mukana.


      • sunnuntaikoodari
        sunnuntaikoodari kirjoitti:

        Tein koodiin ehdottamasi muutokset. Tulostukset ovat samat kuin aiemmin, mutta ehkä jatkossa vältyn niiltä ylimääräisiltä sisäkkäisiltä silmukoilta. Laitan tähän malliksi mitä mistäkin ostoskori-sivun printtauksesta tulee ulos.
        KOODI 1:
        print_r ($_SESSION["ostoskori"])
        -> tulostaa:
        Array ( [0] => tuote 1, punainen , S ,1,320 [1] => tuote 2, keltainen , L ,4,120 )

        KOODI 2:
        //luetaan ostoskorin sisältö taulukon soluihin
        foreach($_SESSION["ostoskori"] as $key=>$arvo)
        {
        echo '
           
               '.$arvo.'
              
           '
           }
        -> tulostaa seuraavan:
           
               tuote 1, punainen , S ,1,320
              
           
           
               tuote 2, keltainen , L ,4,120
              
           
        Tuo tulostus on siis ihan ok.

        KOODI 3:
        $rivi1 = explode(",", $arvo)
           echo "
           
           
           tuotevärikokomäärähinta €rivi yht. €
           
           "
           foreach($rivi1 as $solu)
              {
              echo " $solu"
              }
           $summa = $solu[3]*$solu[4];
           echo "
           $summa
           "
        -> tulostaa:
           
              tuotevärikokomäärähinta €rivi yht. €
           
           
              tuote 2 keltainen L 4 120 0
           
        Joku tämän muuttujan asettelussa menee minulla nyt väärin. print_r($rivi1) tulostaa seuraavan:
        Array ( [0] => tuote 2 [1] => keltainen [2] => L [3] => 4 [4] => 120 )

        Jätin nyt puolipisteet vihjeestäsi pois, mutta koodissa ne kyllä ovat mukana.

        No nyt sain toimimaan, kun tein vain pienen muutoksen. Nyt pääsen siis eteenpäin, joten kiitoksia paljon avusta. Tässä nyt sen html-taulukon tulostus, jos jotain muutakin kiinnostaa. Puuttuvat kohdat löytyvät tämän ketjun aiemmista viesteistä.


        tuotevärikokomäärähinta €rivi yht. €



        Luultavasti jotain kysyttävää vielä tulee, mutta tällä palstalla kuitenkin näyttää onneksi olevan päteviä neuvojia.


      • sunnuntaikoodari
        sunnuntaikoodari kirjoitti:

        No nyt sain toimimaan, kun tein vain pienen muutoksen. Nyt pääsen siis eteenpäin, joten kiitoksia paljon avusta. Tässä nyt sen html-taulukon tulostus, jos jotain muutakin kiinnostaa. Puuttuvat kohdat löytyvät tämän ketjun aiemmista viesteistä.


        tuotevärikokomäärähinta €rivi yht. €



        Luultavasti jotain kysyttävää vielä tulee, mutta tällä palstalla kuitenkin näyttää onneksi olevan päteviä neuvojia.

        No niin, nyt tuli seuraava ongelma. En näköjään keksi keinoa lähettää sessionista tulostettua taulukkoa sähköpostitse. Pitäisikö aiemmin lähettämääni koodia muokata jotenkin siten, että taulukko tulostettaisiin lomakkeena ja tuo lomake sitten vietäisiin sähköpostiin? Tuossa tulee kai ongelmaksi lomakkeen kenttien nimeäminen yksilöllisesti. Tuohon on varmasti joku näppärämpikin keino, mutta mikä?


      • höpöukki
        sunnuntaikoodari kirjoitti:

        No niin, nyt tuli seuraava ongelma. En näköjään keksi keinoa lähettää sessionista tulostettua taulukkoa sähköpostitse. Pitäisikö aiemmin lähettämääni koodia muokata jotenkin siten, että taulukko tulostettaisiin lomakkeena ja tuo lomake sitten vietäisiin sähköpostiin? Tuossa tulee kai ongelmaksi lomakkeen kenttien nimeäminen yksilöllisesti. Tuohon on varmasti joku näppärämpikin keino, mutta mikä?

        Hei, Käytätkö sähköpostin lähettämisessä php:n mail-funktiota vai jotain muuta?

        http://fi2.php.net/manual/en/function.mail.php

        eli $message muuttujaan vaikka foreach-silmukassa kokoat sopivan viestin sieltä sessiondatasta

        eli vaikkapa jotennii näin
        foreach($_SESSION['ostoskori'] as $key=>$value)
        {
        $message .= $value . "\r\n"
        }


      • sunnuntaikoodari
        höpöukki kirjoitti:

        Hei, Käytätkö sähköpostin lähettämisessä php:n mail-funktiota vai jotain muuta?

        http://fi2.php.net/manual/en/function.mail.php

        eli $message muuttujaan vaikka foreach-silmukassa kokoat sopivan viestin sieltä sessiondatasta

        eli vaikkapa jotennii näin
        foreach($_SESSION['ostoskori'] as $key=>$value)
        {
        $message .= $value . "\r\n"
        }

        Kiitoksia vinkistä. Käytän tosiaankin php:n omaa mail-funktiota lähetykseen. Sain session sisällön lähtemään sähköpostilla tekemällä koodiin pienen lisäyksen alkuun, tässä nykyinen purkkaviritykseni (vain alku, ilman puolipisteitä):


      • sunnuntaikoodari
        sunnuntaikoodari kirjoitti:

        Kiitoksia vinkistä. Käytän tosiaankin php:n omaa mail-funktiota lähetykseen. Sain session sisällön lähtemään sähköpostilla tekemällä koodiin pienen lisäyksen alkuun, tässä nykyinen purkkaviritykseni (vain alku, ilman puolipisteitä):

        Lisäsin sessioon pari uutta muuttujaa, jotta saisin kätevästi tulostettua ostoskori-sivulle tuotteen tietojen yhteyteen kuvan sekä kuvauksen. Nämä ovat siis kaksi eri muuttujaa ennen muita tuotteeseen liittyviä muuttujia. Tuotteen kuvaus on -tagien sisällä pienen kuvakkeen sisältäen, piilotettuna css:n avulla ns. tooltip-tyylisesti, eli viemällä hiiren kuvakkeen päälle aukeaa tekstilaatikko.

        Ongelma on siinä, että tulostettaessa tuotteen tietoja sähköpostiin, tulee sinne myös tuo kuvaus, vaikka haluan sen pois. print_r ($_SESSION["ostoskori"]) tulostaa tällaista:
        Array ( [0] => kuva*tuote*(tässä kohdassa span-tagien sisässä tuotteen kuvaus jonka haluan pois)* väri * koko *määrä*hinta

        Yritän tuloksetta poistaa tuon tekstin ennen kuittauksen lähettämistä seuraavalla keinolla:
        foreach($_SESSION["ostoskori"] as $key=>$arvo)
        {
           $muutettava = "*"
           $korvaus = ", "
           $arvo = str_replace($muutettava, $korvaus, $arvo) // muutetaan *-merkki pilkuksi ja välilyönniksi
           $poista = "/]*>(.*?)/i" // yritetään ottaa viestistä span-tagien sisältö pois
           preg_replace ($poista, $korvaus, $arvo)
           $meiliin .= $arvo . "\r\n \r\n"
           }

        Millähän konstilla tuon kohdan voi poistaa?

        Toinen päänvaivaa aiheuttava kohta: miten koodia pitäisi muokata, jos haluan mahdollistaa yksittäisen tuotteen poistamisen ostoskorista? Osaan toki tyhjentää session, mutta siinä menee sitten kaikki tuotteet kerralla.


      • sunnuntaikoodari
        sunnuntaikoodari kirjoitti:

        Lisäsin sessioon pari uutta muuttujaa, jotta saisin kätevästi tulostettua ostoskori-sivulle tuotteen tietojen yhteyteen kuvan sekä kuvauksen. Nämä ovat siis kaksi eri muuttujaa ennen muita tuotteeseen liittyviä muuttujia. Tuotteen kuvaus on -tagien sisällä pienen kuvakkeen sisältäen, piilotettuna css:n avulla ns. tooltip-tyylisesti, eli viemällä hiiren kuvakkeen päälle aukeaa tekstilaatikko.

        Ongelma on siinä, että tulostettaessa tuotteen tietoja sähköpostiin, tulee sinne myös tuo kuvaus, vaikka haluan sen pois. print_r ($_SESSION["ostoskori"]) tulostaa tällaista:
        Array ( [0] => kuva*tuote*(tässä kohdassa span-tagien sisässä tuotteen kuvaus jonka haluan pois)* väri * koko *määrä*hinta

        Yritän tuloksetta poistaa tuon tekstin ennen kuittauksen lähettämistä seuraavalla keinolla:
        foreach($_SESSION["ostoskori"] as $key=>$arvo)
        {
           $muutettava = "*"
           $korvaus = ", "
           $arvo = str_replace($muutettava, $korvaus, $arvo) // muutetaan *-merkki pilkuksi ja välilyönniksi
           $poista = "/]*>(.*?)/i" // yritetään ottaa viestistä span-tagien sisältö pois
           preg_replace ($poista, $korvaus, $arvo)
           $meiliin .= $arvo . "\r\n \r\n"
           }

        Millähän konstilla tuon kohdan voi poistaa?

        Toinen päänvaivaa aiheuttava kohta: miten koodia pitäisi muokata, jos haluan mahdollistaa yksittäisen tuotteen poistamisen ostoskorista? Osaan toki tyhjentää session, mutta siinä menee sitten kaikki tuotteet kerralla.

        span-tagien sisältö lähtikin yllättävän helposti. Jos jotain muutakin kiinnostaa, niin tällainen koodimuutos auttoi:
        foreach($_SESSION["ostoskori"] as $key=>$arvo)
        {
           $arvo = preg_replace ("/(.*?)/m", '', $arvo)
        .
        .
        .

        Osaisko joku antaa vinkkiä miten saisin tehtyä tuon yksittäisen tuotteen poistamisen korista? Itsellä tulee mieleen lähinnä jotain sellaista, että poistetaan koko session sisältö ja kirjoitetaan kaikki muut kuin poistettavat tuotteet takaisin sessioon. Käytännössä siis tulostettaisiin session sisältö lomakkeeseen, ja esim. checkboxilla valitaan mikä poistetaan tai jätetään. Se onkin sitten eri asia miten nykyisellä systeemillä saa täytettyä kyseisen lomakkeen.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Marin on ehkä maailman kaunein "Nelikymppinen"

      Marinin julkaisu on saanut yli 68 500 tykkäystä. Postauksen kommenttikentässä ylistetään paljon Marinin kauneutta, jota
      Maailman menoa
      414
      4252
    2. Vernu Vasunta

      On mahotonta miten marjanpoimijoita on kohdeltu! Eikö paremmalla kohtelulla olisi saanut paremman tuloksen?
      Suomussalmi
      137
      2851
    3. En kelpaa sinulle

      Varattuna - olen sinulle ongelma. Eroaminen vuoksesi voi olla turhaa, sillä me ei puhuta, kun olen varattu ja kumpikin v
      Ikävä
      130
      1978
    4. Taidat vanhempi nainen

      Haluta sen tien itsellesi. juokse vaan karkuun ! Pahentaa vaan asiaa.Pitäs toimia ihan toisin päin
      Ikävä
      73
      1370
    5. Olisi kiva tietää miksi pidät minusta?

      Miehelle kysymys :)
      Ikävä
      75
      1312
    6. Venäjä aikoo yksipuolisesti muuttaa rajalinjauksia Suomenlahden itäosassa

      Venäjä aikoo muuttaa rajalinjauksia Suomenlahden itäosassa Venäjän saarten eteläpuolella. Ylen jutussa kerrotaan mm.
      Maailman menoa
      174
      1278
    7. Voi nainen...

      Kun luovutit meistä liian aikaisin, just kun aloin oppimaan sinua. Jos oisin alussa jo lukenut aiheesta oisin voinut toi
      Ikävä
      51
      1272
    8. Hetkeäänkään miettimättä ottaisin sinut

      Mutta mitä mieltä miehesi siitä olisi?
      Ikävä
      73
      1231
    9. Naiselle kysymys

      Mitä oikein näet minussa?
      Ikävä
      53
      1041
    10. Suomi lähettää tarkkailijoita merialueelle

      Venäjä on ilmoittanut aikovansa ylittää Suomen merialueen rajat kysymättä lupaa kertomalla että Suomen merialueen raj
      Maailman menoa
      291
      970
    Aihe