Validering af data, der tilgår fra en form via $_POST, kan standardiseres til nogle få varianter, bl.a:
Lige så vigtigt / nødvendingt det er, at få data ind, lige så vigtigt /nødvendigt er det at disse data bliver ordentligt valideret. Alternativet er 'garbage in - garbage out'.
VIS FEJLDATA |
Opsamlede fejldata kan vises med denne kode (f.eks. rød tekst): |
if (isset ($fejlbeskeder) && $fejlbeskeder != "")
{
$fejlbeskeder .= "aktuelt program.php"; //kan udelades
echo "<fieldset class='red'>"; .red{color: red;}
echo "<legend>Fejltekster</legend>";
echo $fejlbeskeder;
echo "</fieldset>";
}
|
$fejlbeskeder |
Variablen $fejlbeskeder (eller et andet navn) skal være defineret før valideringen kan påbegyndes. |
$fejlbeskeder = ""; |
Standard validering |
Standardvalideringen for blankt felt. Kan / skal anvendes for / indgå i valideringen af alle felter, der tilgår $_POST |
if ($variabel == "") {
$fejlbeskeder .= "xxx mangler<br />";
}
|
Kun ASCII-karakterer tilladt |
Identerne i de databasefelter, der indeholder 'styredata' bør / må ikke indeholde andet end tegnene a-z/A-Z/0-9 samt '-' eller '_'. Der bør derfor foretages fornøden validering i forbindelse med indtastning / indlæsning af data, der skal bruges af PHP i 'where' m.v. Valideringen bør foretages på alle inddata i 'form', der ikke er beregnet til at kunne ses af brugerne.. |
if ($src == "") {
$fejlbeskeder .= "xxx mangler<br />"; }
elseif( mb_check_encoding($src, 'ASCII') === false ){
$fejlbeskeder .= "Feltet indeholder æ ,ø, å eller andre ikke-tilladte tegn.<br />";
}
|
Email adresse |
Kontrollerer først om adressefeltet er tomt, dernæst om mail-adressen er valid. Bør anvendes selvom der i formen er anvendt input-type email. |
if ($xxx_mail == "")
{
$fejlbeskeder .= "Mail adresse mangler<br />";
}
else
{
if(!filter_var($xxx_mail, FILTER_VALIDATE_EMAIL))
{
$fejlbeskeder .= "Der er fejl i E-mail! Du har skrevet: " . $kun_mail . "<br />";
}
}
|
Postnummer / Telefonnummer |
Komprimeret validering af om postnummer er tomt, et heltal og 4 cifre langt. Samme kodestruktur kan anvendes til telefonnummer.
Det frarådes dog generelt, at validere post- og telefonnumre udover standardvalideringen. |
if($xxx_postnr == "" || !is_int($xxx_postnr))
{$fejlbeskeder .= "Postnr. Skal udfyldes og være et heltal!<br />";}
else
{
if(strlen($xxx_postnr)!=4){ $fejlbeskeder .="Postnr. skal være på 4 cifre.<br />";}
}
|
$variabel unik / findes allerede |
Når et felt i en DB-tabel kun må indeholde unikke værdier:
Kontrol af om en given værdi allerede findes i et felt i en DBtabel.
Indekstype UNIQUE i DBtabel bør / skal undgås. Ved god validering vil den ikke redde noget, men kan få systemet til at gå ned med en dårlig brugeroplevelse til følge. Der skal bruges lidt forskellig kode alt efter om valideringen foretages under INSERT eller under UPDATE. Ved UPDATE skal der indsættes 3 små stykker ekstra kode for at tage højde for den eksisterende record: |
INSERT | UPDATE |
---|
if ($log_navn == "")
{
$fejlbeskeder .= "Brugernavn mangler<br />";
}
else
{
$sql = "SELECT log_navn FROM bruger where log_navn = ?";
$query = $db_link->prepare($sql);
$query->bind_param('s', $log_navn);
$query->execute();
$query->store_result();
$query->bind_result($log_navn);
$antal = $query->num_rows;
$query->close();
if ($antal > 0)
{
$fejlbeskeder .= "Brugernavn $log_navn er allerede brugt.<br />";
}
}
|
if ($log_navn == "")
{
$fejlbeskeder .= "Brugernavn mangler<br />";
}
else
{
$sql = "SELECT log_navn FROM bruger where log_navn = ? and brug_id != ?";
$query = $db_link->prepare($sql);
$query->bind_param('si', $log_navn, $brug_id);
$query->execute();
$query->store_result();
$query->bind_result($log_navn);
$antal = $query->num_rows;
$query->close();
if ($antal > 0)
{
$fejlbeskeder .= "Brugernavn $log_navn er allerede brugt.<br />";
}
}
|
|
Numeriske tal |
Fra input-type text i form. Kontrol for om en variabel er numerisk. -123.45 er numerisk. Benyttes sammen med felttype "decimal" i DBtabel. |
if ($variabel == "")
{
$fejlbeskeder .= "xxx mangler<br />";
}
elseif (!is_numeric($variabel))
{
$fejlbeskeder .= "xxx er ikke et numerisk tal<br />";
}
|
Heltal |
Fra input-type text i form. Kontrol for om en variabel kun indeholder heltal (integer). Benyttes sammen med felttype "integer" i DBtabel. |
if ($variabel == "")
{
$fejlbeskeder .= "xxx mangler<br />";
}
else if(!is_int($variabel))
{
$fejlbeskeder .= "xxx er ikke et heltal<br />";
}
|
Nummerserie |
Kan anvendes, hvis nummerserien så stor at drop-down menu ikke hensigtsmæssig. Oplysning om serien bør i formen gives i tilknytning til feltet. |
if ($variabel == "")
{
$fejlbeskeder .= "xxx mangler<br />";
}
else if($variabel < 1 || $variabel > 2)
{
$fejlbeskeder .= "xxx udenfor tilladt værdi<br />";
}
|
PHP filtre |
PHP tilbyder et antal filtre, der kan anvendes til validering (filteret FILTER_VALIDATE_EMAIL er allerede anvendt ovenfor). Oversigt over filtrene kan ses her og et par kodeeksempler kan ses her . |
|
RegEx |
I visse situationer kan der være behov for at foretage specialiserede valideringer. Det kan da være nødvendigt at opbygge og anvende en RegEx (Regular Expression) . |
|
I brug i anden tabel |
I forbindelse med f.eks. DELETE kan det for data i f.eks. en 'join-tabel' være relevant at afklare, om en ident i den sekundære tabel er i brug i en anden (primær) tabel og derfor ikke må slettes. |
$sql = "SELECT fk_roll_id FROM primær-tabel WHERE fk_roll_id = ?";
$query = $db_link->prepare($sql);
$query->bind_param('i', $roll_id );
$query->execute();
$query->store_result();
$query->bind_result($roll_id);
$antal = $query->num_rows;
$query->close();
if($antal > 0){
$fejlbeskeder .= "Rollen er stadig knyttet til en eller flere brugere.<br />";
}
|