Astovidatu: Variable Importieren.

Sers allerseits,
habe folgende sub:
----
sub do_quiz(){
 my $antwort = 1;
 my $count = 0;
 my @answers = ''; #die richtigen antworten
 my @quiz = <QUIZ>;
 close QUIZ;
 foreach my $zeile (@quiz) {
  if ($zeile =~ /^F\d{1,2}:.\s\w+/) {
   print "<form name="form1" method="post" action="do_quiz.cgi">";
   print "$zeile<br>";
  }
  if ($zeile =~ /:ANSW:$/) {
   $answers[$count] = $antwort;
   $count++;
  }
  if ($zeile =~ /[1].+/) {
   if ($zeile =~ /^brake$/) {
    $zeile =~ s/brake/Weiß nicht/;
   }
   if ($zeile =~ /:ANSW:$/) {
    $zeile =~ s/:ANSW://;
   }
   print "<input type="radio" name="antwort" value="$antwort"> $zeile<br>";
   $antwort++;
  }
  if ($zeile =~ /Weiß nicht$/) {
   print "</form><br>";
  }
 }
 my $uname = param('uname');
 my $email = param('email');
 print "<form name="form2" method="post" action="results.cgi">";
 print "<input type= "hidden" name="uname" value="$uname">";
 print "<input type= "hidden" name="email" value="$email">";
 print "<input type= "hidden" name="quiz" value="$quiz">";
 print "<input type= "hidden" name="array" value="@answers">";
 print "<INPUT TYPE="submit" VALUE="Fertig"></form>";
}
-----
Es geht im prinzip hierrum:
print "<input type="radio" name="antwort" value="$antwort"> $zeile<br>";
Ich brauche in der results.cgi param('antwort') um die Eingabe des Users mit den richtigen Antworten zu vergleichen. Natürlich geht das so nicht, da ich "submit" nur im unteren <form> habe.
Also hab ich am ende des scripts: "redirect('http://www.security-project.org/cgi-bin/results.cgi?antwort=$antwort');"
angehängt. Funktioniert nicht.
Wie bekomm ich nun die werte in results.cgi?


  1. a-e.) ↩︎

  1. Es geht im prinzip hierrum:
    print "<input type="radio" name="antwort" value="$antwort"> $zeile<br>";
    Ich brauche in der results.cgi param('antwort') um die Eingabe des Users mit den richtigen Antworten zu vergleichen. Natürlich geht das so nicht, da ich "submit" nur im unteren <form> habe.

    So ganz versteh ich das nicht, es klingt aber so als ob du 2 Skripte gleichzeitig aufrufen möchtest, das geht nicht. Du musst halt entweder in das 2. Formular dein gewünschtes Feld integrieren oder in dem anderen skript das machen was du in results.cgi machen willst (evtl. ein Libary benutzen)

    Struppi.

    1. »»So ganz versteh ich das nicht, es klingt aber so als ob du 2 Skripte »»gleichzeitig aufrufen möchtest, das geht nicht. Du musst halt »»entweder in das 2. Formular dein gewünschtes Feld integrieren oder in »»dem »» anderen skript das machen was du in results.cgi machen willst »»(evtl. ein Libary benutzen)
      Du meinst einfach <input type=hidden name=antwort value=$antwort> in die 2te form einfügen? Das wird so nicht funktionieren. Weil $antwort bei jedem foreachn durchlauf eine andere zahl zugewiesen bekommt. Das heist am ende wäre $antwort die zu letzt ausgegeben antwort des quiz (wenn mein quiz 50 antworten hätte dann $antwort=50).
      Was ich brauche sind ALLE zahlen der antworten die der user ausgewählt hat, so dass ich später checken kann ob er nun die richtige oder falsche antwort ausgewählt hat, die zahlen der richtigen antworten übergebe ich hier: " print "<input type= "hidden" name="array" value="@answers">";".
      In dem script wird ja für jedes frage/antworten paar eine seperate <form>..</form> ausgegeben.

      1. Du zietierst sehr unleserlich. Ich kann kaum erkennen, was ich geschrieben habe und was du.

        Was ich brauche sind ALLE zahlen der antworten die der user ausgewählt hat, so dass ich später checken kann ob er nun die richtige oder falsche antwort ausgewählt hat, die zahlen der richtigen antworten übergebe ich hier: " print "<input type= "hidden" name="array" value="@answers">";".
        In dem script wird ja für jedes frage/antworten paar eine seperate <form>..</form> ausgegeben.

        Ich versteh es immer noch nicht.

        Du hast doch im skript schon alle Antworten, warum willst du diese den unbedingt in das Formular einbauen?

        Struppi.

        1. Du zietierst sehr unleserlich. Ich kann kaum erkennen, was ich geschrieben habe und was du.

          War keine absicht, aber man kann seine posts ja nicht editieren.

          Ich versteh es immer noch nicht.
          Du hast doch im skript schon alle Antworten, warum willst du diese den unbedingt in das Formular einbauen?

          Ja die antworten hab ich, aber ich muss ja auch irgendwie checken ob die antworten richtig oder falsch sind, und in results.cgi mach ich genau das, ich vergleiche die zahlen der richtigen atnworten mit den zahlen der antworten die der user ausgewählt hat.

          Ok, also:
          print "<input type="radio" name="antwort" value="$antwort"> $zeile<br>"; <- Ich kann mit param('antwort') ja erst dann auf den user Input zugreifen nachdem ein "submit" button gedrückt wurde.
          In results.cgi mache ich folgendes; @usr_answers = param('antwort'), @usr_answers würde dann die Zahlen der jeweilig ausgewählten Antwort enthalten. Da die daten aber ja garnicht übertragen wurden ist @usr_answers undefiniert.
          Der submit button liegt in meiner 2ten form und nicht in der ersten. Das heist die daten der ersten form verschwinden einfach nachdem der submit button gedrückt wurde.

          Ich kann in der zweiten form auch nicht folgendes machen:
          print "<input type="hidden" name="antwort">";
          Weil die erste Form ja garkein submit button hat.

          Ich hoffe das ist jetzt verständlich.

          1. Ich hoffe das ist jetzt verständlich.

            Nein nicht wirklich.
            Trotz mehrmaligen durchlesens fällt mir es schwer zu verstehen was du, warum machst.
            Evtl. ist dein Problem, dass du zwei Skripte verwenden willst um auf die gleiche Sache zu reagieren.

            aber eigentlich bin ich nach wie vor davon überzeugt, dass du einen schweren design Fehler machst. Wobei mir aber nich klar ist was du wikrlich willst.

            Struppi.

            1. Evtl. ist dein Problem, dass du zwei Skripte verwenden willst um auf die gleiche Sache zu reagieren.

              »»
              Nein, wieso denn das? Ein script gibt das Quiz als HTML aus und übergibt, oder besser sollte die werte übergen die es mir im zweiten script ermöglichen zu überprüfen ob die Antworten des users richtig oder falsch sind. results.cgi macht nichts anderes als zu überprüfen ob die antworten falsch oder richtig sind und dann eine punktzahl ausgibt.

              aber eigentlich bin ich nach wie vor davon überzeugt, dass du einen schweren design Fehler machst. Wobei mir aber nich klar ist was du wikrlich willst.

              Das könnte allerdings sein, wo denkst du denn steckt der Design fehler?

              Ps: wenn ich anstatt radio buttons, checkboxes verwende und die subroutine etwas umschreibe funktioniert alles. Aber ich will ja radio buttons...

              1. Guten Morgen.,

                Das könnte allerdings sein, wo denkst du denn steckt der Design fehler?

                Dein Script 1 generiert aus irgendeiner (Text?)Datei ein HTML-Formular, das im Auge des Betrachters nach meiner Interpretation so aussehen dürfte:

                Frage 1: Blablubb
                () Antwort a
                () Antwort b
                ...
                Frage 2: Sabberfaselschwätz
                () Antwort a
                () Antwort b
                ...
                [Fertig]

                Du übergibst dem Script results.cgi alle möglichen Werte mit Hilfe von versteckten Eingabefeldern, u.a. auch dein Array @answers. Nun schau dir dein Script mal an und prüfe, wie und mit welchen Werten dieses Array gefüllt wird:

                $answers[$count] = $antwort;

                Da stehen also _alle_ richtigen(?) Antworten drin. Allerdings, die Antworten, die der Nutzer mittels Klick auf deine Radiobuttons gibt, werden durch das generierte Formular nirgendwo weitergegeben (wie dir Struppi bereits schrieb). Ein Klick auf [Fertig] hat also den Effekt, dass du $uname, $email, $quiz und @answers an results.cgi weitergibst, die Antworten des Benutzers jedoch nicht, weil die entsprechenden HTML-Elemente außerhalb des Formulares notiert sind, dessen Aktion dein Ergebnisscript ist. Darüber hinaus hätten alle Radiobuttons unabhängig von der Frage immer den Namen "antwort", sodass du nie alle Antworten erhalten wirst.

                Du solltest also dringend dein Konzept überarbeiten, so wie es jetzt ist, ist es m.E. ziemlich vermurkst :-)

                Freundschaft!
                Siechfred

                1. Dein Script 1 generiert aus irgendeiner (Text?)Datei ein HTML-Formular, das im Auge des Betrachters nach meiner Interpretation so aussehen dürfte:

                  Frage 1: Blablubb
                  () Antwort a
                  () Antwort b
                  ...
                  Frage 2: Sabberfaselschwätz
                  () Antwort a
                  () Antwort b
                  ...
                  [Fertig]

                  Genau!

                  $answers[$count] = $antwort;

                  Da stehen also _alle_ richtigen(?) Antworten drin. Allerdings, die Antworten, die der Nutzer mittels Klick auf deine Radiobuttons gibt, werden durch das generierte Formular nirgendwo weitergegeben (wie dir Struppi bereits schrieb). Ein Klick auf [Fertig] hat also den Effekt, dass du $uname, $email, $quiz und @answers an results.cgi weitergibst, die Antworten des Benutzers jedoch nicht, weil die entsprechenden HTML-Elemente außerhalb des Formulares notiert sind, dessen Aktion dein Ergebnisscript ist.

                  Genau, das sag ich doch die ganze zeit, das mein script niemals die werte der antworten des users bekommt weil eben die entsprechenden HTML-Elemente außerhalb des Formulars liegen.
                  Die frage ist wie bekomme ich die Antworten der Radiobuttons in results.cgi? Die radio buttons haben absichtlich alle den namen "antowrt" denn so kann ich sie später einem array zuweisen (@usr_answers = param('antwort')) und mit den richtigen antwort in @answers vergleichen.
                  Mein problem ist: wie schreibe ich das script so das ich die antworten alle übertragen bekomme? Geht das überhaupt, so wie das script jetzt aufgebaut ist oder müsste ich do_quiz komplett umschreiben?

                  Die sache ist halt die das ich ein sehr simples script schreiben wollte, wie man sieht ist es zu simpel geworden und ich kann es nur funktionsbereit schreiben indem ich checkboxes anstatt der radiobuttons verwende.

                  Vielen dank für die ausgiebige Antwort.

                  Gruß, Asto.

                  1. Hallo Astovidatu.

                    Genau, das sag ich doch die ganze zeit, das mein script niemals die werte der antworten des users bekommt weil eben die entsprechenden HTML-Elemente außerhalb des Formulars liegen.

                    Da du den Fehler erkannt hast, dürfte es nun ein leichtes sein, ihn zu beheben.

                    Die frage ist wie bekomme ich die Antworten der Radiobuttons in results.cgi? Die radio buttons haben absichtlich alle den namen "antowrt" denn so kann ich sie später einem array zuweisen (@usr_answers = param('antwort')) und mit den richtigen antwort in @answers vergleichen.

                    Vereinfacht sieht der HTML-Code, der von deinem Script erzeugt wird, so aus:

                    <form name="form1" method="post" action="do_quiz.cgi">
                      <!-- Die Fragen -->
                    </form>
                    <form name="form2" method="post" action="results.cgi">
                      <!-- Username, E-Mail usw. -->
                    </form>

                    Formular Nr. 1 (das mit den richtigen Antworten) wird nicht abgesendet. Selbst wenn es abgesendet werden würde, stünden die richtigen Antworten deinem Script "do_quiz.cgi" zur Verfügung, aber nicht "results.cgi". Eine einfachere Variante wäre diese:

                    <form name="form2" method="post" action="results.cgi">
                      <!-- Die Quizfragen -->
                      <!-- Username, E-Mail usw. als versteckte Eingabefelder -->
                    </form>

                    So würdest du auch die vom Benutzer gegebenen Antworten an results.cgi weiterreichen und könntest sie dort weiterverarbeiten.

                    Freundschaft!
                    Siechfred