Het HTML-element input kent een aantal varianten: text, radio, checkbox. In jouw geval kun je waarschijnlijk het beste text gebruiken. Vervolgens zul je bij de verwerking van je formulier een aantal controles moeten uitvoeren, bijvoorbeeld of de invoer numeriek is.
En wanneer het nummer "2" een leerling identificeert wil je deze wellicht op een andere manier meegeven aan je formulier, bijvoorbeeld via een hidden veld of via de querystring ($_GET). Of als een leerling dit formulier gebruikt, en je deze dit nummer niet aan wilt laten passen moet je wellicht gaan denken aan het gebruik van sessies. Maar goed, we dwalen af.
Een eenvoudige variant ziet er ongeveer als volgt uit:
Let er hierbij op dat:
- filter_var retourneert een waarde met het type waarop gevalideerd wordt, normaal is ALLE data uit $_POST en $_GET een string
- dit fragment houdt geen rekening met character sets, ook is dit geen valide HTML-document maar slechts een fragment
Ik heb de code even hierin gezet, omdat het formulier waarin het oorspronkelijk moet staan, een foutcontrole heeft, waardoor hij niet werkt. Mijn eigen code zet ik daar weer onder.
<!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" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf8_unicode_ci" />
<title></title>
<link rel= "stylesheet" href="menu_style.css" type="text/css" />
<link href="opmaak.css" rel="stylesheet" type="text/css"/>
</head>
</head>
<?php
include '../navigatie/nav.inc';
?>
<div id="container">
<div id="header3">
</div>
<div id="menu">
</div>
<div id="content">
<div class="kolom1">
<h3> <B></B><BR><br>
</h3></div>
<div class="kolom2">
<h2></h2>
<h3><A HREF=""></A>
</h3></div>
<div id="content img">
</div>
</div>
<div class="koloms12">
<p><form name="registreren" method="post" action="nefaendunefaendu.php">
<div align="left">
Dit is een voorbeeldtoets met vragen over een video-, audiofragment en een tekst.
Om de toets te halen moet je 2 goede antwoorden hebben. </h2> <br></div>
<table width="293" border="0">
<tr>
<td width="200"><div align="left"><b>Leerlingnummer:</b>
<td width="163"><input type="int" name="leerlingnummer2"></td>
<br><b>Let op! Vul <u>alle</u> vragen en je leerlingnummer in. Een onvolledig ingevulde toets wordt niet opgeslagen met als gevolg dat je alles nog een keer moet doen.</b><p></tr>
</div>
</table>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<br><b>Let op! Vul <u>alle</u> vragen en je leerlingnummer in. Een onvolledig ingevulde toets wordt niet opgeslagen met als gevolg dat je alles nog een keer moet doen.</b><p></tr>
echo"U heeft het veld '".$veld."' niet ingevuld!<br/>";
echo"Ga met het pijltje links bovenaan terug naar het scherm en probeer het opnieuw. Soms lukt het! Als je op het kruisje rechts drukt, ben je zeker alle antwoorden kwijt.";
Ik weet niet precies hoe het uiteindelijke eindresultaat er uit dient te zien en hoe deze zou moeten werken, maar ik denk dat het handig is om een aantal dingen in bovenstaande codefragmenten te scheiden.
Als je "code" en "layout" op deze manier toepast is de kans groot dat het heel snel onduidelijk is wat de precieze "toestand" van je applicatie is (dit wordt in de volksmond ook wel spaghetti code genoemd geloof ik). Ongeacht welke methode je kiest om dit te bereiken lijkt mij de grootste drijfveer "overzicht". Je zou bijvoorbeeld je applicatie op kunnen delen in acties: het tonen van een formulier, het verwerken van een formulier, het tonen van terugkoppeling. Idealiter zonder gebruikmaking van een (geneste) if-elseif-elseif-else structuur want dan ben je weer terug bij af.
Om antwoord te geven op je vraag waarom er steevast 'nummer' in je database verschijnt: deze zet je er zelf in op regel 34 van het tweede bovenstaande codefragment . Waarschijnlijk moet je hier $nummer_db voor in de plaats zetten. De "debug" regels kun je verwijderen.
Overigens is utf8_unicode_ci volgens mij geen character set (zegt iets over de encodering van je karakters) maar een (MySQL-specifieke?) character collation (zegt iets over hoe resultaten geordend worden). Een geldige character set voor HTML is UTF-8. In MySQL is dit utf8.
Hartelijk dank hiervoor. De fouten heb ik verbeterd.
Nu verschijnen alle cijfers die ik typ in de database. Als ik woorden typ komen ze er niet in.
Het is niet zo dat er een 1 verschijnt bij het typen van 100 en een 0 bij het typen van iets anders, dus de if-else regel werkt op een of andere manier nog niet.
Kan het kloppen dat je een soort van enquete of multiple choice achtige functionaliteit wilt maken? Het vervelende van open tekst is dat iedereen wel eens de neiging heeft om hetzelfde woord op een andere manier te schrijven dan wordt gevraagd/verwacht.
In zulke gevallen is het handiger om zelf, mits van toepassing natuurlijk, voor te schrijven hoe iets geschreven moet worden, met andere woorden, je schrijft zelf de keuzes voor (men kan niets zelf invullen maar enkel een antwoord kiezen). Dit kun je doen met een selectbox of met radio-buttons. Er kan dan ook geen enkel misverstand bestaan over wat iemand bedoelt.
Het hangt natuurlijk een beetje van je insteek af of dit een oplossing is voor jou, maar ik denk dat als je het nakijken van open antwoorden kunt vermijden (je bent per slot van rekening aan het automatiseren) dit wellicht beter is.
Ik heb de gegevens overgenomen (zie hieronder), maar ik krijg een wit veld.
Ben ik vergeten iets wat een relatie hiermee heeft, te veranderen?
Moderator,
Het is inderdaad een toets en ik begrijp dat meerkeuze veel beter is, maar met deze vragen mogen er geen hints gegeven worden en is het juist de bedoeling de woorden foutloos te schrijven.
En regel 27 heeft een accolade in een commentaarregel.
Ik raad je dringend aan om code correct "in te springen", dit houdt in dat als je een PHP-blok (begrensd door accolades) opent, je coderegels voorziet van extra spaties/tabs. Dit bevordert de leesbaarheid enorm.
Ook staan er een hoop regels niet op zijn plaats, zo controleer je formulierinvoer op plaatsen waar mogelijk helemaal geen formulierinvoer is. Daarnaast schrijf je data weg naar je database ongeacht of je informatie hebt ontvangen uit je formulier of niet!
Waar vul je trouwens voornaam, achternaam en leeftijd in?!
Het introduceren van aparte variabelen is lang niet altijd nodig, doe gewoon de escaping rechtstreeks in de query.
Oh, en het niet anonimiseren van je database-credentials is... ongebruikelijk.
Heb het onderstaande niet getest maar dit zou je een eind in de goede richting moeten sturen: