Daten prüfen und ausgeben

Cypr3s

Grünschnabel
Hallo Zusammen :)

ich zerbreche mir seit einiger Zeit an einer Aufgabe den Kopf. Ich habe schon ein wenig gesucht aber nichts wirklich passendes gefunden.
Ich habe ein Anmeldeformular erstellt und möchte die eingegebenen Daten auf Richtigkeit überprüfen. Ich habe drei Felder:
1. Vorname, darf nicht leer sein und keine Zahlen enthalten.
2. Nachnahme, darf nicht leer sein und keine Zahlen enthalten.
3. Mitgliedsnummer, darf nur 7 Zahlen enthalten und muss kleiner als 3000000 sein.

Falls etwas nicht stimmt soll eine Fehlermeldung angezeigt werden. Falls die Daten stimmen, sollen diese als Tabelle angezeigt werden.

Ich bin soweit gekommen:
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4:01 Transitional//EN">
<html>
	<head>
		<title>Hausaufgabe 2</title>
	</head>
	<body>
	
			<h1>Anmeldeformular</h1>
			<form action="" method="POST">
			<table>
			<tr><td>Vorname</td><td><input size="7" name="vorname"></td>
			<tr><td>Nachname</td><td><input size="7" name="nachname"></td>
			<tr><td>Matrikelnummer</td><td><input size="7" name="matrikelnummer"></td>
			</table>
			<input type="submit" name="submit" value="Abschicken">
			<input type="reset" name="reset" value="Zur&uuml;cksetzen">
			</form>
		
	<?php 		
		if (isset($_POST['submit'])
			&& is_literal ($_POST['vorname'])
			&& is_literal ($_POST['nachname'])
			&& is_empty ($_POST['nachname'])
			&& is_numeric ($_POST['matrikelnummer'])) {
			
			$eingabe1 = $_POST['vorname'];
			$eingabe2 = $_POST['nachname'];
			$eingabe3 = $_POST['matrikelnummer'];
			
			if (($eingabe1)	!= $eingabe1 || $eingabe1 = int)
					$error = "Fehler: Der Vorname darf nur Buchstaben enthalten!";
			
			else if (($eingabe2	!= $eingabe2 || $eingabe2 = int || $eingabe2 = empty)
					$error = "Fehler: Der Nachname darf nur Buchstaben enthalten und muss ausgefüllt werden!";
			
			else if (($eingabe3)	!= $eingabe3 || $eingabe3 = string || $eingabe3 > 3000000 || $eingabe3 < 1000000)
					$error = "Fehler: Die Matrikelnummer darf nur Zahlen zwischen 1000000 und 3000000 enthalten";
	?>
	
	</body>
</html>


Ich weiß, das der PHP_Teil falsch ist. Aber ich komme einfach nicht weiter. Es wäre super, wenn mir jemand helfen könnte. Ich erwarte natürlich nicht, dass mir jemand einen vollständigen Code liefert, ich möchte nur ein wenig Hilfe bzw. Tipps.
Danke!:)
 
Hi,

also als erstes mal prüfen, ob die Felder auch alle gefüllt sind. Sauberer ist es, mit lokalen Variablen zu arbeiten, diese leer zu initialisieren, und wenn Formular-Daten übergeben worden, diese hinein zu füllen. Anschließend kann man Validierungen auf den Variablen durchführen.

Ich denke, das wäre ein guter Ansatz:

PHP:
// Lokale Variablen vorbereiten
$vorname = "";
$nachname = "";
$matrikelnummer = "";

// Formular-Daten abholen - falls vorhanden
if(isset($_POST['nachname']))
  $nachname = $_POST['nachname'];

if(isset($_POST['vorname']))
  $vorname = $_POST['vorname'];

if(isset($_POST['matrikelnummer ']))
  $matrikelnummer = $_POST['matrikelnummer '];

// Prüfen, ob Formular-Daten übergeben wurden
if( empty($vorname) || empty($nachname) || empty($matrikelnummer) )
{
  echo "Alle Felder müssen ausgefüllt werden!";
}
else
{
  // Alle non-alpha-Zeichen filtern und vergleichen
  if( filter_var( $nachname, FILTER_SANITIZE_STRING ) != $nachname )
  {
    echo "Der Nachname darf nur Buchstaben enthalten!";
  }
  // Alle non-alpha-Zeichen filtern und vergleichen
  elseif( filter_var( $vorname, FILTER_SANITIZE_STRING ) != $vorname )
  {
    echo "Der Vorname darf nur Buchstaben enthalten!";
  }
  // Auf Zahlen validieren und Bereich prüfen
  elseif( ! filter_var( $matrikelnummer, FILTER_VALIDATE_INT, array( 'min_range' => 0, 'max_range' => 3000000 ) ) )
  {
    echo "Matrikelnummer muss eine Zahl zwischen 0 und 3000000 sein!";
  }
  else
  {
    echo "Alle Prüfungen waren erfolgreich - Daten sind in Ordnung.";
  }
}
 
Zuletzt bearbeitet:
Hallo, da ich auch sehr viel mit Formularüberprüfungen in PHP zu tun habe, hier mal meine Vorgehensweise:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Anmeldeformular mit FormValidation in PHP und CSS</title>

<style type="text/css">
h1  {
text-align: center;
}
table.anmeldeformular   {
width: 50%;
margin: 1% 25% 1% 25%;
border: 1px solid #E3E3E3;
}

td.label    {
width: 50%;
padding-left: 10px;
}

td.control  {
padding-left: 10px;
}

td.submit   {
width: 50%;
text-align: center;
background-color: black;
}

input.submit    {
text-align: center;
background-color: black;
color: white;
font-weight: bold;
border-style: none;
}

table.anmeldedaten  {
width: 30%;
margin: 1% 35% 1% 35%;
}

h2.anmeldedaten {
text-align: center;
}

</style>
</head>

<body>
            <h1>Anmeldeformular</h1>
            <form name="anmeldeformular" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" accept_charset="utf-8" />
            <table class="anmeldeformular" cellpadding="0" cellspacing="0">
            <tr>
                <td class="label">Vorname</td>
                <td class="control">
                <input size="20" maxlength="25" name="vorname" value="<?php if(isset($_POST['vorname'])) {echo $_POST['vorname'];} ?>" /></td>
            </tr>
            <tr>
                <td class="label">Nachname</td>
                <td class="control"><input size="25" maxlength="25" name="nachname" value="<?php if(isset($_POST['nachname'])) {echo $_POST['nachname'];} ?>" /></td>

            </tr>
            <tr>
                <td class="label">Matrikelnummer</td>
                <td class="control"><input size="7" maxlength="7" name="matrikelnummer" value="<?php if(isset($_POST['matrikelnummer'])) {echo $_POST['matrikelnummer'];} ?>" /></td>

            </tr>
            <tr>
              <td class="submit"><input type="submit" class="submit" name="submit" value="Abschicken"></td>
              <td class="submit"><input type="reset" class="submit" name="reset" value="Zur&uuml;cksetzen"></td>
            </tr>
            </table>
            </form>
<?php

//. I. Überprüfung der Formulareingaben nach Submit
/*
Vorname, darf nicht leer sein und keine Zahlen enthalten.
 2. Nachnahme, darf nicht leer sein und keine Zahlen enthalten.
 3. Mitgliedsnummer, darf nur 7 Zahlen enthalten und muss kleiner als 3000000 sein.

*/
if(isset($_POST['submit']))
{
    $errC   =   1;
    $errMsg =   array();
    $errMsgB=   'Es sind Fehler aufgetreten:';
    $errVorname =   'Feld <em>Vorname:</em> Eintrag fehlt oder enth&auml;lt unzul&auml;ssige Zeichen!';
    $errNachname=   'Feld <em>Nachname:</em> Eintrag fehlt oder enth&auml;lt unzul&auml;ssige Zeichen!';
    $maxMatrikelnummer = '3000000';
    $minMatrikelnummer = '1000000';
    $errMatrikelnummer=   'Feld <em>Matrikelnummer:</em> Eintrag mu&szlig; zwischen <em>'.$minMatrikelnummer.'</em> und <em>'.$maxMatrikelnummer.'</em> liegen!';
    $maxMatrikelnummer = '3000000';
    $minMatrikelnummer = '1000000';
    /*
    foreach($_POST as $key => $val)
    {
        echo $key." => ".$val."<br>";
    }
    */
    /*trim: bei Texteingabefeldern Leerzeichen links und rechts vom eingegebenen Text entfernen.
    Ansonsten funktioniert preg_match nicht wie angedacht
    */
    $vorname        =   trim($_POST['vorname']);
    $nachname       =   trim($_POST['nachname']);
    $matrikelnummer =   trim($_POST['matrikelnummer']);
    //in der eckigen Klammer von preg_match stehen die erlaubten Zeichen
    if($vorname == '' || !preg_match("/^[-a-z]*$/is", $vorname))
    {
    $errMsg[]       =   ($errC++.". ".$errVorname);
    }
    if($nachname == '' || !preg_match("/^[-a-z]*$/is", $nachname))
    {
    $errMsg[]       =   ($errC++.". ".$errNachname);
    }
    if($matrikelnummer == '' || $matrikelnummer >= $maxMatrikelnummer || $matrikelnummer < $minMatrikelnummer || !is_numeric($matrikelnummer))
    {
    $errMsg[]       =   ($errC++.". ".$errMatrikelnummer);
    }
    /*Im Array $errMsg werden die aufgetretenen Fehler gesammelt. Enthält das Array Fehler (sizeof(errMsg > 0), werden
    vorformulierte Fehlermeldungen ausgegeben. Sind keine Fehler aufgetreten (sizeof($errMsg = 0)), wird stattdessen
    die Tabelle results mit den fehlerfreien Anmeldedaten ausgegeben.
    */
    if(sizeof($errMsg) > 0)
    {
            echo $errMsgB."<br>";
            foreach($errMsg as $k => $err)
            {
                echo $err."<br>";
            }
    }
    else
    {
        $tab    =   ("<h2 class=\"anmeldedaten\">Ihre Anmeldedaten sind komplett:</h2>");
        $tab    .=  ("<table class=\"anmeldedaten\" cellpadding=\"0\" cellspacinG=\"0\">");
        $tab    .=  ("<tr>");
        $tab    .=  ("<td class=\"label\">Vorname:</td>");
        $tab    .=  ("<td class=\"control\">".$vorname."</td>");
        $tab    .=  ("</tr>");
        $tab    .=  ("<tr>");
        $tab    .=  ("<td class=\"label\">Nachname:</td>");
        $tab    .=  ("<td class=\"control\">".$nachname."</td>");
        $tab    .=  ("</tr>");
        $tab    .=  ("<tr>");
        $tab    .=  ("<td class=\"label\">Matrikelnummer:</td>");
        $tab    .=  ("<td class=\"control\">".$matrikelnummer."</td>");
        $tab    .=  ("</tr>");
        $tab    .=  ("</table>");
        echo $tab;
    }
}
?>

</body>

</html>
Bei Dir muß der User alle Felder des Formulars erneut ausfüllen, wenn ein Fehler auftritt. value="<?php if(isset($_POST['vorname'])) {echo $_POST['vorname'];} ?>" sorgt dafür, daß die Werte beim Drücken des Submit-Buttons erhalten bleiben. Ich hoffe, Du kannst mit meiner Lösung etwas anfangen.
 
Warum kein isset() bei dem Zugriff auf die Formular-Daten? Bei aktivierten error_reporting() hat man sofort eine Fehlermeldung. Ich bin kein Fan von Security-by-obscurity aber man muss einem potentiellen Angreifer das Leben nicht noch dadurch erleichtern, das man seinen Directory-Baum verrät.
 
Vielen vielen Dank für die Antworten! :)
Ihr hab mir echt super geholfen, jetzt wo man das so sieht, ist alles eigentlich ziemlich nachvollziehbar :)
Danke!
 
