Åtgärder

CS enkelt prov rätta

Från Skolbok

Nu har du sett hur man gör ett simpelt prov, nu är det dags att kunna rätta det också. Då får vi sätta upp likadana kontroller:

De fält som behöver kunna redigeras och uppdateras är:

ELEV_ID 
PROVKOMMENTAR
RESULTAT

Alla andra uppgifter i provet skall bara visas upp på sidan, vilket gör att det går hyfsat fort att rätta provet.

Det första vi måste göra är att välja rätt prov. Det sker i det här fallet med en flervalsruta. Det finns säkert bättre sätt att göra det på, men knappast enklare.

Nackdelen med detta är att om du har mängder med prov inlagda i databasen får du hundratals poster att visa upp och valen går långt under skärmkanten. Då får du begränsa sökningen ändå mer (jag skall visa hur det går till, oroa dig inte).


 <?php
session_start();//Behåll inloggningsbiljetten
//Filnamn  simpeltprov_raetta.php

//Olika viktiga variabler
$host="localhost"; // Host , på en privat dator duger oftast localhost
$username="root"; // Mysql användarnamn, antagligen root
$password="password1"; // Lösenord till root, kan t.ex. vara password1
$db_name="skolan"; // Databasens namn

// Anslut till MySQL servern och välj rätt tabell
mysql_connect("$host", "$username", "$password")or die("Kan inte ansluta till databasen");
mysql_select_db("$db_name")or die("Kan inte välja rätt databas.");

//Har vi fått in ett prov id?
 if($_POST['formSubmit']== "Spara" || $_POST['formSubmit']== "OK" )
{
$provid = $_POST['provid'];
}
else
{
$provid = 0;
}

//Har man tryckt på knappen?
if($_POST['formSubmit'] == "Spara")
{
$valtprov = $_POST['valtprov'];
$elev_id=$_POST['elev_id'];
$provkommentar=$_POST['provkommentar'];
$resultat=$_POST['resultat'];

//Uppdatera databasen
  if ($provid > 0)
  {
  $datumraettat=date('Y-m-d H:i:s');
  $sqlupp = "UPDATE simpeltprov set ELEV_ID=".$elev_id.", PROVKOMMENTAR='".$provkommentar."', RESULTAT='".$resultat."', DATUM_RATTAT='".$datumraettat."' where ID = ".$provid;
  mysql_query($sqlupp) or die(mysql_error());

  }
}


//Ta fram informationen från databasen
$sqlres = "SELECT * FROM simpeltprov where id = ".$provid;
$result = mysql_query ($sqlres) or die(mysql_error());
while($row = mysql_fetch_array($result))
 {
$elev_id = $row['ELEV_ID'];
$elev_fnamn  = $row['F_NAMN'];
$elev_enamn = $row['E_NAMN'];
$elev_klass = $row['KLASS'];
$elev_hemligt = $row['HEMLIGTORD'];
$provnamn=$row['PROVNAMN'];
$facit=$row['FACIT'];
$elevsvar=$row['ELEVSVAR'];
$provkommentar=$row['PROVKOMMENTAR'];
$resultat=$row['RESULTAT'];
$datumgjort=$row['DATUM_GJORT'];
$datumrattat=$row['DATUM_RATTAT'];
 }


?>
<!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" dir="ltr" lang="sv-SE">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Rättning av enkelt prov </title>
</head>

<body>
<form name="formraetta" method="post" action="simpeltprov_raetta.php">

<?php
//vi behöver ett sätt att välja ut ett prov att rätta på
//Men vi måste bibehålla det valda provets id-nummer
echo "<select name=provid>";
if ($provid==0){
echo "<option value=0>Välj prov</option>";
}
else
{
echo "<option value=".$provid.">Prov valt, id:".$provid."</option>";
}

$querylistbox="SELECT * FROM simpeltprov ORDER BY PROVNAMN, KLASS, E_NAMN";
$result = mysql_query ($querylistbox) or die(mysql_error());

while($row=mysql_fetch_array($result))
{//tabellraden sparas i $row
echo "<option value=".$row['ID'].">".$row['PROVNAMN']."-".$row['E_NAMN']." ".$row['F_NAMN']."-".$row['KLASS'].":".$row['DATUM_GJORT']."/".$row['DATUM_RATTAT']."</option>";
// Genom att stega ner genom tabellen visas alla proven upp 
}
echo "</select>";// Avsluta boxen

