Sessiot - Demo 6

Harjoitellaan sessioiden käyttöä WWW-sovelluksen tekemisessä. Toteutaan ensin yksinkertainen lomake, joka laskee lukuja yhteen. Toteutetaan sen jälkeen WWW-pohjainen ostoskori.

Laskuri

Laskuri

  1. Luo aluksi normaali XHTML-sivu PHP:lla. Tallenna sivu V-asemalle tai peopleen.
  2. Tallenna uusin versio formcontrol.php:sta samaan hakemistoon.
  3. Ota formcontrol.php käyttöön require-komennolla. Ohjeet luokat käyttöön löytyvät luennolta 10.
  4. Luo sivun alussa uusi tekstilaatikko, jonka otsikkona on Anna luku ja name-ominaisuudessa luku.
  5. Tee body-osaan lomake, jonka action-attribuutissa on $_SERVER['PHP_SELF']. Lisää lomakkeelle olion avulla luotu tekstilaatikko ja submit-painike.
  6. Tee uusi funktio, joka testaa onko tekstilaatikon arvoksi syötetty tieto numero (is_numeric). Aseta se tekstilaatikon tarkistusfunktioksi. Laita virheentulostus päälle. Määrää tekstilaatikko hakemaan arvonsa $_REQUEST-muuttujasta. Kokeile lomakkeen toimintaa.
  7. Summan tuloksen säilyttämiseksi tarvitaan sessiomuuttujaa. Lisää lomakkeen alkuun require-funktion jälkeen komento session_start(). Määrää sessiomuuttujan alkuarvoksi 0.
    $_SESSION["summa"] = 0;
    Tulosta sessiomuuttujan arvo body-osassa.
  8. Tarkista onko sessiomuuttujaa summa asetettu (isset).
    • Jos ei ole niin silloin voidaan laittaa alkuarvo nolla, kuten yllä.
    • Jos on, niin tarkista onko tekstilaatikko validi (is_valid).
      • Jos arvo oli numero, niin lisää se sessiomuuttujaan summa.
  9. Nyt edellinen syötetty numero tulee valmiiksi tekstilaatikkoon. Poista tämä asettamalla summausten jälkeen tekstilaatikon arvoksi tyhjän (set_value).
  10. Testauksessa kannattaa käyttää Web Developer Toolbarista löytyvää valintaa Cookies | Clear Session Cookies. Näin pääset laskurin alkutilaan.

Ostoskori

Toteutussuunnitelma ostoskorille:

  1. Toteutetaan tuotetaulukko, josta voi lisätä linkkiä klikkaamalla tuotteita koriin.
  2. Tehdään ostoskori-sivu, joka tallentaa lisätyt tuotteet sessiomuuttujiin ja osaa tulostaa ne.
  3. Laajennetaan ostoskoria siten, että voidaan poistaa tuotteita tai muuttaa niiden määriä.

Tuotetaulukko

Toteutaan ensin tuotetaulukko, josta voi lisätä tuotteita ostoskoriin.

Lisäys

  1. Luo uusi PHP-tiedosto tuoteluettelo.php, johon lisäät tuotevaihtoehdot taulukkona. Esim.
    <?php
    $tuotteet = array("Omena", "Banaani", "Appelsiini", "Kiwi");
    ?>
  2. Tee toinen normaali PHP-sivu, johon liität require-komennolla tuotteet-taulukon.
  3. Lisää alkuun kutsu session_start()-funktioon niin, että sessiomuuttujat saadaan käyttöön. Toistaiseksi tällä sivulla emme tarvitse sessiomuuttujia, mutta määritys on tarpeen sessiomuuttujien säilymisen kannalta.
  4. Tee body-osaan foreach-silmukka, joka tulostaa taulukon kaikki vaihtoehdot XHTML-taulukkona. Kukin tuote tulee omalle rivilleen.
  5. Lisää silmukan sisällä olevaan tulostukseen toinen td-elementti, jonka sisään linkki ostoskoriin:
    <a href=\"ostoskori.php?$tuote=1\">Lisää ostoskoriin</a>

    Huom! People-palvelimella ei tarvitse välttämättä olla .php-päätettä ollenkaan. Tuotteen nimessä ei saa olla välilyöntejä, sillä nämä muuttuvat $_REQUEST-taulukossa alaviivoiksi ja aiheuttavat url-enkoodamattomana ongelmia linkeissä.

Ostoskori

  1. Tee uusi PHP-tiedosto ostoskori.php. Lisää alkuun require-komennolla tuoteluettelo.php.
  2. Lisää alkuun session_start(), että sessiomuuttujat saadaan käyttöön.
  3. Lisätään sessiomuuttujaan lisätyn tuotteen määrä. Käy läpi kaikki tuotteet foreach-silmukassa. Tutki onko $_REQUEST-muuttujassa määritelty kierroksella määritelty tuote ja jos on, niin
    • Tutki onko vastaavan nimistä sessiomuuttujaa asetettu
      • Jos sessiomuuttuja on asetettu, niin lisää $_REQUEST-muuttujasta kyseisen tuotteen määrä samannimiseen sessiomuuttujaan.
      • Jos sessiomuuttujaa ei ole vielä asetettu, niin alusta samanniminen sessiomuuttuja $_REQUEST-muuttujasta saadulla arvolla. Esim.
        $_SESSION[$tuote] = $_REQUEST[$tuote];
  4. Lisää body-osan alkuun linkki tuotteet-sivulle.
  5. Tulostetaan XHTML-taulukko, jossa on lisätyt tuotteet ja niiden määrä. Käy body-osassa läpi kaikki tuotteet foreach-silmukalla. Tarkista onko kyseisen niminen sessiomuuttuja asetettu. Jos on, niin tulosta XHTML-taulukon rivi, jossa on ensimmäisessä solussa tuotteen nimi ja toisessa tuotteen määrä.