I. Die Suchmuster bei preg_match bedürfen einer Korrektur:

PHP:
if($vorname == '' || !preg_match("/^[-a-zäöüß]*$/is", $vorname))
//z.b: Karl-Heinz, Jürgen
if($nachname == '' || !preg_match("/^[\s-a-z0-9äöüß]*$/is", $nachname))
/*z.B. Müller von Arsow, Meier-Schmidt
Das i bedeutet, daß Groß- und Kleinschreibung keine Rolle spielt.
\s = Leerzeichen
*/
Die Datei wurde in meinem Editor als utf-8 ohne BOM (nicht als ANSI) gespeichert.
Getestet in IE 9 und neuestem Firefox. Alle Tests ok.
 
warum nicht mit filter_input() oder filter_input_array() arbeiten? Ist isset() und eine Typen/RegExp-Validierung in einem.

PHP:
<?php
/**
 * 1. Vorname, darf nicht leer sein und keine Zahlen enthalten.
 * 2. Nachnahme, darf nicht leer sein und keine Zahlen enthalten.
 * 3. Mitgliedsnummer, darf nur 7 Zahlen enthalten und muss kleiner als 3000000 sein.
 */

//Regeln defineren
$rules = array(
            'vorname'   => array( 'filter'  => FILTER_VALIDATE_REGEXP,
                                  'options' => array('regexp' => '/^[^[:digit:]]+$/'),
                                  //'msg' ist kein Parameter für filter_input_array. Jedoch 
                                  //haben wir so grad die Fehlermeldung zum Feld
                                  'msg'     => 'Vorname, darf nicht leer sein und keine Zahlen enthalten.'),
            'nachname'  => array( 'filter'  => FILTER_VALIDATE_REGEXP,
                                  'options' => array('regexp' => '/^[^[:digit:]]+$/'),
                                  'msg'     => 'Nachnahme, darf nicht leer sein und keine Zahlen enthalten.'),
            'id'        => array( 'filter'  => FILTER_VALIDATE_INT, 
                                  'options' => array('min_range' => 0, 'max_range' => 3000000),
                                  'msg'     => 'Mitgliedsnummer, darf nur 7 Zahlen enthalten und muss kleiner als 3000000 sein.')
);

