Verschachtelte Formularabfragen
P@t
- php
0 Sven Rautenberg0 P@t0 Sven Rautenberg0 P@t
0 Tom
Hallo allerseits!
Kann man eine verschachtelte Formularabfrage - keine Datenbankabfrage - mit PHP erzeugen?
z.B.
...
if($a1=="")
{
print "<input type=radio name=a1 value=1>f1</input>";
print "<input type=radio name=a1 value=2>f2</input>";
}
else
{
if($a1==1)
{
echo "Du hast f1 gewählt! Beantworte nunmehr folgende Frage:";
print "<input type=text name=txt value=$txt></input>";
}
else
{
echo "....";
}
}
...
In der Datenbank habe ich diesbezüglich nur etwas zu verschachtelten Datenbankabfragen gefunden.
Herzliche Grüße
P@t
Moin!
Hallo allerseits!
Kann man eine verschachtelte Formularabfrage - keine Datenbankabfrage - mit PHP erzeugen?
Grundsätzlich ja.
z.B.
if($a1=="")
{
}
else
{
if($a1==1)
{
}
else
{
}
}
Bedenke, dass zuerst PHP auf dem Server läuft und eine Seite an den Browser schickt, und erst dann der Browser diese Seite darstellt. Das, was du da "verschachteln" willst, erfordert also mehrfaches Formularabsenden, damit PHP nach und nach immer mehr gewählte Daten ansammelt und entsprechende Fragen stellen kann.
Dazu wirst du dann vermutlich viele hidden-Formularfelder benötigen (bereits gewählte Werte werden im neu generierten Formular zwischengespeichert), oder einen Session-Mechanismus (dann werden die Werte auf dem Server zwischengespeichert).
- Sven Rautenberg
Hallo Sven!
Ich habe das komplette Script (Fragebogen) mit hidden-Felder "gepflastert", da in dem Script ein mehrfaches Absenden erforderlich sein wird.
Irgendwie stolpert es aber über gerade diese erneute Sendung.
Hast du da irgendwelche Erfahrungswerte?
HG
P@t
Moin!
Ich habe das komplette Script (Fragebogen) mit hidden-Felder "gepflastert", da in dem Script ein mehrfaches Absenden erforderlich sein wird.
Irgendwie stolpert es aber über gerade diese erneute Sendung.
Hast du da irgendwelche Erfahrungswerte?
Inwiefern "Erfahrungswerte"? Betrachte deinen generierten Quelltext. Steht da vernünftiges HTML drin (du mußt u.U. einfache oder doppelte Anführungszeichen in Entities wandeln, wenn du hidden-Felder befüllst.
Ansonsten: Fehlermeldung, Problembeschreibung und Codeausschnitte würden helfen - jedenfalls nach _meinen_ Erfahrungswerten. :)
- Sven Rautenberg
Hi Sven!
Ansonsten: Fehlermeldung, Problembeschreibung und Codeausschnitte würden helfen - jedenfalls nach _meinen_ Erfahrungswerten. :)
Ich habe im Posting von Tom <a href="http://forum.de.selfhtml.org/?t=61522&m=347512"> Korrektur </a> den Quelltext hinterlegt.
HG P@t
Hallo,
da benötigst Du nur ein einziges hidden-Field:
$DATA = unserialize(base64_decode($_POST["hid_data"]));
$packed_data = base64_encode(serialize($DATA));
<input type="hidden" name="hid_data" value="<?php echo $packed_data; ?>">
Im Array $DATA werden die Daten gesammelt. Bau auch einen Levelzähler ein. So kannst Du dich von Level zu Level hangeln. Das Script ist dann immer orientiert, welche Fragerunde nun als nächste dran ist. Den Levelzähler setzt Du nur weiter, wenn die Fragen ordentlich beantwortet wurden, sonst bleibt er stehen, wo er war und stattdessen wird $DATA["fehlermeldung"] mit einem Wert gefüllt.
Die selbe Seite wird dem User also erneut vorgelegt. Die Fehlermeldung erscheint (vom Ausgabealgorithmus generiert). Wenn der User die Fragen nun zufriedenstellend beantwortet, wird der Zähler auf die nächste Seite weitergesetzt und die Fehlermeldung gelöscht.
...
Jede "Seite" bekommt im Script eine eigene Funktion.
Du musst nur ganz konsequent
voneinander trennen.
Und das Knackproblem ist ein ganz anderes: den Erstaufruf des Scriptes zu identifizieren, damit alles initialisiert werden kann. Aber das wirst Du bestimmt hinbekommen ;-))
Liebe Grüße
Tom
Sorry,
- Ausgabe-Routine
- Datenerfassung im Script
das sollte Datenerfassung im Client-Formular heißen
- Datenverarbeitung, Fehlercheck
voneinander trennen.
Nochmal Grüße
Tom
Hallo Tom!
Danke, für deine Hilfe.
Da ich noch Anfänger bin, habe ich das Script mit etwas viel Schreibarbeit produziert. Werde bei der Umwandlung deinen Rat befolgen. Nur leider habe ich keine Zeit mehr, es jetzt grundsätzlich zu überarbeiten.
Folgender Quellcode liegt meiner Frage zu Grunde:
print "<b class=question>$question[23]</b><br>";
if($anzahl=="")
{
print "<input type=radio name=anzahl value=ja> ja<br>";
print "<input type=radio name=anzahl value=nein> nein<br>";
}
else
{
if($anzahl=="nein")
{
print "<b class=answer>Sie reichen nicht aus.</b>";
// Hier liegt der Knackpunkt! Wenn die Anzahl nicht i.O. ist, dann soll noch eine weitere Frage gestellt werden.
print "<br>In welchem Bereich arbeitest du? <input type=text name=bereich>";
print "<input type=hidden name=bereich value=$bereich>";
print "<input type=hidden name=anzahl value=$anzahl>";
}
else
{
print "<b class=answer>Die Anzahl ist ok!.</b>";
print "<input type=hidden name=anzahl value=$anzahl>";
}
}
Warum speichert das Script, bei einer Folgefrage, nicht die Antwort?
HG P@t
Hi,
Du solltest Dir dafür einen Baum aufbauen. Erstmal auf Papier malen.
Wurzelpunkt:
Hallo, hier stelle ich Ihnen ein paar Fragen...
Wollen Sie antworten?
--link zur Frage 1--
1--falsch--->11---falsch-->
|
|
+--richtig +-------<-------+
| v |
-----12---falsch---->12-+
|
|
+--richtig-->122
Das ergibt dann später, je nach Anzahl der Antwortmöglichkeiten, eine Matrix mit den Fragenummern.
Frage richtig falsch garnicht
1 12 11 999 \
11 12 13 999 |- Hier steht die nächste Frage
12 121 12 998 /
Ich hoffe, Du kannst Dir vorstellen, wie man so eine Navigation durch die Gesamtheit aller Fragen und Antworten aufbauen kann, ohne sich totzumachen.
Den Fragezähler setzt Du einfach nur auf
$neu = $matrixneu[$alt][$ergebnis_der_pruefung];
if (!$neu) {abbruchfunktion();}
Für den Fall, dass $neu dann mal false ergibt, weil ausgerechnet der Knoten nicht definiert wurde, solltest Du eine letzte Ausgabe generiereren, die das Script dann anschließend mit exit abbricht.
Ich hoffe,
ich konnte Dir helfen
Tom
Hallo Tom,
Ich hoffe,
ich konnte Dir helfen
auf jeden Fall! :-)
Es war zwar jetzt für die Lösung nicht relevant, aber ich werde mir in Zukunft einen solche Matrix aufbauen, damit ich das Programm besser lesen kann.
Vielen herzlichen Dank für deine Mühe!
P@t