php.de

Zurück   php.de > php.de Intern > Beitragsarchiv > Adventskalender 2008

 
 
LinkBack Themen-Optionen
Alt 05.12.2008, 00:00  
Adventskalenderöffner
 
Benutzerbild von Nikolaus 2.0
 
Registriert seit: 27.11.2008
Beiträge: 72
PHP-Kenntnisse:
Fortgeschritten
Nikolaus 2.0 ist einfach richtig nettNikolaus 2.0 ist einfach richtig nettNikolaus 2.0 ist einfach richtig nettNikolaus 2.0 ist einfach richtig nettNikolaus 2.0 ist einfach richtig nett
Standard 101: Alles regulär

5:
Dauerstress im Hause Nikolaus. Tausende Pantoffeln, Stiefel und Sandaletten wollen bis zum Morgen gefüllt sein. „Wenigstens muss ich keine Schuhe putzen“, denkt sich der fleißige Geselle.
Aber trotzdem hätte es letztes Jahr fast einen Super-GAU gegeben, weil die Liste mit Naschwerk und Adressen wiedermal in einer echten Sauklaue verfasst war.

„Dieses Jahr wird alles besser“, schwört sich Nik'laus und setzt auf Technik. Er richtet ein paar Webformulare ein und hat — schwuppdiwupp — alles in einer Datenbank. Damit ihn nicht der listige Fehlerteufel noch um den frühen Feierabend bringt, hat er dabei pflichtbewusst einige Validierungen benutzt. 10 der Wichtigsten könnt Ihr hier aus dem elektronischen Stiefel fischen:

PHP-Code:
// Anmerkung: Die Validierungen sind für Request-Parameterdaten gedacht. 
// Daher schieden typechte Validerungsformen, bspw. für INT-Werte, aus.
// Und - ja, wie immer führen viele Wege zum Ziel.

// Nicht-Null, 0 erlaubt
function validate_NN ($value)
  {
  return (
false === empty ($value) || '0' === $value);
  }


// Nicht-Null, 0 nicht erlaubt
function validate_NN_int ($value)
  {
  return (
false === empty ($value));
  }


// Ganzzahlwert
function validate_int ($value)
  {
  return (
is_numeric ($value) && 
          (string) (int) 
$value === (string) $value);
  }


// Formal gültiges deutsches Datum 
function validate_date ($value)
  {
  list (
$day $month $year) = preg_split ('#[\./-]\s*#' $value 3);
  if (
false === is_numeric ($day)   || 
      
false === is_numeric ($month) ||
      
false === is_numeric ($year)  ||
      
$day   != (int) $day          ||
      
$month != (int) $month        ||
      
$year  != (int) $year            ) {
    return (
false);
    }

  return (
checkdate ($month $day $year));
  }


// Alter aus Geburtsdatum 18-100
function validate_age ($value)
  {
  list (
$day $month $year) = preg_split ('#[\./-]\s*#' $value 3);

  
// check formal
  
if (false === is_numeric ($day)   || 
      
false === is_numeric ($month) ||
      
false === is_numeric ($year)  ||
      
$day   != (int) $day          ||
      
$month != (int) $month        ||
      
$year  != (int) $year            ) {
    return (
false);
    }

  
// check range
  
$timestamp mktime ($month $day $year);
  return (
strtotime ('- 18years') > $timestamp && 
          
strtotime ('- 100years') < $timestamp);
  }


// Datum ohne Umlaute
function validate_alpha ($value)
  {
  return (
=== preg_match ('#[^a-z]#i' $value));
  }


// Telefonnummer, einfach
function validate_phone ($value)
  {
  
$minlength 3;
  
  if (
preg_match ('#[^0-9\+\-\040/]#' $value)) {
    return (
false);
    }
  return (
strlen (trim ($value)) >= $minlength);
  }


// Einfache Email
function validate_email ($value)
  {
  return (
=== preg_match ('#^\w+(?:[\.\-]\w+)*?@\w{3,}(?:[\-_]\w+)*?\.\w{2,5}(?:\.\w{2,5})?$#' $value));
  }


// Einfache URL
function validate_url ($value)
  {
  return (
=== preg_match ('#[ÖÜÄöüäß\s]#' $mValue) &&
          
=== preg_match ('#^https?://(?:\w{2,}(?:[\-_]\w+)*\.)+\w{2,5}(?:\.\w{2,5})?(?:[\?\#/][^\s]*)?$#' $value));
  }


// Deutsche PLZ
function validate_zip ($value)
  {
  
$value ltrim ($value ' 0');
  if (
false === is_numeric ($value) && (string) (int) $value === (string) $value) {
    return (
false); 
    }
  return (
999 < (int) $value && (int) $value 100000);
  }

// Der Nikolaus übernimmt keine Gewähr für die Richtigkeit und empfiehlt einen
// ausgiebigen Testprozess vor jeglicher Nutzung in Produktivsystemen! 
Nikolaus 2.0 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.12.2008, 01:38  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Data Filtering Using PHP's Filter Functions - Part one - Devolio
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 07.12.2008, 02:36  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Der Einwand mußte natürlich kommen. Beachte: Filtern ist nicht Validieren! In den Linkbeispielen ist die Anwendung aber dafür richtig.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 07.12.2008, 10:19  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Der Einwand mußte natürlich kommen.
Exakt!
Zitat:
Filtern ist nicht Validieren!
Wenn man sich um den jeweiligen Filter eine Funktion schreibt und darin return false/true; einbaut, dann ist es wieder Validieren, stimmt.

