Skripti koostuu kahdesta osasta:
luovisa.php, joka luo lomakkeen visaa varten. Tämä luotava lomake sitten lähettää tiedot testi.php:lle.
Lisäksi sitten vielä testit-kansioon luodaan .tst-tiedosto, josta luetaan vielä perustietoja(nimi, vastaukset, kuvaukset, rajat). Miksi näin?
Halusin, että kun testi.php kerran upataan palvelimelle, siihen ei tarvitse enää koskea. Taasen lomakkeeseen ei voi laittaa vaikkapa hidden-kenttään vastausriviä, koska se olisi _helposti_ luettavissa. Nykyään joutuu arvaamaan tiedoston nimen. Siksi luodaan erillinen .tst-tiedosto.
Kiitoksia Antille.
luovisa.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="fi"> <head> <title>Visan lisäys</title> </head> <body> <?php #Konffaa tämä. Kysymysten lukumäärä. define("kyslkm",10); #Jos tunnistekentässä infoa, ala tekemään lomaketta if(!empty($_POST['tunniste'])){ #luo lomake $filu = fopen($_POST['fname'].".php","w"); #kirjoita html-dokumentin:n alku fwrite($filu,'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html><head><title>'. $_POST['header'].'</title></head><body><h1>'.$_POST['header'].'</h1><form action="testi.php" method="post">'."\n".'<input type="hidden" name="tid" value="'.$_POST['tunniste'].'" />'); #Käydään kysymykset läpi for($hluku=1;$hluku<=kyslkm;$hluku++){ if(empty($_POST['k'.$hluku])){break;} #tulostetaan kysymys fwrite($filu,"\n".$hluku.". ".$_POST['k'.$hluku].'<br />'); #tulostetaan vaihtoehdot fwrite($filu,"\n".'<input type="radio" name="k'.$hluku.'" value="a" />'.$_POST['k'.$hluku.'a'].'<br />'); fwrite($filu,"\n".'<input type="radio" name="k'.$hluku.'" value="b" />'.$_POST['k'.$hluku.'b'].'<br />'); fwrite($filu,"\n".'<input type="radio" name="k'.$hluku.'" value="c" />'.$_POST['k'.$hluku.'c'].'<br /><br />'); } #Vapaavalintisen osion valintaruksi if(!empty($_POST['opt'])){fwrite($filu,"\n".'<input type="checkbox" name="vol" />'.$_POST['chkopt'].'<br />');} fwrite($filu,"\n".'<input type="submit" value="'.$_POST['sub'].'" />'."\n".'</form></body></html>'); fclose($filu); #Avaa tst-tiedosto $tstf = fopen("testit/".$_POST['tunniste'].".tst","w"); #Kirjoita otsikko, oikea rivi ja tekstit fwrite($tstf, $_POST['header']."\r\n".$_POST['rivi']."\r\n".$_POST['t1']."\r\n".$_POST['t2']."\r\n".$_POST['t3']); #Kirjoita vielä rajat fwrite($tstf, "\r\n".$_POST['t1r']."\r\n".$_POST['t2r']."\r\n".$_POST['t3r']."\r\n"."\r\n"); #Vapaavalintainen osio if(!empty($_POST['opt'])){fwrite($tstf,$_POST['opt']);} fclose($tstf); } ?> <form action="luovisa.php" method="post"> <b>Lomakkeen perustiedot:</b><br /> Lomakkeen nimi:<input type="text" name="fname" /><br /> Tunniste:<input type="text" name="tunniste" /><br /> Otsikko:<input type="text" name="header" /><hr /><b>Kysymykset:</b><br /> <?php define("sisennys"," "); for($lm=1;$lm<=kyslkm;$lm++){ echo 'K'.$lm.':<input type="text" name="k'.$lm.'" /><br />'. sisennys.'a<input type="text" name="k'.$lm.'a" /><br />'. sisennys.'b<input type="text" name="k'.$lm.'b" /><br />'. sisennys.'c<input type="text" name="k'.$lm.'c" /><br />'; } ?><hr /> Lähetysnapin teksti:<input type="text" name="sub" /><br /> Valinnaisalueen koodi:<input type="text" name="opt" /><br /> Valinnaisalueen checkboxin teksti:<input type="text" name="chkopt" /><br /> Oikea rivi:<input type="text" name="rivi" /><br /> <hr /><b>Tasot:</b><br /> <i>Ohje: Taso 1 on alhaisimmalla pistemäärällä, taso 3 suurimmalla. Tasojen rajat ovat ylärajoja.</i><br /> <?php #Kirjoita tasokentät. For-looppi lyhyyden vuoksi :D for($taso=1; $taso<4;$taso++){ echo 'Taso'.$taso.':n raja:<input type="text" name="t'.$taso.'r" /><br />Taso'.$taso.':n teksti:<input type="text" name="t'.$taso.'" /><br />'; }?> <input type="submit" value="Luo!" /> </form> </body> </html>
testi.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="fi"> <head> <title>Tietovisa</title> </head> <body> <?php #Jos ei testiä tehty, erroria peliin if(empty($_POST['tid'])){die("Ei testiä tehty!");} #Avataan .tst-tiedosto $aihe = file("testit/".$_POST['tid'].".tst"); #Loopataan kunnes kaikki tarkistettu ja lisätään numero taulukkoon for($luku=1;$luku<=strlen($aihe[1]);$luku++){ if($_POST['k'.$luku] == substr($aihe[1],$luku-1,1)){$oikeinolleet[] .= $luku; } } #lyhyempää $i = count($oikeinolleet); echo "<h1>".$aihe[0]." -testin tulokset:</h1>"; echo("<h2>{$i} pistettä:</h2><i>"); #Tulostetaan pistemäärän mukainen teksti if($i<=$aihe[5]){ echo $aihe[2]; } elseif($i<=$aihe[6]){ echo $aihe[3]; } elseif($i<=$aihe[7]){ echo $aihe[4]; } else{ echo "Virhe."; } echo "</i><br />"; #Tulostetaan mitkä meni oikein ja mitkä väärin for($x=1;$x<>strlen($aihe[1])-1;$x++){ echo "<br />{$x}) "; if(@in_array($x,$oikeinolleet)){echo "Oikein";}else{echo "Väärin";} } #Valinnaisosio if($_POST['vol']){ echo "<br /><br />".$aihe[8]; } ?> </body> </html>
Kysymysten nimiä ei kannattaisi kirjoittaa sellaisenaan (ekab, viic, kaha) vaan ne olisi parempi luoda silmukassa (k1b, k5c, k8a), jolloin koodi lyhentyisi melkein puoleen ja kysymysten määrä ei olisi kiinteä.
Eikös Doctype-määritys pitäisi antaa aina aivan tiedoston alussa? Sitten aika karsea määrä fwrite-funktion käyttöjä. Kannattaisi ehkä ennemminkin sulloa ensin kaikki sisältö yhteen muuttujaan, jonka jälkeen yhdellä kirjoituskerralla muuttujan sisältö tiedostoon.
Antti Laaksonen kirjoitti:
Kysymysten nimiä ei kannattaisi kirjoittaa sellaisenaan (ekab, viic, kaha) vaan ne olisi parempi luoda silmukassa (k1b, k5c, k8a), jolloin koodi lyhentyisi melkein puoleen ja kysymysten määrä ei olisi kiinteä.
Joo, näinhän se on. Taidanpa päivittää vinkkiä hieman... joskus.
Ja mitä fwriteen tulee, minusta on selkeämpi kun kirjoitetaan rivi kerrallaan, mutta jokainenhan voi modata mieleisekseen...
EDIT: Koodivinkkiä paranneltu. Nyt lyhyempi koodi ja ei enää rajoitettua määrää kysymyksiä.
Vähän purkahtavalta näyttää, vaikken kovin tarkasti katsonutkaan koodia.
jrantala kirjoitti:
Vähän purkahtavalta näyttää, vaikken kovin tarkasti katsonutkaan koodia.
No jos viitsisit katsoa koodia tarkemmin ja sanoa, minkä olisi voinut toteuttaa paremmin. Itse en kyllä oikein keksi, miten olisi voinut optimoida. Ainakaan kovin paljoa.
Ei oikein toimi. Onko jossain tuo kooditoiminnassa?
Huono tapa tallentaa tiedostoon raakaa HTML:ää.
Parempi tapa olisi tallentaa tieto sellaiseen muotoon josta voi rakentaa taulukon (explode tai serialize), ja jonka avulla tulostetaan tiedot juuri sellaiseen muotoon kuin käyttäjä haluaa, ilman että koko paska pitää tyhjentää (tai muokata vaivalla), jos muokkaa ulkoasua.
makas kirjoitti:
Ei oikein toimi. Onko jossain tuo kooditoiminnassa?
Jos voisit kertoa, mikä meni vikaan. Koodi on toiminnassa kotisivuillani, katso profiilista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.