?>
<input type="submit" name="formSubmit" value="OK" /><br>
<br>
<b>Elev ID-nummer</b><br>
<input name="elev_id" type="text" value= <?=$elev_id;?>><br>
<i>Ändra bara om du vet elevens ID.</i><br>
<br>
<b>Prov:</b><?=$provnamn;?><br>
<b>Elev:</b><?=$elev_fnamn;?> <?=$elev_enamn;?> <b>Klass:</b><?=$elev_klass;?><br>
  <b>(Hemligt ord:</b><?=$elev_hemligt;?>)<br>
<b>Inlämnat:</b><?=$datumgjort;?><br><b>Rättat:</b><?=$datumrattat;?><br>
<hr>
<b>Provkommentar:</b><br>
<textarea name="provkommentar" rows="10" cols="76"><?=$provkommentar;?> </textarea><br>

<b>Resultat</b><br>
<input name="resultat" type="text" value= <?=$resultat;?>><br>

<br>
<input type="submit" name="formSubmit" value="Spara" />
<table>
<tr>
<td valign="top">
<b>Elevsvar:</b><br>
<?=nl2br($elevsvar);?>
</td><td valign="top">
<b>Facit:</b><br>
<?=nl2br($facit);?>
</td>
</tr>
</table>

</form>

</body>
</html>

Kodförklaring

 session_start();//Behåll inloggningsbiljetten
 //Filnamn  simpeltprov_raetta.php

Som förr, behåll beviset på att du är inloggad och se namnet på filen i början.


 //Olika viktiga variabler
 $host="localhost"; // Host , på en privat dator duger oftast localhost
 $username="root"; // Mysql användarnamn, antagligen root
 $password="password1"; // Lösenord till root, kan t.ex. vara password1
 $db_name="skolan"; // Databasens namn

De olika variablerna som behövs för att logga in i databasen. Om de ligger i en separat fil som länkas till sidan slipper man fylla i detta varje gång.

 // Anslut till MySQL servern och välj rätt tabell
 mysql_connect("$host", "$username", "$password")or die("Kan inte ansluta till databasen");
 mysql_select_db("$db_name")or die("Kan inte välja rätt databas.");

Själva anslutningen till databasen.


 //Har vi fått in ett prov id?
  if($_POST['formSubmit']== "Spara" || $_POST['formSubmit']== "OK" )
 { $provid = $_POST['provid'];}
 else
{$provid = 0;}

Om vi har en provid på 0 finns inget valt prov. Allt över 0 innebär att vi laddat in ett prov vi kan rätta. I formuläret finns två knappar, en OK knapp man använder för att välja prov och en Sparaknapp som används för att spara ändringar i det valda provet.


 //Har man tryckt på knappen?
 if($_POST['formSubmit'] == "Spara")
 {
 $valtprov = $_POST['valtprov'];
 $elev_id=$_POST['elev_id'];
 $provkommentar=$_POST['provkommentar'];
 $resultat=$_POST['resultat'];
 
 //Uppdatera databasen
   if ($provid > 0)
   {
   $datumraettat=date('Y-m-d H:i:s');
   $sqlupp = "UPDATE simpeltprov set ELEV_ID=".$elev_id.", PROVKOMMENTAR='".$provkommentar."', RESULTAT='".$resultat."', DATUM_RATTAT='".$datumraettat."' where ID = ".$provid;
  mysql_query($sqlupp) or die(mysql_error());

  }
 }

Om man tryckt på sparaknappen ges överförsn värdet i de olika fälten i formuläret till olika variabler. Det är väl ganska självförklarande. Nästa steg är litet mer annorlunda. Vi kör en UPDATE i databasen. Det innebär att vi ändrar en existerande datatabell. De olika värdena för ägaren/eleven sid, textrutan där du skrivit om provet, resultatets textrad och dessutom lägger vi till datum och tid för rättningen. Precis som när man skapar en ny post skall all text vara omgärdad av enkla citattecken och siffror vara utan, men man kan uppdatera valfritt antal fält, till skillnad från när man lägger in en ny post då samtliga fält måste vara ifyllda.


 //Ta fram informationen från databasen
 $sqlres = "SELECT * FROM simpeltprov where id = ".$provid;
 $result = mysql_query ($sqlres) or die(mysql_error());
 while($row = mysql_fetch_array($result))
 {
 $elev_id = $row['ELEV_ID'];
 $elev_fnamn  = $row['F_NAMN'];
 $elev_enamn = $row['E_NAMN'];
 $elev_klass = $row['KLASS'];
 $elev_hemligt = $row['HEMLIGTORD'];
 $provnamn=$row['PROVNAMN'];
 $facit=$row['FACIT'];
 $elevsvar=$row['ELEVSVAR'];
 $provkommentar=$row['PROVKOMMENTAR'];
 $resultat=$row['RESULTAT'];
 $datumgjort=$row['DATUM_GJORT'];
 $datumrattat=$row['DATUM_RATTAT'];
 }