PECL beats preg_match in performance anyway. Ich wollte dem geneigten Leser nur eine weitere Perspektive aufzeigen. Mehr nicht.

PS:
PHP-Code:
// Nicht-Null, 0 erlaubt 
function validate_NN ($value) {}

// Nicht-Null, 0 nicht erlaubt 
function validate_NN_int ($value) {} 
Wenn Null erlaubt ist, kann die 1. Funktion einfach *_empty() heißen.
Prüft validate_NN_int() tatsächlich auf einen Integer?
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 07.12.2008, 10:29  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.127
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Wenn Null erlaubt ist, kann die 1. Funktion einfach *_empty() heißen.
seh ich nicht so: 0 ist eben nicht "empty",
wenn die PHP-Funktion empty das auch anders sehen mag.

Nur if(isset($var) && $var == '') ist wirklich empty.
Koala ist offline  
Alt 07.12.2008, 10:30  
Erfahrener Benutzer
 
Registriert seit: 28.09.2008
Beiträge: 1.127
PHP-Kenntnisse:
Fortgeschritten
Koala befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Koala Beitrag anzeigen
seh ich nicht so: 0 ist eben nicht "empty",
wenn die PHP-Funktion empty das auch anders sehen mag.

Nur if(isset($var) && $var == '') ist wirklich empty.
Zitat:
Prüft validate_NN_int() tatsächlich auf einen Integer?
Das bezweifle ich auch.
Koala ist offline  
Alt 07.12.2008, 10:38  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@Koala:
Ich wollte sagen, dass die Funktion ruhig nach dem benannt werden kann was sie tut.
PHP-Code:
// Nicht-Null, 0 nicht erlaubt 
function validate_NN_int ($value
  { 
  return (
false === empty ($value)); 
  } 
.. nämlich auf empty prüfen.
Zitat:
Nur if(isset($var) && $var == '') ist wirklich empty.
Stimmt. Es gab auch noch eine andere Lösung, die fällt mir aber gerade nicht ein.
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 07.12.2008, 12:35  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Sie prüft das was drüber steht: // Nicht-Null, 0 nicht erlaubt
Allenfalls stört Euch der Bezeichner.

Zitat:
Nur if(isset($var) && $var == '') ist wirklich empty.
Nur im konkreten Anwendungsfall Validierung von Request-Parameterdaten. Sonst ist nämlich FALSE und (int) 0 auch == ''. Besser === verwenden.

Siehe auch: PHP type comparison tables
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 07.12.2008, 13:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Nachtrag: Weil ich da gerade was zu gelesen habe. Je nach Answendungsfall kann es sinnvoll sein, die ersten beiden Funktionen noch durch ein trim zu ergänzen. Leerzeichen als nicht-leere Einträge sind selten erwünscht.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 08.12.2008, 16:56  
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Nachtrag: Weil ich da gerade was zu gelesen habe. Je nach Answendungsfall kann es sinnvoll sein, die ersten beiden Funktionen noch durch ein trim zu ergänzen. Leerzeichen als nicht-leere Einträge sind selten erwünscht.
Es ist immer sinnvoll. Ich mache es aus prinzip immer und dann kommt erst die Validdierung ... ein Leerzeichen hat man schnell zuviel getippt.
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.
HStev ist offline  
 


Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Regular Ekspräschns phpdummi Off-Topic Diskussionen 12 01.09.2008 13:06
Frage zu Regular Expression Schiedsrichter PHP Tipps 2008 1 19.09.2007 16:41
einfachere lösung für regex als meine variante? Promaetheus PHP Tipps 2006 12 06.09.2006 11:45
regular expression? Dilandau PHP Tipps 2006 55 30.06.2006 16:10
regular Expression verstehen GothicFiction PHP Tipps 2006 14 23.05.2006 23:15
Suchen und ersetzen mit Regular Expressions? Datenbanken 0 09.09.2005 15:21
preg_match() oder eregi()? Chr!s PHP Tipps 2005-2 4 13.08.2005 21:46
Regular Expression - Alles zwischen Anführungzeichen PHP Tipps 2005-2 3 05.08.2005 14:07
Regular Expression, Suchen bis zum ersten suppart... PHP-Fortgeschrittene 7 04.05.2005 09:03
Posix Regular Expression Problem PHP Tipps 2005 9 15.02.2005 15:59
mit regular expressions einen Link umformen?? Wie?? 18inch PHP-Fortgeschrittene 8 19.01.2005 23:45
[Erledigt] Datum mit Regular Expression kontrollieren PHP Tipps 2004-2 7 06.12.2004 09:44
[Erledigt] regular expression: bin zu blöd PHP-Fortgeschrittene 2 08.11.2004 13:12
Regular Expressions PHP Tipps 2004 2 31.07.2004 13:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
öüäÖÜÄß, validdierung, php preg_match gültiges datum

Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum