[PHP] UserInput validieren

ice-breaker

return void
ID: 93995
L
27 April 2006
6.257
585
So, ich habe die letzte Zeit wieder mit einigen gequatscht und irgendwie ist noch keiner zu einer prefekten Möglichkeit gekommen, die Eingaben von Nutzern so richtig schön zu validieren, da wollte ich mich mal umhören wie macht ihr es?

Bei mir sieht es im mom wie folgt aus:
PHP:
  $fehler=array();
  //Nickname
  if(Error::isError($nick=Validate::is_empty($_POST['nick'],'Kein Nickname angegeben')) || Error::isError($nick=Validate::is_nickname($_POST['nick'])) || Error::isError($nick=Validate::unregistered_nickname($_POST['nick'],$db))){
    $fehler[]=$nick->getMessage();
  }
  //E-Mail-Adresse
  if(Error::isError($email=Validate::is_empty($_POST['email'],'Keine E-Mail Adresse angegeben')) || Error::isError($email=Validate::is_email($_POST['email']))||Error::isError($email=Validate::unregistered_email($_POST['email'],$db))){
    $fehler[]=$email->getMessage();
  }

//...
  if(count($fehler)>0){
    $smarty->assign('nick', $_POST['nick']);
    $smarty->assign('email', $_POST['email']);
    $smarty->assign('fehler', $fehler);
  }

Den Methoden der Validate-Klasse wird der Input und eine Fehlermeldung gegeben, wenn der Input nicht mit dem Übereinstimmt, was ich gerne hätte, wird ein Error-Objekt zurückgegeben (Status: E_USER_ERROR) der die übergebene Fehlermeldung enthält, auf die mit der getMessage-Methode zugegriffen werden kann. Einige (so hoffe ich doch) werden das wahrscheinlich von Pear kennen ;)
Diese Fehlermeldungen werden dann eben in einem Array gespeichert und an Smarty übergeben
 
Ich machs mir da immer einfacher, dafür muss ich zugeben, wenn ich deins so seh, is mein Code sicherlich ned so toll.
Im Gegensatz zu dir, sammle ich keine Fehlermeldungen, sondern brech sofort ab, wenn ich etwas gefunden hab, was mir nicht passt. Extra Klasse hab ich auch ned, ich mach das noch von Hand - könnte man sicherlich verbessern.

*mal schnell Code raussuch*

z.B.:
PHP:
$row=$db->queryi_result("SELECT `id` FROM `articles` WHERE `id`=%u",$article_id);
if(!$row)
  messagebox("Artikel",$templates['admin']->parse("msg_articles_articleid"),"warning","articles.php");

if(!isset($_FILES['picfile']))
  messagebox("Artikel",$templates['admin']->parse("msg_articles_uploadpicerror"),"warning","articles.php?do=uploadpic&id=$article_id");
if($_FILES['picfile']['error']!=0)
  messagebox("Artikel",$templates['admin']->parse("msg_articles_uploadpicerror"),"warning","articles.php?do=uploadpic&id=$article_id");
  
if($_FILES['picfile']['size']>256000)
  messagebox("Artikel",$templates['admin']->parse("msg_articles_uploadpicsize"),"warning","articles.php?do=uploadpic&id=$article_id");  
  
$size=getimagesize($_FILES['picfile']['tmp_name']);
if(!$size)
  messagebox("Artikel",$templates['admin']->parse("msg_articles_uploadpicinvalid"),"warning","articles.php?do=uploadpic&id=$article_id");
messagebox() selber zeigt dann nur die Fehlermeldung - evtl. mit automatischer Weiterleitung - an, beendet aber das Script danach sofort mit einem exit.
 
Kennst meine Methode ja schon, aber ich poste sie hier trotzdem mal :mrgreen:

Ich habe zuerstmal ein Array definiert:
PHP:
$required = array(
	'aendern_mail' => array(
		array('from' => 'post', 'name' => 'mail', 'type' => 'mail'),
	),
	'aendern_passwort' => array(
		array('from' => 'post', 'name' => 'passwort1', 'type' => 'string'),
		array('from' => 'post', 'name' => 'passwort2', 'type' => 'string'),
	)
);

Je nach Aufgabe ($required[Aufgabe]), habe ich dann den namen des Formular-Feldes, die Quelle, und den Datentyp angegeben.

Ist einer der Datentypen nicht wie erwartet, wird eine bestimmte Aktion durchgeführt.

In einem späteren Schritt (beim ausführen der Aufgabe) werden die Daten dann auf den Inhalt überprüft, das kann bei mir z.B. so aussehen:

PHP:
if(($ruckgabe = Validate::check_pws($pw1,$pw2)) !== true) throw new FieldBadValueException('',$ruckgabe);

Über den Exceptionhandler werden dann die einzelnen Fehlermeldungen verarbeitet/ausgegeben.