Affenformular - nach submit leere Seite
inspiron
- php
Hallo,
ich habe mit Hilfe eines Tutorials ein Affenformular erstellt. In diesem werden nicht ausgefüllte Felder markiert und eine Meldung Angezeigt.
Das ist soweit i.O.
Sind aber alle Felder ausgefüllt und wird der Submit Button gedrückt wird eine leere Seite aufgebaut. Das soll so nicht sein!
Was muss ich ändern, daß das Formular nach dem versenden der Daten erhalten bleibt?
Gruß
Anbei mal der Code:
<?php header ('Content-Type: text/html; charset=utf-8');
/*
* Dafür sorgen, dass unabhängig von den aktuellen PHP-Einstellungen
* alle auftretenden Fehler angezeigt werden
*/
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
$err = ''; // Variable für die Fehlerausgabe
$success = ''; // Variable für die Ausgabe der Erfolgsmeldung
/*
* Zunächst die Überprüfung der Benutzereingabe durchführen, d.h.
* folgendes wird nur überprüft, falls der Button gedrückt und das
* Formular somit abgesendet wurde
*/
if (isset($_POST['senden'])) {
$eingabe = array(); // zum abspeichern überprüfter Benutzereingaben
$error = array(); // zum merken von fehlerhaften Benutzereingaben
/*
* Überprüfung eines Textfeldes: Wurde auch ein Name eingegeben?
*/
if (isset($_POST['vorname']) && strlen(trim($_POST['vorname'])) && !is_array($_POST['vorname'])) {
$eingabe['vorname'] = htmlspecialchars(trim($_POST['vorname']));
} else {
$error['vorname'] = 'Vorname';
}
/*
* Überprüfung eines Textfeldes: Wurde auch eine Telefonnummer eingegeben?
* Wir nehmen an, dass eine Telefonnummer nur aus Zahlen und min. 4 Ziffern besteht
*/
if (isset($_POST['telefon']) && strlen(trim($_POST['telefon'])) > 4 && is_numeric($_POST['telefon'])) {
$eingabe['telefon'] = trim($_POST['telefon']);
} else {
$error['telefon'] = 'Telefon';
}
/*
* Überprüfung von Checkboxen
* Kein Fehler generieren, wenn nichts ausgewählt wurde, da keine Pflichteingabe
*/
if (isset($_POST['sprachen']) && is_array($_POST['sprachen']) && !empty($_POST['sprachen'])) {
$erlaubte_sprachen = array('deutsch', 'englisch', 'spanisch', 'binaer'); // Erlaubte Eingaben
$eingabe['sprachen'] = array();
// Wurden auch nur erlaubte Sprachen angeklickt und das Formular somit nicht manipuliert?
foreach ($_POST['sprachen'] AS $sprache) {
if (in_array($sprache, $erlaubte_sprachen)) {
$eingabe['sprachen'][] = htmlspecialchars($sprache);
} else {
$error['sprachen'] = 'Sprachen';
}
}
}
if (isset($_POST['heimatland']) && !is_array($_POST['heimatland']) && strlen(trim($_POST['heimatland']))) {
$erlaubte_heimat = array('de', 'ch', 'at'); // Zur vorbeugung manipulierter Formulare
if (in_array($_POST['heimatland'], $erlaubte_heimat)) {
$eingabe['heimatland'] = htmlspecialchars(trim($_POST['heimatland']));
} else {
$error['heimatland'] = true;
}
} else {
$error['heimatland'] = 'Heimatland';
}
/*
* Bis hier sind nun alle Überprüfungen durchgeführt worden.
* Wenn bis hier keine Fehler aufgetreten sind, dann waren die Eingaben korrekt und
* können somit weiterverarbeitet werden. Wenn allerdings ein Fehler aufgetreten ist,
* so wird der folgende Code nicht ausgeführt. Stattdessen wird ein Hinweis auf eine
* fehlerhafte Eingabe ausgegeben und das Formular erneut angezeigt, da wir den
* weiteren Ablauf des Scriptes nicht unterbrechen
*/
if (empty($error)) {
/*
* Hier z.B. alle Daten in der Datenbank abspeichern und darauf hin
* den Benutzer an eine andere Stelle weiterleiten.
*/
$success = 'Alle Eingaben waren okay!';
// Scriptablauf abbrechen, da alles wichtige erledigt ist
exit();
} else {
/*
* Das Fehler-Array wird in einen String umgewandelt
* und dieser String für die Ausgabe gespeichert
*/
$errors = implode(', ',$error);
$err = 'Es sind Fehler aufgetreten: '.$errors;
}
} // END if (isset($_POST['senden']))
?>
<style type="text/css">
.error {
border: red;
border-style: solid;
border-top-width: 2px;
border-right-width: 2px;
border-bottom-width: 2px;
border-left-width: 2px;
}
</style>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta http-equiv="expires" content="0"/>
<title>Affenformular</title>
</head>
<body>
-----------------------------------
<?php
// Fehler ausgeben
if(!empty($err)) echo $err;
// Erfolgsmeldung ausgeben
if(!empty($success)) echo $success;
?>
-----------------------------------
<form class="commentForm" method="post" accept-charset="utf-8" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>">
Name:
<input type="text" name="vorname"<?php if(isset($eingabe['vorname'])) echo ' value="'.$eingabe['vorname'].'"'; ?><?php if(isset($error['vorname'])) echo ' class="error"';?> /><br />
Telefonnummer:
<input type="text" name="telefon"<?php if(isset($eingabe['telefon'])) echo ' value="'.$eingabe['telefon'].'"'; ?><?php if(isset($error['telefon'])) echo ' class="error"';?> /><br />
Sprachen: Deutsch
<input type="checkbox" name="sprachen[]" value="deutsch"<?php if(isset($eingabe['sprachen']) && in_array('deutsch', $eingabe['sprachen'])) echo ' checked="checked"'; ?> />
Englisch
<input type="checkbox" name="sprachen[]" value="englisch"<?php if(isset($eingabe['sprachen']) && in_array('englisch', $eingabe['sprachen'])) echo ' checked="checked"'; ?> />
Spanisch
<input type="checkbox" name="sprachen[]" value="spanisch"<?php if(isset($eingabe['sprachen']) && in_array('spanisch', $eingabe['sprachen'])) echo ' checked="checked"'; ?> />
Binär
<input type="checkbox" name="sprachen[]" value="binaer"<?php if(isset($eingabe['sprachen']) && in_array('binaer', $eingabe['sprachen'])) echo ' checked="checked"'; ?> /><br />
<select name="heimatland"<?php if(isset($error['heimatland'])) echo 'class="error"'; ?>>
<option value="">Heimatland auswählen</option>
<option value="de"<?php if(isset($eingabe['heimatland']) && $eingabe['heimatland'] == 'de') echo ' selected="selected"' ?>>Deutschland</option>
<option value="ch"<?php if(isset($eingabe['heimatland']) && $eingabe['heimatland'] == 'ch') echo ' selected="selected"' ?>>Schweiz</option>
<option value="at"<?php if(isset($eingabe['heimatland']) && $eingabe['heimatland'] == 'at') echo ' selected="selected"' ?>>Österreich</option>
</select><br />
<?php
?>
<input type="submit" name="senden" value="Und los!" />
</form>
</body>
</html>
Hallo,
Was muss ich ändern, daß das Formular nach dem versenden der Daten erhalten bleibt?
Wieso sollte das Formular erhalten bleiben? Damit man es wieder und wieder abschicken kann?
Um deine Frage zu beantworten: du hast die Kommentare in deinem Script gelesen?
if (empty($error)) {
/*
* Hier z.B. alle Daten in der Datenbank abspeichern und darauf hin
* den Benutzer an eine andere Stelle weiterleiten.
*/
$success = 'Alle Eingaben waren okay!';// Scriptablauf abbrechen, da alles wichtige erledigt ist
exit();
}
vg ichbinich
--
Kleiner Tipp:
Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
Hi,
Wieso sollte das Formular erhalten bleiben? Damit man es wieder und wieder abschicken kann?
...oder sich selbst wieder als leeres öffnet. Da dort Eingaben über den Tag von einer Person erfolgen sollen.
Um deine Frage zu beantworten: du hast die Kommentare in deinem Script gelesen?
if (empty($error)) {
/*
* Hier z.B. alle Daten in der Datenbank abspeichern und darauf hin
* den Benutzer an eine andere Stelle weiterleiten.
*/
$success = 'Alle Eingaben waren okay!';// Scriptablauf abbrechen, da alles wichtige erledigt ist
exit();
}
Was ich aber nicht verstehe ist, wenn alle Eingaben i.O. sind warum bekomme ich die Meldung 'Alle Eingaben waren okay! nicht angezeigt?
Erst wenn ich exit(); entferne bleibt zwar das Formular erhalten nur sind die Felder nicht leer.
Hallo,
if (empty($error)) {
/*
* Hier z.B. alle Daten in der Datenbank abspeichern und darauf hin
* den Benutzer an eine andere Stelle weiterleiten.
*/
$success = 'Alle Eingaben waren okay!';// Scriptablauf abbrechen, da alles wichtige erledigt ist
exit();
}
>
> Was ich aber nicht verstehe ist, wenn alle Eingaben i.O. sind warum bekomme ich die Meldung 'Alle Eingaben waren okay! nicht angezeigt?
ja wie denn? Du weist einen String zu, brichst dann aber das Script ab, ohne irgendeine Ausgabe zu machen.
> Erst wenn ich exit(); entferne bleibt zwar das Formular erhalten nur sind die Felder nicht leer.
Klar, dann läufst du wieder in denselben Zweig wie im Fehlerfall, nur dass keine Fehlermeldung ausgegeben wird. Aber dafür wieder das Formular mit allen bisherigen Eingaben.
Wenn du willst, dass noch etwas anderes ausgegeben wird, musst du das auch irgendwo tun.
So long,
Martin
--
[Programmierer (m), seltener auch P~in (w)](http://community.de.selfhtml.org/zitatesammlung/zitat110):
Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
ja wie denn? Du weist einen String zu, brichst dann aber das Script ab, ohne irgendeine Ausgabe zu machen.
Erst wenn ich exit(); entferne bleibt zwar das Formular erhalten nur sind die Felder nicht leer.
ok. das exit ist jetzt weg!
Klar, dann läufst du wieder in denselben Zweig wie im Fehlerfall, nur dass keine Fehlermeldung ausgegeben wird. Aber dafür wieder das Formular mit allen bisherigen Eingaben.
Wenn du willst, dass noch etwas anderes ausgegeben wird, musst du das auch irgendwo tun.
also müsste ich die Seite dann noch einmal aufrufen, wenn ja wie ?
So long,
Martin
also müsste ich die Seite dann noch einmal aufrufen, wenn ja wie ?
Weiterleitung http://de.selfhtml.org/html/kopfdaten/meta.htm#weiterleitung@title=so. Dazu könntest Du eine Variable im php-Teil setzen, und im html Teil je nach Variableninhalt den meta-refresh schreiben.
Oder ein Link, um den Benutzer einzubeziehen...
"Sie haben das Formular erfolgreich ausgefüllt. Die Daten wurden gespeichert, etc. <a href='formular.php' title='Zurück zum Formular'>Formular erneut ausfüllen</a>.
Wenn du willst, dass noch etwas anderes ausgegeben wird, musst du das auch irgendwo tun.
Oder gleich, wie Martin sagt, das Formular aufrufen/einbinden. Wenn Du das Modularisierst wäre es einfacher. Oder Du lässt das die weg und löscht $eingabe mittels $eingabe = array();
.
Cheers,
Baba
Oder Du lässt das die weg und löscht $eingabe mittels
$eingabe = array();
.
Cheers,
Baba
Dankeschön, genau das war es.
Tach!
if (empty($error)) {
/*
* Hier z.B. alle Daten in der Datenbank abspeichern und darauf hin
* den Benutzer an eine andere Stelle weiterleiten.
*/
$success = 'Alle Eingaben waren okay!';// Scriptablauf abbrechen, da alles wichtige erledigt ist
exit();
}
>
> Was ich aber nicht verstehe ist, wenn alle Eingaben i.O. sind warum bekomme ich die Meldung 'Alle Eingaben waren okay! nicht angezeigt?
Warum auch? Siehst du da irgendeine Anweisung, die eine Ausgabe erzeugt?
P.S. Der gezeigte Affenformular-Code arbeitet unzulänglich. Wenn die Eingabedaten die Prüfung bestehen, werden sie sofort mit htmlspecialchars() behandelt. Das ist an der Stelle aber falsch, weil damit zwar die Daten für das Ausgabemedium HTML vorbereitet sind, dafür aber für alle anderen Medien unbrauchbar gemacht wurden. Es ist ja angedeutet, dass die Daten dann noch ein eine Datenbank geschrieben werden sollen. Dafür braucht man aber die Rohdaten. Der Ausgabekontext darf erst dann beachtet werden, wenn es wirklich zur Ausgabe kommt und nciht bereits in vorhergehenden Verarbeitungsschritten. Siehe [Kontextwechsel](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel) und da speziell [HTML in der Datenbank](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln#HTML_in_der_Datenbank).
dedlfix.
Tach!
P.S. Der gezeigte Affenformular-Code arbeitet unzulänglich. Wenn die Eingabedaten die Prüfung bestehen, werden sie sofort mit htmlspecialchars() behandelt. Das ist an der Stelle aber falsch, weil damit zwar die Daten für das Ausgabemedium HTML vorbereitet sind, dafür aber für alle anderen Medien unbrauchbar gemacht wurden. Es ist ja angedeutet, dass die Daten dann noch ein eine Datenbank geschrieben werden sollen. Dafür braucht man aber die Rohdaten. Der Ausgabekontext darf erst dann beachtet werden, wenn es wirklich zur Ausgabe kommt und nciht bereits in vorhergehenden Verarbeitungsschritten.
dedlfix.
ok, das mache ich wenn das eine erst mal funktioniert.
Gruß Danke
hi,
ich habe mit Hilfe eines Tutorials [..]
Hast Du Lust, Dir sowas mal als leichter verständlichen Code nach dem MVC-Pattern anzuschauen?
Hotti