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);
?>