Mitenkä voisi POST:lla hoitaa tälläisen tilanteen arvojen välityksen. Kuvitellaan vaikka, että nämä arvot on $login ja $pass.
Tilanne:
login.php ->
menu.php (täällä on monta eri reittiä mihin voidaan lähtä) ->
(tähän asti tietojen välitys onnistuu, eli tiedot on menu.php:ssä otettu vastaan)
vaihtoehto1.php tai vaihtoehto2.php ->
loppu.php
Eli tuo menu.php:n jälkeen oleva risteys tuottaa ongelmia. Mitenkä arvot pystyisi lähettämään jompaan kumpaan tiedostoon? POST:llahan ei pysty formin tietoihin määrittämään kuin yhden tiedoston johon formin arvot viedään. Sama ongelma tulee vastaan jos yhdestä php tiedostosta haluttaisiin siirtyä joko eteen- tai taaksepäin.
Pelkistetty koodi:
// login.php <? <form action="menu.php" method="post"> $login input boxista $pass input boxista <input type='submit'> </form> ?> // menu.php <? <form action="kumpaa_painettiin.php" method="post"> Otetaan vastaan login ja pass piilokenttiin... Hirveesti kenttiä täällä... Lähetetään kenttien tiedot eteenpäin postilla. <input type='submit' name='valinta' value='vaihtoehto1'> <input type='submit' name='valinta' value='vaihtoehto2'> </form> ?> // kumpaa_painettiin.php <? Jos vaihtoehto1 niin pitäs postia tiedot vaihtoehto1.php MuttaJos vaihtoehto2 niin pitäs postia tiedot vaihtoehto2.php Tänne kusahtaa postit kun ei täällä ole mitään nappia millä postia. Tämä vaan tutkii kumpaa nappia painettiin. ?> // vaihtoehto1.php <? <form action="loppu.php" method="post"> Otetaan vastaan postit Kaikkee tietoo... <input type='submit'> </form> ?>
(Mod. edit. kooditagit!)
Mikset voisi laittaa sellaista kuin vaihtoehto.php, joka sisältää kummatkin vaihtoehdot? Säästyisit hypyttämästä käyttäjää pitkin ja poikin ja saisit postisi kulkemaan suoraan.
Entäpä tämä taaksepäin liikkuminen sitten, jos jokaisessa tiedostossa on next ja back nappulat. Miten ihmeessä arvot saa takaisinpäin kulkemaan?
Jotenkin tunnostaa vaikealta tuo kun on vain yksi tiedosto jonne aina lähetetään formin arvot. Pitäisi saada vaikka tuolta loppu.php:stä tuotua login ja pass takaisin jompaan kumpaan vaihtoehtoon mistä sinne tultiin.
Sessioilla tuo varmaan olisi kovinkin helppo kun ei tarvitse postia tietoja, mutta tässä tapauksessa sessioita ei voi käyttää. :I
Takaisinpäin? Voisitko tarkentaa, mitä tarkoitat tuolla takaisinpäin?
Jos vaikka ensin mennään login -> menu -> vaihtoehto1, niin pitäisi samaa reittiä päästä takaisin menuun. Jokaisella sivulla on eteen- ja taakse -napit. Eteen-napilla se aina postilla viskoo arvoja seuraavalle formille. Miten sen saisi viskomaan Taakse-napilla edelliselle formille?
Ensilukemalla tuntuu, että menisi näinkin yksinkertaisella, kuin laittaa siihen taakse-nappiin samalla periaatteella kuin eteen-nappiin niiden lomakkeiden välitys, eli jotain
Hmm... voisi muuten tehdä piiloformin jonka kentissä on salasanat/passut ja pistää Taakse-napin submit-napiksi siihen. Sitten olisi aina yhdellä sivulla kaksi formia: toisen arvot seuraavalle sivulle meneviksi ja toisen piiloformin arvot edelliselle sivulle. :o
Oikeastaan muuta ei tarvitsekaan siirtää taaksepäin siirryttäessä kuin tunnukset. Niillä voi sitten hakea/kirjoittaa tietokantaan.
Vähän aiheesta ulkona, mutta tärkeää kuitenkin:
Mihin tahansa HTML-elementteihin ei saa ainakaan turvallisuutta vaativissa sovelluksissa laittaa mitään tärkeää tai vähemmän tarkeää tietoa attribuutteina. Varsinkin nuo hidden fieldit ovat javascript-injektiota käyttävälle herkkupaloja: ajatellaan, ettei niitä nähdä, mutta nähdään kumminkin. Ajatellaanpa tilannetta:
Sinulla on nettisivut, jossa on itsetoteutettu foorumi. Tarjoat siellä käyttäjälle mahdollisuuden poistaa ja muokata alle tietyn ikäisen viestin (kuten täällä putkassa). Jos olet käyttänyt hidden fieldiä, mikä olisi varmasti varsin mukava ja helppo tässä tapauksessa, se olisi varmaan näin:
<input type="hidden" name="piilokentta" value="viestin_id"/>
Vaikka tuo poisto/muokkaussysteemi olisi tarkistettu, niin ettei aivan helposti kuka vain pääse muokkaamaan toisen viestiä, voisi tuon arvon viestin_id muuttaa yksinkertaisella javascript-injektiolla:
javascript:void(document.forms[0].piilokentta.value="toisen_viestin_id");
Tuo kun osoiteriville.
Ja tuossa voisi olla minkä tahansa viestin tunnus, ensimmäisestä viimeiseen. Siinä olisi mukavaa varmasti jollain tuhota kaikki viestiti, jos laittaisi esim. for() silmukkaan tuon ja viesti-id:n 0:sta yllöspäin, ellei sitten viestin id:itä olisi "hashattu", mikä olisi kyllä varsin epäkäytännöllistä.
Joo, minäkin varmaan olisin jonnekin sessioon tunkenut nuo tunnukset kulkemaan, mutta kun tässä projektissa ei saa ollenkaan evästeitä käyttää niin ei muutakaan keinoa tullut mieleen. Hidden-kentissä tietty ne arvot on aina salattuna, että ei kuitenkaan selväkielisenä näy missään vaiheessa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.