Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tietovisajärjestelmä

Sivun loppuun

Juice [03.02.2005 22:43:15]

#

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","&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
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>

Antti Laaksonen [06.02.2005 10:55:55]

#

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ä.

Turatzuro [06.02.2005 17:39:31]

#

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.

Juice [06.02.2005 18:32:08]

#

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ä.

jrantala [07.02.2005 10:43:24]

#

Vähän purkahtavalta näyttää, vaikken kovin tarkasti katsonutkaan koodia.

Juice [07.02.2005 19:01:32]

#

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.

makas [12.02.2005 21:55:00]

#

Ei oikein toimi. Onko jossain tuo kooditoiminnassa?

T.M. [12.02.2005 23:47:06]

#

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.

Juice [13.02.2005 19:48:19]

#

makas kirjoitti:

Ei oikein toimi. Onko jossain tuo kooditoiminnassa?

Jos voisit kertoa, mikä meni vikaan. Koodi on toiminnassa kotisivuillani, katso profiilista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta