Reload bei mehrseitigem Formular
Honda
- php
Hallo,
ich erstelle gerade ein mehrseitiges Anmeldeformular, bestehend aus 2 Seiten Anmeldung und einer dritten Bestätigungsseite. Es funktioniert auch sehr gut bis auf einen Haken.
Wenn ich die erste Seite abgeschickt habe und unmittelbar darauf auf den "Reload"-Button im Browser klicke wird die zweite Seite übersprungen und eine leere Zeile in die entsprechende Tabelle geschrieben.
Anbei seht Ihr einen Ausschnitt aus dem Code, der für das weiterleiten auf die nächste Seite verantwortlich ist.
Hat jemand eine Idee wie ich diesen Fehler ausmerzen könnte?
Merci für jeglichen Support!
Honda
*****CODEAUSSCHNITT******
if ($speichern) {
checkformular($_SESSION['page']);
if($fehler)
foreach ($fehler as $key => $value){
echo "<font color=red>* $value.<br>";}
else if (!$fehler and !$_POST['Languages']=="selected.."){
$_SESSION['page']++;
}
else $_SESSION['page']--;
}
switch ($_SESSION['page']){
case '1':
include ("form1.php");
break;
case '2':
include ("form2.php");
break;
case '3':
include ("form3.php");
session_unset();
session_destroy();
}
hallo japanisches auto ;)
*****CODEAUSSCHNITT******
if ($speichern) {
checkformular($_SESSION['page']);
if($fehler)
foreach ($fehler as $key => $value){
echo "<font color=red>* $value.<br>";}else if (!$fehler and !$_POST['Languages']=="selected.."){
$_SESSION['page']++;
}
ich würde sagen, dein check an dieser stelle ist unzuverlässig und damit wird auch bei einem reload die session-page variable hochgezählt. deswegen wird in deinem switch gleich die dritte seite includiert.
andreas
hi,
Wenn ich die erste Seite abgeschickt habe und unmittelbar darauf auf den "Reload"-Button im Browser klicke wird die zweite Seite übersprungen und eine leere Zeile in die entsprechende Tabelle geschrieben.
natürlich - du zählst doch jedes mal den in der session stehenden wert stumpf hoch.
Hat jemand eine Idee wie ich diesen Fehler ausmerzen könnte?
überlege dir eine andere möglichkeit in erfahrung zu bringen, welche teile schon abgearbeitet sind, als irgendeinen sinnfreien hochzählmechanismus.
beispielsweise, in dem du per hidden field aus dem formular einen wert mitgibst, der dich erkennen lässt, ob die geposteten daten von formularseite 1, 2 oder 315 kamen.
gruß,
wahsaga
echo $begrueszung;
Der Grund, warum du auf dieses letzten Endes nicht ganz so kompliziertes ;) Problem bisher noch keine Antwort bekommen hast, könnte darin liegen, dass dein Code scheußlich formatiert ist. Man kann deine Kontrollstrukturen nur sehr schlecht erkennen.
else if (!$fehler and !$_POST['Languages']=="selected.."){
Hier liegt der Hund begraben.
Aber erstmal was nebensächliches: Du fragst ja vorher schon mit
if ($fehler)
ab, ob $fehler true ist. Das !$fehler ist hier überflüssig. In diesen else-Zweig kommst du ja nur, wenn !$fehler true ergibt.
!$fehler ist also an dieser Stelle immer true, schauen wir uns mal
!$_POST['Languages'] == "selected.."
an. Die Operatoren ! und == sind gleichwertig, dieser Ausdruck wird hier also von links nach rechts ausgewertet.
Dein ! bewirkt, dass $_POST['Languages'] negiert wird.
Hier kommt dann noch die automatische Typ-Umwandlung von PHP zum Zuge: Die Strings '' oder '0' ergeben in boolean umgewandelt false alle anderen ergeben true.
Da der erste Teil nun vom Typ boolean ist, wird der String "selected.." ebenfalls in boolean umgewandelt und das ergibt true. (siehe auch PHP-Handbuch - Anhang O. PHP type comparison tables)
Ich denke, nun solltest du nachvollziehen können, warum dein Problem beim Reload auftritt, und außerdem verweise ich noch auf die Vergleichsoperatoren-Handbuchseite.
echo "$verabschiedung $name";
!$fehler ist also an dieser Stelle immer true, schauen wir uns mal
!$_POST['Languages'] == "selected.."
an. Die Operatoren ! und == sind gleichwertig, dieser Ausdruck wird hier also von links nach rechts ausgewertet.
Dein ! bewirkt, dass $_POST['Languages'] negiert wird.
Hier kommt dann noch die automatische Typ-Umwandlung von PHP zum Zuge: Die Strings '' oder '0' ergeben in boolean umgewandelt false alle anderen ergeben true.
Da der erste Teil nun vom Typ boolean ist, wird der String "selected.." ebenfalls in boolean umgewandelt und das ergibt true.
Hallo,
Vorerst einmal, danke für die Antwort!
Wenn ich das nun richtig verstanden habe, wird mein $_POST['Languages'] == "selected.." in ein "TRUE" umgewandelt. Ist es denn nicht so, dass ich mit ! dieses TRUE negiere,... womit dieses "FALSE" wird?
Was ja dann wieder meiner Intention entspricht, da ja die Aktion nur durchgeführt werden soll, wenn das Select-Feld "Languages" nicht berührt wurde (sprich auf "select.." bleibt).
Wenn dem nicht so ist,.... wie sonst kann ich dem gleichen Ergebnis gelangen?
Honda
echo $begrueszung;
Wenn ich das nun richtig verstanden habe, wird mein $_POST['Languages'] == "selected.." in ein "TRUE" umgewandelt. Ist es denn nicht so, dass ich mit ! dieses TRUE negiere,... womit dieses "FALSE" wird?
Ja, so ist es _nicht_. Zuerst wirkt der Negator ! auf das $_POST['Languages'] (nur auf dieses!) dann erst kommt das == mit dem "selected.." an die Reihe.
Falls dir das auch noch nicht klar ist: $_POST ist nach dem Reload ein leeres Array, ein Element mit dem Key 'Languages' existiert nicht[1], da dein Formular in dem Fall nicht abgesendet wurde. $_POST['Languages'] liefert NULL zurück und das entspricht false.
Wenn dem nicht so ist,.... wie sonst kann ich dem gleichen Ergebnis gelangen?
O.K. Wenn dir der W(L)ink mit dem Zaunpfahl noch nicht gereicht hat... :-)
Entweder du sorgst mittels Klammerung für die gewünschte Auswerte-Reihenfolge oder du verwendest statt == den Vergleichs-Operator der auf ungleich testet: !=
(Letzeres ist die übersichtlichere Variante.)
echo "$verabschiedung $name";
[1] Dies würde dir auch ein eingeschaltetes error_reporting(E_ALL); sagen.