Ostoskorin muokkaaminen

Muuttaminen

  1. Lisää ihan ostoskori-skriptin alkuun require-komennolla käyttöösi formcontrol.php:n lomake-elementit. Määrityksen on tultava ennemmin session_start() -komentoa tai muuten olioita ei voidaan tallentaa sessioon.
  2. Muokkaa tietyn tuotteen sessiomuuttujan alustamista siten, että luot sessiomuuttujaan CText-tyyppisen olion, jonka oletusarvona on $_REQUEST:ista tullut luku. Tekstilaatikon nimenä ja otsikkona on tuotteen nimi. Esim.
    $_SESSION[$tuote] = new CText($tuote,$_REQUEST[$tuote],$tuote, 3);
  3. Muokkaa arvon lisäystä siten, että ensin haet sessiomuuttujasta (= CText-tyyppinen olio) nykyisen arvon (get_value()). Lisää tähän arvoon $_REQUEST-muuttujasta tullut luku. Aseta yhteenlaskettu arvo olion uudeksi arvoksi (set_value()).
  4. Lisää body-osaan lomake (form-elementti), joka viittaa ostoskoriin ($_SERVER['PHP_SELF'])
  5. Muokkaa body-osassa olevaa silmukkaa siten, että nyt tulostetaankin pelkästään olio (ja samalla sen label).
    echo "<tr><td>",$_SESSION[$tuote],"</td></tr>";
  6. Lisää submit-painike ja aseta tämän name-ominaisuudeen arvo muuta.
  7. Kokeile toimiiko tuotteiden lisääminen tuote-sivujen kautta. Miksi CText-olion ei tarvitse kutsua set_from_request()-metodia saadakseen järkevän arvon? Kokeile mitä tapahtuu kun painat ostoskorissa muuta-painiketta. Miksi näin käy?
  8. Ongelmana on erottaa onko tarkoitus lisätä tuote vai muuttaa tuotteen määrä. Lisää ennen sessiomuuttujan olemassaolon kyselyä if-lause, jossa tarkistat onko $_REQUEST["muuta"] asetettu.
    • Jos on asetettu, niin aseta sessiomuuttujaan (olio) arvo suoraan lomakkeelta saaduista tiedoista (set_from_request()).
    • Jos ei ole asetettu, niin sitten voidaan lisätä arvo tai luoda uusi sessiomuuttuja (edellinen if-else toisen else-osan sisälle).

Ostoskorista poistaminen

Muuta ja poista

  1. Lisää body-osaan ennen tuotteen tulostusta uuden CCheckboxin luonti. Anna name-ominaisuuteen poista ja valueen tuotteen nimi. Otsikkona voi olla teksti Poista.
  2. Aseta tekstilaatikon arvo $_REQUEST-muuttujasta (set_from_request())
  3. Tarkista onko laatikko valittuna (is_checked())
    • Jos on valittu, niin poista kyseinen sessiomuuttuja (unset).
    • Muutoin voi tulostaa tuotteen (olio) ja checkbox-laatikon.
  4. Kokeile poistamista.

Ostoskori ilman evästeitä

Normaalissa tapauksessa sessiotunniste välitetään evästeiden avulla. Evästeitä ei välttämättä ole kuitenkaan käytössä kaikissa selaimissa, joten tunniste pitää välittää linkeissä tai lomakkeen piilokenttänä.

  1. Siirrä demo-sivusi peopleen elleivät ne ole jo siellä.
  2. Valitse Web Developer Toolbarista valinta Cookie | Clear Session Cookies. Estä tämän jälkeen Mozilla Firefoxin asetuksista evästeiden käyttö valinnalla Tools | Options | Privacy | Cookies | Exceptions. Kirjoita people.cc.jyu.fi ja napauta Block.

    Poikkeukset

  3. Kokeile muutamaan kertaan lisätä samaa tuotetta koriin. Kokeile muuttaa tuotteen määrää.
  4. Lisätään sessiotunnisteen välitys lomakkeelle. Lisää demotehtävähakemisoon .htaccess-tiedosto ja lisää siihen rivit
    php_value display_errors on
    php_value session.use_trans_sid 1
    php_value url_rewriter.tags "a=href,area=href,frame=src,input=src,fieldset=fakeentry"
    php_value arg_separator.output  &amp;
    
  5. Lisää lomakkeeseen vielä fieldset lomake-elementtien ympärille ellet ole jo sellaista tehnyt. Sessiotunniste tulee automaattisesti tämän sisälle.
  6. Lisää vielä tuotteet.php:n linkkeihin sessiotunniste:
    <a href=\"ostoskori.php?$tuote=1&amp;".strip_tags(SID)."\">Lisää ostoskoriin</a>

    Sessiotunniste ei tule automaattisesti dynaamisiin linkkeihin.

  7. Nyt lomakkeen pitäisi toimia ilman evästeitäkin. Mitä tietoturvaongelmia tällaisessa sessiotunnisteen välittämisessä kuitenkin on? Poista Firefoxin asetuksista evästeiden estäminen people.cc.jyu.fi:ssä.

Tuotteiden määrä selauksessa

Määrät tuote-sivulla

  1. Lisää vielä tuotteet-sivulle montako kappaletta kutakin tuotetta on lisätty ostoskoriin. Tarvitset formcontrol.php-luokan määrityksiä, lisää require-komento ennen session_start()-funktiota.
  2. Kokeile vielä muuttaa tuotteiden määrää tuoteluettelo.php:ta muokkaamalla.
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/demot/demo6/
© Jukka Mäntylä (jmantyla@mit.jyu.fi)< http://www.iki.fi/jmantyla/>
2006-03-31 14:32:19