Ohjelmat käytettävissä url:n http://db.cs.helsinki.fi/~laine/php/OHJELMA kautta, missä OHJELMA on php-sivun nimi. Osalle ohjelmista voidaan antaa kutsuparametreja.
<form name ="f1" method="post" action="http://db.cs.helsinki.fi/~laine/php/pcount.php"> <fieldset> <legend>Testilomake</legend> p1: <input type="text" name="p1" value="yksi" /> <input type="checkbox" name="cb[]" value="c1" />C1<br/> <input type="checkbox" name="cb[]" value="c2" />C2<br/> <input type="checkbox" name="cb[]" value="c3" />C3<br/> </fieldset> <input type="submit" name="sub1" value="Lähetä" /> <input type="button" value="Tyhjennä lomake" /> </form>
#!/usr/local/bin/php <!doctype html public "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Parametrilistaus</title> </head> <body> <h2>Parametrilistaus</h2> <?php $counter=0; ?> <p> <?php foreach ($_REQUEST as $param => $value) { if (is_array($value)) { foreach ($value as $ind => $val) { echo "$param [$ind] = $val<br>"; $counter++; } } else { echo "$param = $value<br>"; $counter++; } } ?> <p></p> <p> <?php echo "Yhteensä: $counter parametria." ?> </p> </body> </html>
Sivua voi kutsua myös get metodilla:
http://db.cs.helsinki.fi/~laine/php/pcount.php?yksi=1&kaksi=2
#!/usr/local/bin/php <!doctype html public "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Globaalin taulukon listaus</title> </head> <body> <h2>Globaalin taulukon listaus</h2> <?php $counter=0; ?> <p> <?php if ($_GET["var"]) { $varname=substr($_GET["var"],1); echo "<h3>\${$varname}</h3>"; // $-merkki vakiona // perään muuttujan nimi if (empty($$varname)||!is_array($$varname)) { echo "Tämän nimistä taulukkoa ei ole!"; // $$varname : muuttujan $varname ilmoittaman // muuttujan arvo } else { foreach ($$varname as $param => $value) { echo "$param = $value<br>"; $counter++; } } } else { echo "Anna tulostettavan taulukon nimi parametrina var"; } ?> <hr> <p> <?php echo "Yhteensä: $counter elementtiä." ?> </p> </body> </html>
#!/usr/local/bin/php <!doctype html public "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Configuration file printing</title> </head> <Configuration parameters</h1> <?php if ($_GET["file"]) { $cfile = $_GET["file"]; $comment = "#"; $counter = 0; if (!($fp = fopen($cfile, "r"))) { // avataan tiedosto die("Could not open file $cfile"); } else { while (!feof($fp)) { //kunnes loppuu $line = trim(fgets($fp)); // luetaan seuraava rivi // tyhjät pois if ($line && !ereg("^$comment", $line)) { // ei kommentti $pieces = explode("=", $line); //jaetaan '=' erottamiin pätkiin $option = trim($pieces[0]); //ensimmäinen $value = trim($pieces[1]); //toinen $config_values[$option] = $value; //viedään taulukkoon $counter++; } } fclose($fp); //suljetaan tiedosto if ($counter==0) { echo "<p>No configuration parameters</p>"; } else { // tulostetaan taulukkoon echo "<table border=\"1\">"; foreach ($config_values as $key=>$val) echo "<tr><td>$key</td><td>$val</td></tr>"; echo "</table>"; } } } else { echo "<p>No file specified</p>"; } ?> <table> </body> </html>
Tiedoston parfile.ini sisältö on:
# This is an example file email=Harri.Laine@cs.helsinki.fi name=Harri Laine address=PL26, 00014 University of Helsinki
Ei kokeiltavissa
#!/usr/local/bin/php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title> Digitaalisen median tekniikat, kevät 2004, lomake-esimerkki php</title> <style type="text/css" media="all"> <!-- .virhe {color:red; font-weight:bold; } --> </style> </head> <?php // globaaleja taulukoita $keino= array ('tahko','taltta','jyrsin','kivi','vitsi'); $htapa= array (1=> 'tilata huoltomies', 2=>'ostaa uusi', 3=>'ei mitään'); $tyls= array (1=>'olematon',2=>'vähäinen',3=>'kohtalainen', 4=>'merkittävä',5=>'täydellinen'); if ($lomake=$_GET['submit']) { // nappia vastaava parametri löytyy // on siis tultu lomakkeen kautta // Tarkastetaan lomake if (!$_GET['tyyppi'] or strlen($_GET['tyyppi'])==0) { $err['tyyppi']=TRUE; $ms['tyyppi']='Tyyppi on annettava'; $errors=TRUE; } if (!$_GET['malli'] or strlen($_GET['malli'])==0) { $err['malli']=TRUE; $ms['malli']='Tyyppi on annettava'; $errors=TRUE; } if (!$_GET['poisto']) { $err['poisto']=TRUE; $ms['poisto']='Vähintään yksi keino valittava'; $errors=TRUE; } if ($_GET['hoito']==0) { $err['hoito']=TRUE; $ms['hoito']='Valitse jokin tapa.'; $errors=TRUE; } // Tarkastettu } ?> <body> <?php if ($lomake && !$errors) { // lomake oli kunnossa // tuotetaan palautesivu echo "<h2>Kiitos palautteestasi!</h2>"; echo "<p>Palautteesi sisältö oli seuraava: <p>"; echo "<div style=\"margin-left:2em\">"; echo "<p>Kohteen tyyppi: $_GET[tyyppi] ja malli: $_GET[malli]<br/>"; $tt=$_GET['tylsyys']; $tv=$tyls[$tt]; echo "Tylsyys: $tv<br/>"; echo "Ratkaisumahdollisuudet: "; foreach ($_GET['poisto'] as $tapa) { if ($ennen) { echo ", "; } echo "$tapa"; $ennen=TRUE; } echo "<br/>"; $hoitotapa= $htapa[$_GET['hoito']]; echo "Mitä pitäisi tehdä: $hoitotapa<br/>"; echo "Kommentti: $_GET[muuten]</p>"; echo "<form name=\"t0\" action=\"$_SERVER[PHP_SELF]\">"; echo "<input type=\"hidden\" name=\"tyyppi\" value=\"$_GET[tyyppi]\" />"; echo "<input type=\"hidden\" name=\"malli\" value=\"$_GET[malli]\" />"; foreach($_GET['poisto'] as $pp) { echo "<input type=\"hidden\" name=\"poisto[]\" value=\"$pp\" />"; } echo "<input type=\"hidden\" name=\"hoito\" value=\"$_GET[hoito]\" />"; echo "<input type=\"hidden\" name=\"muuten\" value=\"$_GET[muuten]\" />"; echo "<p><input type=\"submit\" value=\"Muuta palautettasi\" /></div>"; echo "</form></body></html>"; return; } ?> <form name="lomake" method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>"> <h2>PHP-lomake </h2> <h3> <?php if ($errors) { echo "<p class=\"virhe\">Lomakkeella oli puutteita. Korjaa merkityt kohdat ja lähetä uudelleen.</p>"; } ?> </h3> <fieldset> <legend>Kohdetiedot</legend> <p> <table> <tr><td>Tyyppi:</td> <td><input type="text" name="tyyppi" size="40" maxlength="60" value="<?php echo $_GET['tyyppi'];?>" /></td> <td class="virhe"><?php if ($err['tyyppi']) echo $ms[tyyppi];?></td></tr> <tr><td>Malli: </td> <td><input type="text" name="malli" size="40" maxlength="60" value="<?php echo $_GET['malli'];?>" /> </td> <td class="virhe"><?php if ($err['malli']) echo $ms[malli];?></td> </tr> </table> </p> </fieldset> <fieldset> <legend>Tylsyys</legend> <p>Arvioi kohteen tylsyyttä asteikolla 1(terävä) - 5 (tosi tylsä)<br /> <?php if (!$_GET['tylsyys']) $tylsa="3"; else $tylsa= $_GET['tylsyys']; ?> 1: <input type="radio" name="tylsyys" value="1" <?php if ($tylsa=="1") echo "checked=\"checked\"";?> /> <input type="radio" name="tylsyys" value="2" <?php if ($tylsa=="2") echo "checked=\"checked\"";?>/> <input type="radio" name="tylsyys" value="3" <?php if ($tylsa=="3") echo "checked=\"checked\"";?>/> <input type="radio" name="tylsyys" value="4" <?php if ($tylsa=="4") echo "checked=\"checked\"";?>/> <input type="radio" name="tylsyys" value="5" <?php if ($tylsa=="5") echo "checked=\"checked\"";?>/> 5 </p> <p>Mikä poistaisi tylsyyden? <?php if ($err['poisto']) echo "<span class=\"virhe\">$ms[poisto]</span>";?> <br/> <?php $pkeino=$_GET['poisto']; foreach ($keino as $k) { echo "<input type=\"checkbox\" name=\"poisto[]\" value=\"$k\" "; if ($pkeino && in_array($k, $pkeino)) echo "checked=\"checked\""; echo " /> $k <br />"; } ?> </p> <p>Mitä pitäisi tehdä: <select name="hoito" size=1> <option value="0">Valitse jokin</option> <option value="1" <?php if ($_GET['hoito']=="1") echo "selected=\"selected\"";?>><?php echo $htapa[1];?></option> <option value="2"<?php if ($_GET['hoito']=="2") echo "selected=\"selected\"";?>><?php echo $htapa[2];?></option> <option value="3"<?php if ($_GET['hoito']=="3") echo "selected=\"selected\"";?>><?php echo $htapa[3];?></option> </select> <?php if ($err['hoito']) echo "<span class=\"virhe\"> $ms[hoito]</span>";?> </p> <p> </p> </fieldset> <p>Muuten olen sitä mieltä, että:<br/> <textarea name="muuten" cols="60" rows="5"> <?php echo $_GET['muuten'];?> </textarea> </p> <hr> <input type="submit" name="submit" value="Lähetä" /> <input type="reset" value="Tyhjennä" /> <button type="button" value="Painele tätä" onclick="alert('kivaa!');">Painele tätä huviksesi</button> </form> </body> </html>
Seuraava php-ohjelma hoitaa monivalintatehtävien esittämisen ja tarkistuksen. Ohjelma lukee tehtävämäärittelyn XML-muotoisesta tehtävätiedostosta. Ohjelmaa on käytetty kursseilla Tietokoneeen toiminta ja Tietokantojen perusteet. Esimerkkitehtävä ja tehtävän määrittelytiedosto:
<?xml version="1.0" encoding="ISO-8859-1" standalone='yes'?> <task id="Tikape045" type="singleselection" language="en" author="Harri Laine"> <course>Introduction to Databases</course> <topic>Relational algebra</topic> <question>Consider the relation <br/><tt>PizzaPrice (<u>Id</u>, Name, price, description)</tt> with 25 tuples. How many tuples are in the selection result if the condition is <i>Id=12</i>? </question> <selection iscorrect="Maybe"> <answer>1</answer> <explanation>This may be true, but not always.</explanation> </selection> <selection iscorrect="True"> <answer>0 or 1</answer> <explanation>At most 1 hit.</explanation> </selection> <selection iscorrect="False"> <answer>anything between 0 and 25</answer> <explanation>Id is the key of the relation.</explanation> </selection> </task>
Ohjelma käyttää SAX-jäsentäjää XML:n jäsentämiseen. SAX perustuu takaisinkutsuihin (callback). Tätä varten on määritelty 3 funktiota startElement, endElement ja characterData. SAX jäsentäjä kutsuu näitä, kun elementin alkutagi, elementin lopputagi tai dataelementin osa on saatu jäsennettyä tiedostoa läpikäytäessä. Tiedostoa luetaan pätkinä ja annetaan luettu osa SAX:lle analysoitavaksi.
Ohjelma pitää kirjaa käsiteltävistä elementeistä kokoamalla muuttujaan curTag hierarkkista
polkua, joka kertoo missä elementissä ollaan.
curTag voisi olla esim´.: TASK^SELECTION^ANSWER
#!/usr/local/bin/php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <!-- Ohjelma tuottaa kysymyslomakkeen lukemalla kysymyksen tiedot xml-rakenteisesta tiedostosta. Kysymyksen perustiedot tallennetaan taulukkoon basicData (alkiot COURSE, QUESTION, ja TOPIC). Vastausvaihtoehdot luetaan taulukkoihin: choices[no]['ANSWER'] = vaihtoehdon teksti choices[no]['CORRECTNESS'] = Oikein/Väärin choices[no]['EXPLANATION'] = vaihtoehdon palaute Ohjelmalle annetaan parametrina 'file' xml-tiedoston nimi. ja parametrina 'style' käytettävän tyylitiedoston nimi. Ellei tyylitiedostoa anneta käytetään asennushakemiston tiedostoa default.css. Parametrilla 'answer' välitetään vastaus. Php-tiedostot luodaan laitoksen db.cs.helsinki.fi palvelimelle esimerkiksi hakemistoon public_html/php. Kyseisen hakemiston .htaccess tiedostossa tulee olla rivi "AddHandler cgi-script php" php-scriptien tulkitsemista varten. --> <?php // multilanguage support $correctMessage ["True"]["fi"] = "Oikein."; $correctMessage ["False"]["fi"] = "Vastaus ei ollut oikein. "; $correctMessage ["True"]["en"] = "Correct. "; $correctMessage ["False"]["en"] = "Sorry, your answer was not correct. "; $correctMessage ["Maybe"]["fi"] = "Tämä on mahdollista. "; $correctMessage ["Maybe"]["en"]= "This is possible. "; $okButton["fi"] = " Valmis "; $okButton["en"] = " OK "; function startElement($parser, $name, $attrs) { global $curTag, $curChoice, $language, $taskType, $basicData, $choices; // Muuttujaan curTag kootaan elementtihierarkiaa kuvaavaa polkua, // elementtinimet erotetaan väkäsellä // curChoice on vastausvaihtoehdon numero switch ($name) { case 'ANSWER': case 'COURSE': case 'EXPLANATION': case 'QUESTION': case 'TOPIC': $curTag .="^$name"; break; case "TASK": $curTag .="^$name"; if ($attrs['LANGUAGE']) { $language= $attrs['LANGUAGE']; } if ($attrs['TYPE']) { $taskType= $attrs['TYPE']; } break; case "SELECTION": $curTag .="^$name"; if ($attrs['ISCORRECT']) { $choices[$curChoice]["CORRECTNESS"] = $attrs['ISCORRECT']; } break; default: // pääelementtien sisällä olevien alielementtien alkutagien käsittely: // tag liitetään käsittelyssä olevan pääelementin arvoon $caretPos = strrpos($curTag,'^'); $leafName = substr($curTag,$caretPos+1); if ($leafName=='QUESTION') { if ($basicData[$leafName]) { $basicData[$leafName] .= "<$name"; } else { $basicData[$leafName] = "<$name"; } } elseif ($leafName=="ANSWER" || $leafName=="EXPLANATION") { if ($choices [$curChoice][$leafName]) { $choices [$curChoice][$leafName] .= "<$name"; } else { $choices [$curChoice][$leafName] = "<$name"; } } // attributes while (list ($key, $val) = each ($attrs)) { $attribute = " $key = \"$val\""; if ($leafName=="QUESTION") { $basicData[$leafName] .= $attribute; } elseif ($leafName=="ANSWER" || $leafName=="EXPLANATION") { $choices [$curChoice][$leafName] .= $attribute; } } if ($leafName=="QUESTION") { $basicData[$leafName] .= ">"; } elseif ($leafName=="ANSWER" || $leafName=="EXPLANATION") { $choices [$curChoice][$leafName] .= ">"; } } } function endElement($parser, $name) { global $curTag, $curChoice, $basicData, $choices; $caretPos = strrpos($curTag,'^'); $leafName= substr($curTag,$caretPos+1); if ($name=="SELECTION") { // vaihtoehdon päättyessä kasvatetaan vaihtoehtolaskuria $curChoice++; } if ($name==$leafName) { $curTag= substr($curTag,0,$caretPos); // pääelementin päättyessä poistetaan elementti hierarkkisesta polusta } else { if ($leafName=="QUESTION") { $basicData[$leafName] .= "</$name>"; } elseif ($leafName=="ANSWER" || $leafName=="EXPLANATION") { $choices [$curChoice][$leafName] .= "</$name>"; } } } function characterData($parser, $data) { global $curTag,$curChoice, $basicData, $choices, $language; $caretPos = strrpos($curTag,'^'); $leafName = substr($curTag,$caretPos+1); switch ($leafName) { case "COURSE": case "QUESTION": case "TOPIC": if ($basicData[$leafName]) { $basicData[$leafName] .=$data; } else { $basicData[$leafName] =$data; } break; case "ANSWER": case "EXPLANATION": if ($choices [$curChoice][$leafName]) { $choices [$curChoice][$leafName] .= $data; } else { $choices [$curChoice][$leafName] = $data; } break; } } // main program if (!($_GET['file'])) { die ("File parameter missing"); } $uFile= $_GET['file']; if (!($_GET['style'])) { $stylesheet= "default.css"; } else { $stylesheet=$_GET['style']; } $curChoice=0; $basicData= array(); $choices= array(); $language= "Finnish"; $taskType= "singleselection"; $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); if (!($fp = fopen($uFile,"r"))) { die ("could not open input file"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); if ($_GET['submit']) { $res= $_GET['answer']; } ?> <!-- output --> <title><?php echo $basicData["COURSE"];?><?php echo $basicData["TOPIC"]; ?></title> <link rel="stylesheet" href="<?php echo $stylesheet;?>" type="text/css" media="all" /> </head> <body> <h2><?php echo $basicData["COURSE"];?><br><?php echo $basicData["TOPIC"];?> </h2> <!-- task form --> <form method="GET" action="<?php echo $_SERVER['PHP_SELF'];?>" > <table class="question"> <tr> <td class="logo"> </td> <td class="setting"> <p class="task"> <?php echo $basicData["QUESTION"]; ?> </p> <table class="choices"> <!-- choices --> <?php for ($i=0; $i < count ($choices); $i++) { echo "<tr><td class=\"radio\"><input type=\"radio\" name=\"answer\" value=\"$i\""; if ($res) { if ($res==$i) {echo " checked";} } else { if ($i==0) {echo " checked";} } echo "></td><td class=\"ctext\">"; echo $choices[$i]["ANSWER"]; echo "</td></tr>"; } ?> </table> <input type="hidden" name="file" value="<?php echo $uFile;?>"> <input type="hidden" name="style" value="<?php echo $stylesheet;?>"> <div class="buttons"> <input type="submit" value="<?php echo $okButton[$language];?>" name="submit"> </div> </td> </tr> </table> </form> <p> <!-- Answer analysis and feedback generation --> <?php if ($_GET['submit']) { $res= $_GET['answer']; echo "<p><table class=\""; $xOK= $choices[$res]["CORRECTNESS"]; if ($xOK=="True") { echo "correct"; } elseif ($xOK=="False") { echo "false"; } else { echo "maybe"; } echo "\">"; echo "<td>"; echo $correctMessage[$xOK][$language]; echo $choices[$res]["EXPLANATION"]; echo "</td></table>"; } ?> </body> </html>
AddHandler cgi-script php SetEnv ORACLE_HOME /opt/oracle SetEnv NLS_LANG finnish_finland.we8iso8859p1Seuraava ohjelma listaa työntekijänumeron ja nimen kannassa test olevasta käyttäjän scott taulusta.
#!/usr/local/bin/php <html><body> <?php $connection = OCILogon("scott", "tiger", "bodbacka/test"); $stmt = OCIParse($connection, "SELECT EMPNO,ENAME FROM emp"); OCIExecute($stmt); // Start of table and column headings (ID and Name) print "<TABLE CELLSPACING=\"0\" CELLPADDING=\"3\" BORDER=\"1\">\n"; print " <TR><TH>ID</TH><TH>Name</TH></TR>\n"; // Loop through results while(OCIFetch($stmt)) { print " <TR>\n"; print " <TD>" . OCIResult($stmt,"EMPNO") . "</TD>\n"; print " <TD>" . OCIResult($stmt,"ENAME") . "</TD>\n"; print " </TR>\n"; } print "</table>\n"; // As always, free the resources. OCIFreeStatement($stmt); OCILogoff($connection); ?>
Tai sama toisin:
#!/usr/local/bin/php <html><body> <?php $connection = OCILogon("scott", "tiger", "bodbacka/test"); $stmt = OCIParse($connection, "SELECT EMPNO,ENAME FROM emp"); OCIDefineByName($stmt,"EMPNO",$empno); OCIDefineByName($stmt,"ENAME",$ename); OCIExecute($stmt); // Start of table and column headings (ID and Name) print "<TABLE CELLSPACING=\"0\" CELLPADDING=\"3\" BORDER=\"1\">\n"; print " <TR><TH>ID</TH><TH>Name</TH></TR>\n"; // Loop through results while(OCIFetch($stmt)) { print " <TR>\n"; print " <TD>" . $empno . "</TD>\n"; print " <TD>" . $ename . "</TD>\n"; print " </TR>\n"; } print "</table>\n"; // As always, free the resources. OCIFreeStatement($stmt); OCILogoff($connection); ?>