logo   PHP Valideringer




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:
INSERTUPDATE
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 x og et par kodeeksempler kan ses her x.
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) x.
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 />";
}




















x
x