I princip samtliga fält i datatabellen tas fram och ges till lokala variabler eftersom de behövs efter det att de uppdaterats (viktigt). Skulle vi sätta uppdateringen efter den här kodväggen skulle den ges felaktiga värden.

(Diverse html-kod, samma sort som tidigare exempel)

echo "<select name=provid>";
if ($provid==0){
echo "<option value=0>Välj prov</option>";
}
else
{
echo "<option value=".$provid.">Prov valt, id:".$provid."</option>";
}

Vi skall ha en flervalsruta, men problemet som uppstår är att vi har två knappar som bägge påverkar flervalsrutan. Av den anledningen måste vi se till så att den översta raden består oavsett om vi klickar på den andra knappen eller inte.


 $querylistbox="SELECT * FROM simpeltprov ORDER BY PROVNAMN, KLASS, E_NAMN";
 $result = mysql_query ($querylistbox) or die(mysql_error());
 
 while($row=mysql_fetch_array($result))
 {//tabellraden sparas i $row
 echo "<option value=".$row['ID'].">".$row['PROVNAMN']."-".$row['E_NAMN']." ".$row['F_NAMN']."-".$row['KLASS'].":".$row['DATUM_GJORT']."/".$row['DATUM_RATTAT']."</option>";
 // Genom att stega ner genom tabellen visas alla proven upp 
 }
 echo "</select>";// Avsluta boxen

Här fyller vi på alla andra raderna i flervalsrutan och slutar med en </select>

Varje rad har ett ID som användaren inte ser, och en textrad med: provnamn, elevens för- och efternamn och klass samt datum då provet gjordes och rättades. Alla de uppgifterna tillsammans borde vara tillräckligt för att man skall kunna lista ut vilket prov man bör rätta.

ORDER BY... visar i vilken ordning man skall sortera proven. Här sorteras de i första hand efter provnamnet, därefter klassen och sedan elevnamnen baserade på efternamnen.


 <input type="submit" name="formSubmit" value="OK" /><br>

Här är OK knappen man klickar på efter det att man valt ett prov.

 <b>Elev ID-nummer</b><br>
 <input name="elev_id" type="text" value= <?=$elev_id;?>><br>

Det kan vara en god ide att ha en lista med varje elevs namn och ID-nummer liggande vid rättning så att du kan fylla i dem eftersom. Förvänta dig inte att eleverna själva kommer att fylla i rätt siffra. När rätt siffra lagts in kan man samköra registren i framtiden och få fram samtliga prov en viss elev gjort.


 <b>Prov:</b><?=$provnamn;?><br>
 <b>Elev:</b><?=$elev_fnamn;?> <?=$elev_enamn;?> <b>Klass:</b><?=$elev_klass;?><br>
   <b>(Hemligt ord:</b><?=$elev_hemligt;?>)<br>
 <b>Inlämnat:</b><?=$datumgjort;?><br><b>Rättat:</b><?=$datumrattat;?><br>

Här står de olika uppgifterna om provet som information till dig som rättande lärare, de kan inte ändras.


 <b>Provkommentar:</b><br>
 <textarea name="provkommentar" rows="10" cols="76"><?=$provkommentar;?> </textarea><br>

Här skapas en textruta där du kan fylla i din rättning och bedömning av provet i text. Den är 76 tecken bred och tio rader hög, men den rymmer bra mycket mer text än så.


 <b>Resultat</b><br>
 <input name="resultat" type="text" value= <?=$resultat;?>><br>

här är textrutan där du kan skriva ut poäng, betyg, uppnådda mål eller vad du vill i korthet.


<input type="submit" name="formSubmit" value="Spara" />

Knappen som man sparar med.


 <table>
 <tr>
 <td valign="top">
 <b>Elevsvar:</b><br>
 <?=nl2br($elevsvar);?>
 </td><td valign="top">
 <b>Facit:</b><br>
 <?=nl2br($facit);?>
 </td>
 </tr>
 </table>

Här är en tabell med en enda rad och två celler där texten klistras mot toppen i vertikalled (valign=2top”). I den vänstra cellen finns elevens svar och i den högra finns facit, så att det skall vara lätt att rätta. Funktionen nl2br($elevsvar) förvandlar alla radbrytningar till HTML radbrytningar istället så att texten visas upp snyggt på sidan.


</form>

</body>
</html>

Slut på formuläret och på sidan i övrigt