Problem mit Registrierungsformular

userjules

Mitglied
Hallo Ihr fleißigen Hacker,

ich brauche mal wieder eure Hilfe. Habe ein Formular zur Registrierung neuer 'user' gebastelt und stehe an folgendem Punkt auf dem Schlauch.
Alles funktioniert einwandfrei: Die user werden in der Datenbank angelegt, bekommen eine Bestätigungs-Mail mit Ihren Zugangsdaten zugesandt und auch der Seitenbetreiber erhält per Mail eine Info, dass sich ein neuer 'user' registriert hat - aber jetzt kommt's. Macht ein potentieller neuer user einen Fehler bei der Eingabe bekommt er den Fehler angezeigt und muss seine Eingabe korrigieren. Dazu wird das Formular inkl. der vorhandenen Variablen erneut dargestellt. Schickt er nun das Formular erneut ab wird die Fehlerprüfung umgangen und die Daten werden ungeprüft in die Datenbank geschrieben, worauf eine positive Rückmeldung erfolgt.

Fehler anzeigen und Formular erneut darstellen, läuft im Moment so:
PHP:
if(count($errors) > 0){
            foreach($errors AS $error){
                echo $error . "<br>\n";
            }
		if(count($errors) > 0)
            {
// Hier wird jetzt das Formular wieder dargestellt

darauf folgt dann aber nicht mehr das 'escapen' der variablen und die Fehlerprüfung wie in der ersten Runde der Eingabe, sondern ein 'else' was zum Eintrag der Variablen führt.

Hier mal das ganze Skript zum nachvollziehen meines Problems:
PHP:
<?php
include_once "registerfunctions.php";

connect();

if(!$_POST['submit']){
    echo "<table border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n";
    echo "<form method=\"post\" action=\"register.php\">\n";
	echo "<td><h3>Firmendaten</h3></td>\n";
	echo "<tr><td>Firmenname</td><td><input type=\"text\" name=\"firmierung\"> *</td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Persönliche Daten</h3></td>\n";
    echo "<tr><td>Anrede</td><td><select name=\"anrede\"><option value=\"Bitte wählen\">Bitte w&auml;hlen<option value=\"Frau\">Frau<option value=\"Herr\">Herr</select> *</td></tr>\n";
    echo "<tr><td>Titel</td><td><input type=\"text\" name=\"titel\"> </td></tr>\n";
    echo "<tr><td>Name</td><td><input type=\"text\" name=\"name\"> *</td></tr>\n";
    echo "<tr><td>Vorname</td><td><input type=\"text\" name=\"vorname\"> *</td></tr>\n";
    echo "<tr><td>Geburtsdatum</td><td><input type=\"text\" name=\"geburtsdatum\"> *</td></tr>\n";
	echo "<tr><td>Strasse</td><td><input type=\"text\" name=\"strasse\"> *</td></tr>\n";
	echo "<tr><td>Hausnummer</td><td><input type=\"text\" size=\"4\" name=\"hausnummer\"> *</td></tr>\n";
	echo "<tr><td>PLZ</td><td><input type=\"text\" size=\"5\" name=\"plz\"> *</td></tr>\n";
	echo "<tr><td>Ort</td><td><input type=\"text\" name=\"ort\"> *</td></tr>\n";
	echo "<tr><td>Land</td><td><input type=\"text\" name=\"land\"> *</td></tr>\n";
	echo "<tr><td>Telefon privat</td><td><input type=\"text\" name=\"telprivat\"></td></tr>\n";
	echo "<tr><td>Telefon geschäftlich</td><td><input type=\"text\" name=\"telgeschaeftlich\"> *</td></tr>\n";
	echo "<tr><td>Fax</td><td><input type=\"text\" name=\"fax\"></td></tr>\n";
	echo "<tr><td>Mobil</td><td><input type=\"text\" name=\"mobil\"></td></tr>\n";
	echo "<tr><td>E-Mail</td><td><input type=\"text\" name=\"email\"> *</td></tr>\n";
	echo "<tr><td>Homepage</td><td><input type=\"text\" name=\"homepage\"></td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Passwort</h3></td>\n";
	echo "<tr><td>Passwort</td><td><input type=\"password\" name=\"passwort\"> *</td></tr>\n";
    echo "<tr><td>Passwort best&auml;tigen</td><td><input type=\"password\" name=\"passconf\"> *</td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Bankverbindung</h3></td>\n";
	echo "<tr><td>Bank</td><td><input type=\"text\" name=\"bank\"> *</td></tr>\n";
	echo "<tr><td>Kontonummer</td><td><input type=\"text\" name=\"kontonummer\"> *</td></tr>\n";
	echo "<tr><td>Bankleitzahl</td><td><input type=\"text\" name=\"blz\"> *</td></tr>\n";
	echo "<tr><td>IBAN</td><td><input type=\"text\" name=\"iban\"></td></tr>\n";
	echo "<tr><td>BIC</td><td><input type=\"text\" name=\"bic\"></td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
    echo "<tr><td colspan=\"2\" align=\"left\"><input type=\"submit\" name=\"submit\" value=\"Registrieren\"></td></tr>\n";
    echo "</form></table>\n";
}
else 
{
	$firmierung = protect($_POST['firmierung']);
	$passwort = protect($_POST['passwort']);
    $confirm = protect($_POST['passconf']);
    $anrede = protect($_POST['anrede']);
    $titel = protect($_POST['titel']);
    $name = protect($_POST['name']);
	$vorname = protect($_POST['vorname']);
	$geburtsdatum = protect($_POST['geburtsdatum']);
	$strasse = protect($_POST['strasse']);
	$hausnummer = protect($_POST['hausnummer']);
	$plz = protect($_POST['plz']);
	$ort = protect($_POST['ort']);
	$land = protect($_POST['land']);
	$telprivat = protect($_POST['telprivat']);
	$telgeschaeftlich = protect($_POST['telgeschaeftlich']);
	$fax = protect($_POST['fax']);
	$mobil = protect($_POST['mobil']);
	$email = protect($_POST['email']);
    $homepage = protect($_POST['homepage']);
	$provision = "-";
	$notizen = "keine Eintragungen";
	$bank = protect($_POST['bank']);
	$kontonummer = protect($_POST['kontonummer']);
	$blz = protect($_POST['blz']);
	$iban = protect($_POST['iban']);
	$bic = protect($_POST['bic']);
	$accountstatus = "inaktiv";
	$gewerbeerlaubnis = "Gewerbeerlaubnis liegt nicht vor.";
	$gewerbeanmeldung = "Gewerbeanmeldung liegt nicht vor.";
	$fuehrungszeugnis = "F&uuml;hrungszeugnis liegt nicht vor.";
	$gewerbezentralregister = "Auszug aus dem Gewerbezentralregister liegt nicht vor.";
	$registrierungsdatum = protect (date("d.m.Y"));
    
    $errors = array();
	
	    if(!$passwort){
            $errors[] = "Passwort ist nicht angegeben!";
        }
        
        if($passwort){
            if(!$confirm){
                $errors[] = "Passwortbest&auml;tigung ist nicht angegeben oder falsch!";
            }
        }
        
        if(!$email){
            $errors[] = "E-Mail-Adresse ist nicht angegeben!";
        }
		
		if(!$firmierung){
            $errors[] = "Firmenname ist nicht angegeben!";
        }
        
        if(!$name){
            $errors[] = "Name ist nicht angegeben!";
        }
        
        if(!$vorname){
            $errors[] = "Vorname ist nicht angegeben!";
        }
		
		if(!$geburtsdatum){
            $errors[] = "Geburtsdatum ist nicht angegeben!";
        }
		
		if(!$strasse){
            $errors[] = "Strasse ist nicht angegeben!";
        }
		
		if(!$hausnummer){
            $errors[] = "Hausnummer ist nicht angegeben!";
        }
		
		if(!$plz){
            $errors[] = "Postleitzahl ist nicht angegeben!";
        }
		
		if(!$ort){
            $errors[] = "Ort ist nicht angegeben!";
        }
		
		if(!$land){
            $errors[] = "Land ist nicht angegeben!";
        }
		
		if(!$telgeschaeftlich){
            $errors[] = "Telefon gesch&auml;ftlich ist nicht angegeben!";
        }
		
		if(!$bank){
            $errors[] = "Bank ist nicht angegeben!";
        }
		
		if(!$kontonummer){
            $errors[] = "Kontonummer ist nicht angegeben!";
        }
		
		if(!$blz){
            $errors[] = "Bankleitzahl ist nicht angegeben!";
        }
        
        if($email){
            $checkemail = "/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i";
            if(!preg_match($checkemail, $email)){
                $errors[] = "Dies ist keine gültige E-mail Adresse. Eingabeformat: name@server.tld !";
            }
        }

        if($email){
            $sql2 = "SELECT * FROM `tabelle` WHERE `email`='".$email."'";
            $res2 = mysql_query($sql2) or die(mysql_error());
            
                if(mysql_num_rows($res2) > 0){
                    $errors[] = "Es gibt bereits einen Benutzer mit dieser E-Mail-Adresse in unserer Datenbank.<br />Sollten Sie Ihr Passwort vergessen haben, klicken sie bitte <a href='passwortvergessen.php'>hier</a> !";
                }
        }
		
		//Bestätigungsmail an Benutzer versenden
		if(count($errors) == 0)	// Keine Fehler beim ausfüllen des Formulars 
    {
        $sender = "noreply@domain.tld";
		$empfaenger = $email;
		$betreff = "Ihre Registrierung";
		$mailtext = "Sehr geehrte/r $anrede $name,<br />Sie haben sich erfolgreich f&uuml;r unseren Service registriert.<br /><br />Bitte melden Sie sich unter ... mit den folgenden Daten an, um zu erfahren wie Sie Ihren pers&ouml;nlichen Servicebereich innerhalb k&uuml;rzester Zeit in vollem Umfang nutzen k&ouml;nnen.<br /><br /><br />Ihre Zugangsdaten:<br /><br />E-Mail-Adresse: $email<br />Passwort: $passwort";
		mail($empfaenger, $betreff, $mailtext, "From: $sender\n" . "Content-Type: text/html; charset=iso-8859-1\n");
    }	//Ende Bestätigungsmail an Benutzer versenden
	
	    //Benachrichtigung versenden
		if(count($errors) == 0)	// Keine Fehler beim ausfüllen des Formulars 
    {
        $sender = "noreply@domain.tld";
		$empfaenger = "adresse@domain.tld";
		$betreff = "$anrede $titel $vorname $name - Registrierung auf http://www.domain.tld";
		$mailtext = "Sehr geehrte Damen und Herren,<br />$anrede $titel $vorname $name hat sich f&uuml;r den Service mit folgenden Daten registriert:<br /><br /><br />Firmenname:<br />$firmierung<br /><br />Geburtsdatum:<br />$geburtsdatum<br /><br />Adresse:<br />$strasse $hausnummer<br />$plz $ort<br />$land<br /><br />Telefon privat:<br />$telprivat<br />Telefon gesch&auml;ftlich:<br />$telgeschaeftlich<br />Fax:<br />$fax<br />Mobil:<br />$mobil<br />E-Mail:<br /><a href='mailto:$email'>$email</a><br />Homepage:<br /><a href='http://$homepage'>http://$homepage</a><br /><br />Bank:<br />$bank<br />Kontonummer:<br />$kontonummer<br />Bankleitzahl:<br />$blz<br />IBAN:<br />$iban<br />BIC:<br />$bic<br /><br />Passwort:<br />$passwort";
		mail($empfaenger, $betreff, $mailtext, "From: $sender\n" . "Content-Type: text/html; charset=iso-8859-1\n"); 
    }	//Ende Benachrichtigung versenden
        
        if(count($errors) > 0){
            foreach($errors AS $error){
                echo $error . "<br>\n";
            }
		if(count($errors) > 0)
            {
    echo "<table border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n";
    echo "<form method=\"post\" action=\"register.php\">\n";
	echo "<td><h3>Firmendaten</h3></td>\n";
	echo "<tr><td>Firmenname</td><td><input type=\"text\" name=\"firmierung\" value=\"$firmierung\"> *</td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Persönliche Daten</h3></td>\n";
    echo "<tr><td>Anrede</td><td><select name=\"anrede\"><option  value=\"$anrede\">$anrede<option value=\"Frau\">Frau<option value=\"Herr\">Herr</select> *</td></tr>\n";
    echo "<tr><td>Titel</td><td><input type=\"text\" name=\"titel\" value=\"$titel\"> </td></tr>\n";
    echo "<tr><td>Name</td><td><input type=\"text\" name=\"name\" value=\"$name\"> *</td></tr>\n";
    echo "<tr><td>Vorname</td><td><input type=\"text\" name=\"vorname\" value=\"$vorname\"> *</td></tr>\n";
    echo "<tr><td>Geburtsdatum</td><td><input type=\"text\" name=\"geburtsdatum\" value=\"$geburtsdatum\"> *</td></tr>\n";
	echo "<tr><td>Strasse</td><td><input type=\"text\" name=\"strasse\" value=\"$strasse\"> *</td></tr>\n";
	echo "<tr><td>Hausnummer</td><td><input type=\"text\" size=\"4\" name=\"hausnummer\" value=\"$hausnummer\"> *</td></tr>\n";
	echo "<tr><td>PLZ</td><td><input type=\"text\" size=\"5\" name=\"plz\" value=\"$plz\"> *</td></tr>\n";
	echo "<tr><td>Ort</td><td><input type=\"text\" name=\"ort\" value=\"$ort\"> *</td></tr>\n";
	echo "<tr><td>Land</td><td><input type=\"text\" name=\"land\" value=\"$land\"> *</td></tr>\n";
	echo "<tr><td>Telefon privat</td><td><input type=\"text\" name=\"telprivat\" value=\"$telprivat\"></td></tr>\n";
	echo "<tr><td>Telefon geschäftlich</td><td><input type=\"text\" name=\"telgeschaeftlich\" value=\"$telgeschaeftlich\"> *</td></tr>\n";
	echo "<tr><td>Fax</td><td><input type=\"text\" name=\"fax\" value=\"$fax\"></td></tr>\n";
	echo "<tr><td>Mobil</td><td><input type=\"text\" name=\"mobil\" value=\"$mobil\"></td></tr>\n";
	echo "<tr><td>E-Mail</td><td><input type=\"text\" name=\"email\" value=\"$email\"> *</td></tr>\n";
	echo "<tr><td>Homepage</td><td><input type=\"text\" name=\"homepage\" value=\"$homepage\"></td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Passwort</h3></td>\n";
	echo "<tr><td>Passwort</td><td><input type=\"password\" name=\"passwort\" value=\"$passwort\"> *</td></tr>\n";
    echo "<tr><td>Passwort best&auml;tigen</td><td><input type=\"password\" name=\"passconf\" value=\"$passconf\"> *</td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
	echo "<td><h3>Bankverbindung</h3></td>\n";
	echo "<tr><td>Bank</td><td><input type=\"text\" name=\"bank\" value=\"$bank\"> *</td></tr>\n";
	echo "<tr><td>Kontonummer</td><td><input type=\"text\" name=\"kontonummer\" value=\"$kontonummer\"> *</td></tr>\n";
	echo "<tr><td>Bankleitzahl</td><td><input type=\"text\" name=\"blz\" value=\"$blz\"> *</td></tr>\n";
	echo "<tr><td>IBAN</td><td><input type=\"text\" name=\"iban\" value=\"$iban\"></td></tr>\n";
	echo "<tr><td>BIC</td><td><input type=\"text\" name=\"bic\" value=\"$bic\"></td></tr>\n";
	echo "<tr><td>&nbsp;</td></tr>\n";
    echo "<tr><td colspan=\"2\" align=\"left\"><input type=\"submit\" name=\"submit\" value=\"Registrieren\"></td></tr>\n";
    echo "</form></table>\n";
            }
        }else {
            $sql4 = "INSERT INTO `tabelle`
                    (`firmierung`,`passwort`,`anrede`,`titel`,`name`,`vorname`,`gebdat`,`strasse`,`hausnummer`,`plz`,`ort`,`telprivat`,`telgeschaeftlich`,`fax`,`mobil`,`email`,`homepage`,`provision`,`notizen`,`bank`,`kontonummer`,`blz`,`iban`,`bic`,`accountstatus`,`gewerbeerlaubnis`,`gewerbeanmeldung`,`fuehrungszeugnis`,`gewerbezentralregister`,`registrierungsdatum`)
                    VALUES ('".$firmierung."','".md5($passwort)."','".$anrede."','".$titel."','".$name."','".$vorname."','".$geburtsdatum."','".$strasse."','".$hausnummer."','".$plz."','".$ort."','".$telprivat."','".$telgeschaeftlich."','".$fax."','".$mobil."','".$email."','".$homepage."','".$provision."','".$notizen."','".$bank."','".$kontonummer."','".$blz."','".$iban."','".$bic."','".$accountstatus."','".$gewerbeerlaubnis."','".$gewerbeanmeldung."','".$fuehrungszeugnis."','".$gewerbezentralregister."','".$registrierungsdatum."')";
            $res4 = mysql_query($sql4) or die(mysql_error());
            echo "<br /><h3>Registrierung abgeschlossen</h3><p>Vielen Dank ".$anrede." ".$name.". Sie haben sich mit der E-Mail-Adresse <b>".$email."</b> für unseren Service registriert !<br /><br />Bitte &uuml;berprüfen sie Ihr E-Mail Postfach.</p>";
        }
}

?>

Wie bereits erwähnt, es läuft schon ganz prima. Im Prinzip will ich jetzt nur noch, dass der user nach einer Fehleingabe oder wenn er was vergessen hat, nicht das ganze Formular erneut ausfüllen muss und natürlich soll auch wieder 'escaped' und auf Fehler geprüft werden.

Bin gespannt auf eure Antworten und bedanke mich schonmal im Voraus !
 
Zuletzt bearbeitet:
Dein Code ist grausam ;) so viele echos. Lager das ganze Formular aus und lade es mit "include()" rein.

Nun zu deinem eigentlichen Problem :
PHP:
<input type="text" value="<?php echo (!isset($_POST['name']) ? '' : htmlspecialchars($_POST['name']) ?>" />

So z.B. würde es gehen.
 
Aah, danke ! Dann kann ich mir die Wiederholung des Formulars ja im unteren Teil sparen und hätte somit die Anzahl der echos schon um die Hälfte halbiert.

Doch Moment. Eins verstehe ich dann immer noch nicht. Wie bekomme ich denn das das Skript dazu alle Variablen erneut zu escapen und die Fehlerprüfung durchlaufen zu lassen ?

Ich werde mal folgendes probieren...

Beim ersten aufrufen hiermit starten:
PHP:
if(!$_POST['submit'] OR count($errors) > 0){

Und dann eben das 'zweite'(gleiche) Formular rausschmeissen, da ich ja im ersten dann die Variablen mit
PHP:
<input type="text" value="<?php echo (!isset($_POST['name']) ? '' : htmlspecialchars($_POST['name']) ?>" />
ausgegeben bekomme. Dann muss ich nur noch die Fehlerausgabe wieder an die richtige Stelle bekommen.
Oder ist das totaler Blödsinn ?

EDIT:
Hmmm, scheint so. Ich bekomme jetzt wieder nur die Fehler angezeigt, das Formular aber nicht nochmal. Auf auf Ihr Schlafmützen ! Ich bin echt ratlos gerade ******
 
Zuletzt bearbeitet:
Aah, danke ! Dann kann ich mir die Wiederholung des Formulars ja im unteren Teil sparen und hätte somit die Anzahl der echos schon um die Hälfte halbiert.

Doch Moment. Eins verstehe ich dann immer noch nicht. Wie bekomme ich denn das das Skript dazu alle Variablen erneut zu escapen und die Fehlerprüfung durchlaufen zu lassen ?

In dem du die Validierung durchführst, bevor eine Ausgabe stattfindet. Es gibt in dem Sinne keinen "zweiten" Request.

PHP:
// Validieren + Escapen
.........................................................
$validiert = (isset($_POST['vali'])) ? protect($_POST['vali']) : null;
..........................................................
// Alles OK -> weiterleiten whatever
..........................................................
// Nicht alles OK -> Formular wieder anzeigen mit den vorhanden validierten Daten
echo '<input type="text" value="'.$validiert.'"/>';

Das Standardverfahren nennt man "Affenformular" am besten, du liest dich da mal ein.
 
Dake Dir für den Hinweis zum "Affenformular" ! Das hab ich gesucht und da wär ich selber nie drauf gekommen (wie auch ?), aber jetzt hab ich ja nen guten Ansatzpunkt. Schönes Wochenende !
 
Zurück