//Fehlerliste initialisieren
$errors = array();
if(isset($_POST['submit'])){
    //$_POST mit unseren Regeln ausfiltern
    $vars = filter_input_array(INPUT_POST, $rules);
    
    foreach($vars as $varName => &$value){
        //Wenn ein Fehler vorliegt oder das Feld nicht abgefüllt ist
        //die Fehlermeldung übernehmen und den Wert auf Leer setzen
        if(is_null($value) || !$value){
            $errors[$varName] = $rules[$varName]['msg'];
            $value = '';
        }
    }
    //Alle Variablen erstellen.
    extract($vars);
    
}else{
    //Wenn das Formular nicht gesendet wurde, jede Variable mit '' initialisieren
    extract(array_fill_keys(array_keys($rules), ''));    
}


?> 
<form method="post">
    <p>
        Vorname: <input type="text" name="vorname" value="<?php echo $vorname; ?>" />
    </p>
    <p>
        Nachname: <input type="text" name="nachname" value="<?php echo $nachname; ?>" />
    </p>
    <p>
       Mitgliedsnummer: <input type="text" name="id" value="<?php echo $id; ?>" />
    </p>
    <input type="submit" name="submit" />
</form>

<?php 
    if(count($errors) > 0){
        echo '<h1>Fehler!</h1>';
        echo implode('<br />', $errors);
    }    
?>
 
Zurück