Leeloo5E: Formulare: Variablenübergabe

Hallo,

ich kämpfe immer noch mit Perl und der Variablenübergabe aus einem Formular.
Ich habe mir ein Formular mit CGI aufgebaut. Nutze dabei start_form() sowie end_form(). Angezeigt wirds mir toll. Nen Submit-Button hab ich natürlich auch.

  
 print   $cgi->start_form( -method=>'POST',  
                              -action=>$LINK),  
            $cgi->checkbox( -name=>'dateCheck',  
                        -label=>'Datum'),  
            $cgi->br,  
            $cgi->submit(-value=>'Suchen',  
                    -name=>'searchAdv'),  
            $cgi->end_form();  

Wenn ich dann auf selbigen klicker, sollen ja die Variablen aus dem Formular übergeben werden. Nur kommt nix an ... Ich überprüfe mit

  
if ($cgi->param())  
{ print "ja"; }else{ print "nein"; }  

ob Variablen übergeben werden. Ausgegeben wird mir jedoch "nein". Also nicht. Wenn ich die Felder direkt ansteuere oder den Codeschnipsel von SELFHTML nutze:

  
  
    print $cgi->param('Textfeld');  
  
    my @Feldnamen = $cgi->param();  
  
    foreach my $Feld (@Feldnamen) {  
        print $cgi->b('Feldname: '),  
              $Feld,  
              $cgi->b(', Inhalt: '),  
              $cgi->param($Feld), "<br>";  
      }  

Kommt auch nix.

Hab ich vergessen, was zu beachten, dass da nix übergeben wird? Ich finds ziemlich merkwürdig und bin eingentlich der Meinung, ich mache alles richtig.

Gruß,
Leeloo

--
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  1. print   $cgi->start_form( -method=>'POST',
                                  -action=>$LINK),
                $cgi->checkbox( -name=>'dateCheck',
                            -label=>'Datum'),
                $cgi->br,
                $cgi->submit(-value=>'Suchen',
                        -name=>'searchAdv'),
                $cgi->end_form();

      
    so0weit ich das sehe ist das i.O.  
      
    
    > Wenn ich dann auf selbigen klicker, sollen ja die Variablen aus dem Formular übergeben werden. Nur kommt nix an ... Ich überprüfe mit  
    > ~~~perl
      
    
    > if ($cgi->param())  
    > { print "ja"; }else{ print "nein"; }  
    > 
    
    

    auch das sollte i.O. sein.

    Kommt auch nix.

    Dann machst du was falsch.

    Hab ich vergessen, was zu beachten, dass da nix übergeben wird? Ich finds ziemlich merkwürdig und bin eingentlich der Meinung, ich mache alles richtig.

    Bei dem was du uns gezeigt hast, ja.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hallo,

      da bin ich ja erstmal beruhigt, dass am Code alles i.O. ist.

      print   $cgi->start_form( -method=>'POST',
                                    -action=>$LINK),
                  $cgi->checkbox( -name=>'dateCheck',
                              -label=>'Datum'),
                  $cgi->br,
                  $cgi->submit(-value=>'Suchen',
                          -name=>'searchAdv'),
                  $cgi->end_form();

        
      Zwischen der Checkbox und dem Suchen-Button kommen nur weitere Felder, Checkboxen etc.  
        
      
      > so0weit ich das sehe ist das i.O.  
      >   
      > > Wenn ich dann auf selbigen klicker, sollen ja die Variablen aus dem Formular übergeben werden. Nur kommt nix an ... Ich überprüfe mit  
      > > ~~~perl
        
      
      > > if ($cgi->param())  
      > > { print "ja"; }else{ print "nein"; }  
      > > 
      
      

      Wenn ich den Browser-Cache lösche, dann kommt "ja" und mit dem weiteren Code auch die übermittelten Werte. Wenn ich die Seite dann jedoch neu lade, neue Werte angebe und auf "Suchen" klicke, kommt wieder "nein". Als ob mal was übergeben wird und mal nicht.
      Langsam tippe ich auf Browser oder Server.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
      1. print   $cgi->start_form( -method=>'POST',
                                      -action=>$LINK),

        Was steht eigtnlich in $LINK?
        Du willst hier ja keine HTML Seite aufrufen sondern das Skript?

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo,

          print   $cgi->start_form( -method=>'POST',
                                        -action=>$LINK),

          Was steht eigtnlich in $LINK?
          Du willst hier ja keine HTML Seite aufrufen sondern das Skript?

          Da steht der Pfad zum Skript, der das Formular aufruft und auch wieder die Formulardaten entgegenimmt und auswertet: "/cgi-bin/search".

          Am Anfang wird dann abgefragt, ob halt das Formular aufgerufen werden soll, oder die Auswertung:

            
          if(defined $cgi->param('searchAdv')){  
              ## Such-Auswertung  
              &searchadv;  
          }else {  
              ## Anzeige der Suchseite  
              &searchstart;  
          };  
          
          

          Diese Abfrage funktioniert übrigens. D.h. er erkennt schon richtig, ob der Button searchAdv angeklickt wurde oder nicht.

          Ich könnte der Funktion searchadv als Variable ja noch das Array mit den Formularwerten übergeben, also &searchadv(&cgi->param());

          Gruß,
          Leeloo

          --
          "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
          1. Hallo,

            print   $cgi->start_form( -method=>'POST',
                                          -action=>$LINK),

            Was steht eigtnlich in $LINK?
            Du willst hier ja keine HTML Seite aufrufen sondern das Skript?

            Da steht der Pfad zum Skript, der das Formular aufruft und auch wieder die Formulardaten entgegenimmt und auswertet: "/cgi-bin/search".

            Das reicht nicht unbedingt, da kommt es drauf wie dein Server konfiguriert ist, denn da muss die URL zum skript stehen.

            Diese Abfrage funktioniert übrigens. D.h. er erkennt schon richtig, ob der Button searchAdv angeklickt wurde oder nicht.

            Dann stimmt irgendwas anderes in deinem Skript nicht. Mit dem bisherigen Wissen läßt sich aber nicht sagen was.

            Ich könnte der Funktion searchadv als Variable ja noch das Array mit den Formularwerten übergeben, also &searchadv(&cgi->param());

            Könntest du, aber warum solltest du?
            Der Code ist aber so falsch, es muss heißen:
            searchadv($cgi->param())

            Das '&' Zeichen vor dem Funktionsaufruf solltest du wegmachen. Das ist seit ewigen Zeiten nicht mehr nötig.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hallo,

              Da steht der Pfad zum Skript, der das Formular aufruft und auch wieder die Formulardaten entgegenimmt und auswertet: "/cgi-bin/search".

              Das reicht nicht unbedingt, da kommt es drauf wie dein Server konfiguriert ist, denn da muss die URL zum skript stehen.

              Genau das ist die URL. Er kommt ja bis zu Anfang, wertet if-Bedingung aus uns springt zur Subroutine und in der kommen halt die Werte von $cgi->param nicht an.

              Ich könnte der Funktion searchadv als Variable ja noch das Array mit den Formularwerten übergeben, also &searchadv(&cgi->param());

              Könntest du, aber warum solltest du?
              Der Code ist aber so falsch, es muss heißen:
              searchadv($cgi->param())

              Das '&' Zeichen vor dem Funktionsaufruf solltest du wegmachen. Das ist seit ewigen Zeiten nicht mehr nötig.

              Oh, da hab ich mich nur vertippt. Sollte schon ein $ sein. Kein &.
              Ich hätte gedacht, weil er unterwegs (also bei dem Aufruf der Subroutine) $cgi->param() scheinbar wegwirft, übergeb ich der Subroutine eben diese Variablen als Array.

              Gruß,
              Leeloo

              --
              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
              1. Da steht der Pfad zum Skript, der das Formular aufruft und auch wieder die Formulardaten entgegenimmt und auswertet: "/cgi-bin/search".

                Das reicht nicht unbedingt, da kommt es drauf wie dein Server konfiguriert ist, denn da muss die URL zum skript stehen.

                Genau das ist die URL. Er kommt ja bis zu Anfang, wertet if-Bedingung aus uns springt zur Subroutine und in der kommen halt die Werte von $cgi->param nicht an.

                dann muss es, wie gesagt was anderes sein, mit den bisherigen infos  läßt sich dein Problem nicht lösen

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Hallo,

                  dann muss es, wie gesagt was anderes sein, mit den bisherigen infos  läßt sich dein Problem nicht lösen

                  noch mehr infos hab ich nicht. mehr mach ich nicht. liegt sicher an was anderes. muss eben nur noch herausfinden an was.

                  Vielen Dank trotzdem.

                  Gruß,
                  Leeloo

                  --
                  "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                  1. dann muss es, wie gesagt was anderes sein, mit den bisherigen infos  läßt sich dein Problem nicht lösen

                    noch mehr infos hab ich nicht. mehr mach ich nicht. liegt sicher an was anderes. muss eben nur noch herausfinden an was.

                    das du nicht mehr machst glaub ich nicht, was machen die Funktionen searchadv und searchstart?

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Hallo,

                      das du nicht mehr machst glaub ich nicht, was machen die Funktionen searchadv und searchstart?

                      searchstart macht ein paar DB-Abfragen und baut dann das Formular auf, in dem der Benutzer eine Auswahl treffen kann, wonach er denn suchen möchte.

                      searchadv soll die Werte aus dem Formular erhalten und sie auswerten bzw. je nach übergebenen Werten eine DB-Abfrage machen und ein Ergebnis ausgeben. Jedoch kann eben $cgi->param() in searchadv nicht verwendet werden. Dort ist auch die Abfrage, ob denn in $cgi->param() überhaupt was drin ist.

                      Ich überlege gerade, ob es was damit zu tun haben könnte, dass ich schon vor

                        
                      if(defined $cgi->param('searchAdv')){  
                          ## Auswertung des Suchergebnisses  
                          &searchadv;  
                      }else {  
                          ## Anzeige der Suchseite  
                          &searchstart;  
                      };  
                      
                      

                      mit

                        
                      print $cgi->header(),  
                            $cgi->start_html( -title=>"Erweiterte Suche",  
                                              -style=>{-src=>['/stylesheets/default.css'],  
                                              -media => 'screen'}),  
                      
                      

                      die Ausgabe der Seite starte. Aber if (defined $cgi->param('searchAdv'); funktioniert ja, obwohl ich vorher die Ausgabe der neuen HTML-Seite starte.

                      Gruß,
                      Leeloo

                      --
                      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  2. Hey,
    ich möchte das Problem bei mir nachstellen. Baue mir einen Testcase: verringere den Umfang deines Programms aufs Nötigste, das das Fehlverhalten noch aufzeigt, und poste den Quellcode sowie die Rahmenbedingungen.

    Eingabe- und erwartete und tatsächliche Ausgabedaten kann ich schon deinem Ausgangsposting entnehmen.

    --
    水-金-地-火-木-土-天-海-冥
    1. Hallo,

      ich möchte das Problem bei mir nachstellen. Baue mir einen Testcase: verringere den Umfang deines Programms aufs Nötigste, das das Fehlverhalten noch aufzeigt, und poste den Quellcode sowie die Rahmenbedingungen.

      Der minimale Code, der bei mir ebenfalls das nicht korrekte Verhalten zeigt.

        
      #! /usr/bin/perl -w  
      use strict;  
      use DBI;  
      use CGI;  
      use CGI::Carp qw(fatalsToBrowser);  
      my $cgi = new CGI;  
        
      ## Ausgabe der HTML-Seite starten ##################################  
      print $cgi->header(),  
            $cgi->start_html(-title=>"Erweiterte Suche",  
                          -style=>{-src=>['stylesheets/default.css'],  
                             -media =>'screen'}),  
            $cgi->start_div({-id=>"container"}),  
                             $cgi->start_div({-id=>"liste"});  
        
      ### Auswertung der uebergebenden Parameter ########################  
      if(defined $cgi->param('searchAdv')){  
        
          ## Testausgabe - Werte werden noch korrekt ausgegeben  
          my @Feldnamen = $cgi->param();  
        
         foreach my $Feld (@Feldnamen) {  
              print $cgi->b('Feldname: '), $Feld,  
                        $cgi->b(', Inhalt: '),  
                        $cgi->param($Feld), "<br>"; }  
        
          ## Aufruf der Funktion zum Auswerten der Daten  
          &advsearch;  
        
      }else {  
        
          ## Anzeige der Suchseite  
          &advsearchstart;  
      };  
        
      ### Subroutine zum Anzeigen der Suchmaske  
      sub advsearchstart  
      {  
          ## Ueberschrift  
          print $cgi->h1("Erweiterte Suche");  
          print $cgi->start_form( -method=>'POST',  
                                  -action=>$LINK),  
                $cgi->checkbox( -name=>'dateCheck',  
                             -label=>'Datum'),  
                $cgi->br,  
                $cgi->hr,  
                $cgi->submit(-value=>'Suchen',  
                       -name=>'searchAdv'),  
                $cgi->end_form(),  
                $cgi->end_div();  
      };  
        
      sub advsearch {  
        
          ## Ueberschrift  
          print $cgi->h1("Suchergebnis");  
        
          ## Testausgabe - bleibt leer  
          my @Feldnamen = $cgi->param();  
        
          foreach my $Feld (@Feldnamen) {  
                print $cgi->b('Feldname: '),  
                        $Feld,  
                        $cgi->b(', Inhalt: '),  
                        $cgi->param($Feld), "<br>"; }  
        
          ## Ueberpruefen, ob etwas ausgewaehlt  
          if ($cgi->param()) {  
        
              print $cgi->p("ja");  
        
          }else{  
            ## Wenn nichts ausgewaehlt wurde  
            print $cgi->p("keine Auswahl getroffen");  
          }  
        
        
          # Ende der Seite  
          print   $cgi->end_div();  
        
      };## Ende Funktion advsearch  
        
      ## Seite zumachen  
      print   $cgi->div({-id=>"footer"}, "ENDE"),  
              $cgi->end_div(),  
              $cgi->end_html();  
        
      ##EOF##  
        
      
      

      Hm ... anstatt eine Subroutine aufzurufen, könnte ich ja auch gleich oben in der if-Bedingung die Formularwerte auswerten. Da is ja noch alles da.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
      1. Der minimale Code, der bei mir ebenfalls das nicht korrekte Verhalten zeigt.

        Dieser Code erzeugt nur einen Fehler, weil $LINK nirgends definiert wurde.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo,

          Der minimale Code, der bei mir ebenfalls das nicht korrekte Verhalten zeigt.

          Dieser Code erzeugt nur einen Fehler, weil $LINK nirgends definiert wurde.

          Hatte ich beim Kopieren wohl übersprungen ;)

          Auch mit definiertem $LINK, nämlich der Rückkehr auf das selbige Skript, werden eben die Parameter in $cgi->param nicht an die Subroutine übergeben.
          Ich darf vor der Abfrage, wo es denn weiter gehen soll, die HTML-Seite nicht beginnen, sondern muss das in der Subroutine machen, was bedeutet, dass ich jedesmal Header und Footer neu eintippern muss, anstatt das nur einmal ganz oben für den Header und ganz unten für den Footer zu machen. Sonst komme ich nicht weiter.

          Gruß,
          Leeloo

          --
          "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
          1. Auch mit definiertem $LINK, nämlich der Rückkehr auf das selbige Skript, werden eben die Parameter in $cgi->param nicht an die Subroutine übergeben.

            Hast du den von mir modifizierten Code mal getestet?
            Bei mir funktioniert er und zwar auf zwei verschiedenen Systemen.

            Tut mir leid, ich versuch jetzt seit gestern dir zu helfen und habe dir bereits mehrmals gesagt, dass der Fehler nicht daran liegt, du weigerst dich aber standhaft irgendeinen, für DEIN Problem, relevanten Code preiszugeben.

            Ich hab alles versucht dir zu helfen, du läßt es leider nicht zu, ich klinge mich aus diesem Thread aus. Das ist Zeitverschwendung

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hallo,

              Hast du den von mir modifizierten Code mal getestet?

              Ja, das habe ich und er funktioniert bei mir NICHT.

              Tut mir leid, ich versuch jetzt seit gestern dir zu helfen und habe dir bereits mehrmals gesagt, dass der Fehler nicht daran liegt, du weigerst dich aber standhaft irgendeinen, für DEIN Problem, relevanten Code preiszugeben.

              Ja, ich weiß, dass du das gesagt hast. Allerdings weiß ich nicht woran es sonst liegen soll. Länger ist mein Code nicht. Außer eben ein paar mehr Formularfeldern.

              Ich hab alles versucht dir zu helfen, du läßt es leider nicht zu, ich klinge mich aus diesem Thread aus. Das ist Zeitverschwendung

              Ich danke dir für deine Hilfe. Ich lasse es zu. Weiß aber leider nicht, was ich sonst noch an Code posten soll. Es ist keiner mehr da, nur noch mehr Checkboxen, ein Eingabefeld und diverse Popup_Menüs. Keins dieser Felder kommt in meiner Subroutine an. Nicht mal die erste Checkbox oder auch der Submit-Button im gekürzten Code. Nada, Nothing, Nix.

              Gruß,
              Leeloo

              --
              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
              1. Hast du den von mir modifizierten Code mal getestet?

                Ja, das habe ich und er funktioniert bei mir NICHT.

                http://jstruebig.de/cgi-bin/formtest.pl

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Hallo,

                  Hast du den von mir modifizierten Code mal getestet?

                  Ja, das habe ich und er funktioniert bei mir NICHT.

                  http://jstruebig.de/cgi-bin/formtest.pl

                  Jo. Der selbe Code spinnt auf meinem Server rum. Am Browser und am Code liegts also net.

                  Danke Struppi für Deine Geduld und Hilfe. Ich werd mal schaun, obs evlt. an meinen Servereinstellungen liegt. Dumm ist halt nur, dass ich meinen Code nicht richtig testen kann, wenn der Server auf dem der läuft nicht mag.

                  Vielen Dank nochmal.

                  Gruß,
                  Leeloo

                  --
                  "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                  1. Jo. Der selbe Code spinnt auf meinem Server rum. Am Browser und am Code liegts also net.

                    puh, dann scheint jetzt wenigstens das Problem lokalisiert zu sein.

                    ...obs evlt. an meinen Servereinstellungen liegt. Dumm ist halt nur, dass ich meinen Code nicht richtig testen kann, wenn der Server auf dem der läuft nicht mag.

                    jo, du hast noch gar nicht gesagt welchen Server du verwendet?
                    Hast du mal statt POST GET probiert?

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Hallo,

                      Jo. Der selbe Code spinnt auf meinem Server rum. Am Browser und am Code liegts also net.

                      puh, dann scheint jetzt wenigstens das Problem lokalisiert zu sein.

                      jupp.

                      ...obs evlt. an meinen Servereinstellungen liegt. Dumm ist halt nur, dass ich meinen Code nicht richtig testen kann, wenn der Server auf dem der läuft nicht mag.

                      jo, du hast noch gar nicht gesagt welchen Server du verwendet?
                      Hast du mal statt POST GET probiert?

                      jupp. selbes Verhalten bei GET und POST.
                      Bei mir läuft ein Apache 2 auf einem SUSE Linux 10.1.

                      Gruß,
                      Leeloo

                      --
                      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                      1. jo, du hast noch gar nicht gesagt welchen Server du verwendet?
                        Hast du mal statt POST GET probiert?

                        jupp. selbes Verhalten bei GET und POST.
                        Bei mir läuft ein Apache 2 auf einem SUSE Linux 10.1.

                        Das ist dann wirklich unerklärbar.

                        Dort ist doch eigentlich alles richtig vorkonfiguriert. Ich bin kein Server Spezialist (eher das gegenteil ;-) ) aber gibt es ein Möglichkeit den so zu konfigurieren, das weder post noch get Daten übermittelt werden?
                        Ich bezweifle das jetzt mal und vermute nach wievor einen anderen Fehler.

                        Hast du vielleicht irgendeine Einstellung in deiner .htaccess Datei, die die Parameter entfernt?

                        gibt es evtl. einen Hinweis im errolog des Servers?

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
                        1. Hallo,

                          Hast du vielleicht irgendeine Einstellung in deiner .htaccess Datei, die die Parameter entfernt?

                          gibt es evtl. einen Hinweis im errolog des Servers?

                          In meinem error_log steht sowas, wenn ich die Datei aufrufe

                          Variable $cgi will not stay shared at line 40
                          Variable $LINK will not stay shared at line 42
                          Variable $cgi will not stay shared at line 56

                          Zeile 40 ist print $cgi->h1("Erweiterte Suche");
                          Zeile 42 ist -action=>$LINK),
                          und Zeile 56 ist print $cgi->h1("Suchergebnis");

                          Eine .htaccess kann ich nicht finden.

                          Gruß,
                          Leeloo

                          --
                          "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                          1. Hallo,

                            In meinem error_log steht sowas, wenn ich die Datei aufrufe

                            Variable $cgi will not stay shared at line 40
                            Variable $LINK will not stay shared at line 42
                            Variable $cgi will not stay shared at line 56

                            Zeile 40 ist print $cgi->h1("Erweiterte Suche");
                            Zeile 42 ist -action=>$LINK),
                            und Zeile 56 ist print $cgi->h1("Suchergebnis");

                            ha, laut
                            http://www.farid-hajji.net/books/de/Hajji_Farid/pbv2/ew/cgi-modperl.html#modperl_registry
                            hab ich ein schwerwiegendes Problem.
                            Man solle doch explizit globale Variablen definieren mit use vars qw($cgi);
                            Hab ich gemacht und nu scheints zu funzen. Allerdings kann ich nicht use vars qw($cgi, $LINK) definieren.

                            Gruß,
                            Leeloo

                            --
                            "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                            1. http://www.farid-hajji.net/books/de/Hajji_Farid/pbv2/ew/cgi-modperl.html#modperl_registry
                              hab ich ein schwerwiegendes Problem.

                              du verwendest mod_perl, warum sagst du das nicht?
                              Das ist eher unüblich (solange die Anwendung und der Benutzerkreis nicht zu gross ist) und ich kenn mich null damit aus (ein bisschen in der Theorie).

                              Man solle doch explizit globale Variablen definieren mit use vars qw($cgi);
                              Hab ich gemacht und nu scheints zu funzen. Allerdings kann ich nicht use vars qw($cgi, $LINK) definieren.

                              In qw() wird eine Liste nur mit Leerzeichen getrennt.

                              Struppi.

                              --
                              Javascript ist toll (Perl auch!)
                              1. Hallo,

                                http://www.farid-hajji.net/books/de/Hajji_Farid/pbv2/ew/cgi-modperl.html#modperl_registry
                                hab ich ein schwerwiegendes Problem.

                                du verwendest mod_perl, warum sagst du das nicht?
                                Das ist eher unüblich (solange die Anwendung und der Benutzerkreis nicht zu gross ist) und ich kenn mich null damit aus (ein bisschen in der Theorie).

                                Äh, das war jetzt unabhängig von mod_perl, was ich da gefunden habe. Da hab ich gar nicht drauf geachtet, dass es sich dabei um mod_perl handelt.
                                Aber man lernt nie aus, dass es unüblich ist, mod_perl zu verwenden.
                                Ich weiß jedoch, dass ohne mod_perl mein Apache kein Skript ausgeführt hat. Auf Konsole per perl ... schon. Nur musste ich dem Apache eben sagen, er solle doch mod_perl laden. Ohne das gings net.

                                Allerdings kann ich nicht use vars qw($cgi, $LINK) definieren.

                                In qw() wird eine Liste nur mit Leerzeichen getrennt.

                                Ahso, muss einem doch gesagt werden.

                                Gruß,
                                Leeloo

                                --
                                "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                          2. Hell-O!

                            In meinem error_log steht sowas, wenn ich die Datei aufrufe
                            Variable $cgi will not stay shared at line 40
                            Variable $LINK will not stay shared at line 42
                            Variable $cgi will not stay shared at line 56

                            Da haben wir vermutlich dein Problem: "Scoped Variables in nested Subroutines". Kleines Beispiel:

                            sub foo {  
                              my $var = shift;  
                              
                              sub bar {  
                                return $var *10;  
                              }  
                              return bar();  
                            }  
                              
                            print foo(1);  
                            print foo(2);
                            

                            Das wirft dir statt 10 und 20 zwei mal 10 aus.

                            Zur Erklärung:

                            Die Sub "bar" wirkt als Closure innerhalb der sub "foo". Beide teilen sich die in der äußeren Sub deklarierte Variable $var, allerdings nur den Wert, den sie bei erstmaligem Aufruf der äußeren Funktion erhalten hat. Wenn du obiges Beispiel das erste Mal aufrufst, erhält $var den Wert 1, den sich foo und bar teilen. Beim zweiten Aufruf erhält $var den Wert 2, teilt diesen aber nicht mehr mit bar, dort ist $var nachwievor 1.

                            Nachlesen kannst du das in perldiag: Variable "%s" will not stay shared.

                            Der einfachste Lösungsansatz ist, auf Closures zu verzichten, wenn es keinen wirklich guten Grund dafür gibt. Wenn es denn doch sein soll, dann verwende eine anonyme Sub:

                            sub foo {  
                              my $var = shift;  
                              
                              my $bar = sub {  
                                return $var *10;  
                              }  
                              return &$bar();  
                            }  
                              
                            print foo(1);  
                            print foo(2);
                            

                            Siehe hierzu perlsub.

                            Siechfred

                            --
                            Ich bin strenggenommen auch nur interessierter Laie. (molily)
                            Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                            1. Hallo,

                              In meinem error_log steht sowas, wenn ich die Datei aufrufe
                              Variable $cgi will not stay shared at line 40
                              Variable $LINK will not stay shared at line 42
                              Variable $cgi will not stay shared at line 56

                              Da haben wir vermutlich dein Problem: "Scoped Variables in nested Subroutines".

                              Denke ich auch. Nur ich habe eigentlich keine verschachtelten Subroutinen. Nur zwei einzelne, die am Anfang aufgerufen werden.

                              Ich löse das ganze jetzt per use vars qw($cgi); am Anfang. Eine weitere Möglichkeit wäre ja, das ganze direkt an die Subroutine zu übergeben.

                              Bleibt jedoch immer noch die Frage, warum es bei Struppi auch ohne diese Modifikationen funktioniert und bei mir nicht?

                              Gruß,
                              Leeloo

                              --
                              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                              1. Hell-O!

                                Ich löse das ganze jetzt per use vars qw($cgi); am Anfang.

                                Ein einfaches "my $cgi" am Anfang des Scripts würde genügen, das vars-Pragma ist eigentlich überholt.

                                Bleibt jedoch immer noch die Frage, warum es bei Struppi auch ohne diese Modifikationen funktioniert und bei mir nicht?

                                Ich denke, dass es an mod_perl liegt. Leider scheint perl.apache.org gerade down zu sein, dort gibt es IIRC ein ganzes Kapitel zu deinem Problem.

                                Siechfred

                                --
                                Ich bin strenggenommen auch nur interessierter Laie. (molily)
                                Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
                                1. Hallo,

                                  Ich denke, dass es an mod_perl liegt. Leider scheint perl.apache.org gerade down zu sein, dort gibt es IIRC ein ganzes Kapitel zu deinem Problem.

                                  jo, ist es immer noch :( Ich schau mal, ob ich woanders noch was finde. Wild in meiner Apache-Conf zu suchen, halte ich im Moment auch nicht für sinnvoll, da ich ja nicht weiß, was ich da einstellen muss. Wenns denn was zum Einstellen gibt.

                                  Die Lösung mit use vars qw() empfiehlst du mir also nicht. Die Seite auf der das empfohlen wurde, ist auch schon ein paar Jährchen alt. Also eine andere Lösung suchen.

                                  Ich danke Dir.

                                  Gruß,
                                  Leeloo

                                  --
                                  "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                                  1. Hey,
                                    meine Antwort von gestern abend hat Beispielcode. https://forum.selfhtml.org/?t=139254&m=905143 Der Thread ist auch schon arg unübersichtlich. :)

                                    Du kannst das Handbuch dank Google Cache noch lesen, solange der Server down ist.
                                    http://google.com/search?q=cache:http://perl.apache.org/docs/1.0/guide/porting.html#The_First_Mystery
                                    http://google.com/search?q=cache:http://perl.apache.org/docs/general/perl_reference/perl_reference.html#The_Diagnosis

                                    --
                                    水-金-地-火-木-土-天-海-冥
                          3. In meinem error_log steht sowas, wenn ich die Datei aufrufe

                            Variable $cgi will not stay shared at line 40
                            Variable $LINK will not stay shared at line 42
                            Variable $cgi will not stay shared at line 56

                            Ich hab diese Fehlermeldung noch nie gesehen, Siechfred hat ja schon was dazu gesagt.

                            Aber wie kann es sein, dass du diese Fehlermeldung mit meinem Code bekommst?
                            Während ich die nicht habe?

                            Hats du nicht den Code 100% 1:1 übernommen?
                            Welche Modifikationen hast du vorgenommen?

                            Ehrlich ich bin leicht sauer, ich versuche seit gestern dein Problem zu verstehen und hab dich mehrmals um mehr Informationen gebeten, hab dir ein Beispiel was funktioniert gebaut, um jetzt feststellen zu müssen, dass du anscheinend dauernd irgendetwas modifizierst, was zu deinem Problem führt, nur du rückst ums verrecken nicht damit raus. Gehörst du irgendeiner geheimniskrämer Sekte an? ;-)

                            Struppi.

                            --
                            Javascript ist toll (Perl auch!)
                            1. Hallo Struppi,

                              Hats du nicht den Code 100% 1:1 übernommen?

                              jupp, 1:1 kopiert

                              Welche Modifikationen hast du vorgenommen?

                              Habe keine Modifikationen vorgenommen.

                              Ehrlich ich bin leicht sauer, ich versuche seit gestern dein Problem zu verstehen und hab dich mehrmals um mehr Informationen gebeten, hab dir ein Beispiel was funktioniert gebaut, um jetzt feststellen zu müssen, dass du anscheinend dauernd irgendetwas modifizierst, was zu deinem Problem führt, nur du rückst ums verrecken nicht damit raus. Gehörst du irgendeiner geheimniskrämer Sekte an? ;-)

                              Keiner zwingt dich, mein Problem zu verstehen. Brauchst auch nicht mehr zu antworten. Ich habe ja jetzt eine "Teillösung" gefunden.
                              Ich freue mich jedoch, dass du es versuchst und ich jemanden gefunden habe, mit dem ich über das Problem diskutieren kann.
                              Ich habe wirklich nichts an dem Code verändert, den du auf deinem Server laufen hast. Habe den 1:1 kopiert und bei mir getestet und es lief wieder nicht wie erwartet. Dann habe ich im error_log eben diese Fehlermeldung gefunden. Danach gegoogelt und bin auf die beschriebenen Lösung gestoßen.
                              Ich denke, dass das Problem mit den Servereinstellungen bzw. mit den verwendeten Versionen der einzelnen Komponenten zu tun hat: Apache2, Perl, etc. Irgendwas ist da eingestellt und verursacht eben dieses Problem, wenn ich globale Variablen in Subroutinen verwende.

                              Ich werde es jetzt mit diesen use vars qw($cgi); probieren.

                              Achja, das hab ich jetzt modifiziert an deinem Code, damit er bei mir läuft wie er soll. Obiges eingefügt und das my vor $cgi = new CGI; weggelassen.

                              Gruß,
                              Leeloo

                              --
                              "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
                              1. Keiner zwingt dich, mein Problem zu verstehen. Brauchst auch nicht mehr zu antworten. Ich habe ja jetzt eine "Teillösung" gefunden.

                                Jaja, wir haben ja jetzt teilweise das Problem lokalisiert, tut mir leid da war ich mit meiner Schlußfolgerung etwas voreilig.

                                Ich denke, dass das Problem mit den Servereinstellungen bzw. mit den verwendeten Versionen der einzelnen Komponenten zu tun hat: Apache2, Perl, etc. Irgendwas ist da eingestellt und verursacht eben dieses Problem, wenn ich globale Variablen in Subroutinen verwende.

                                mod_perl anscheinend (wie gesagt: null Ahnung davon).

                                Ich werde es jetzt mit diesen use vars qw($cgi); probieren.

                                Du solltest mal nach Dokumentationen über mod_perl, bzw. was da zu beachten ist suchen, es sollte ja nicht zu schwierig sein, evtl. wird dein Problem mit globalen Variabeln dort erklärt.

                                Warum du das aber nicht als CGI zum laufen bekommen hast ist mir ein Rätsel, ein Linux (gerade Suse) sollte doch da recht sinnvoll vorkonfiguriert sein.

                                Struppi.

                                --
                                Javascript ist toll (Perl auch!)
                          4. Hey,
                            Siechfried hat eine technische Erklärung abgegeben, aber die trifft nicht den Kern. Statt Variablen global zu deklarieren (deine, wie du sagst, teilweise Lösung), schreibe alle Subroutinen so um, dass sie mit Parameterübergabe und lexikalischen Variablen arbeiten.

                              
                            sub advsearchstart {  
                                my $cgiobj = shift;   # ersten Parameter aus @_ holen  
                                my $link = shift;     # zweiten  
                              
                                ## Ueberschrift  
                                print $cgiobj->h1("Erweiterte Suche");  
                                print $cgiobj->start_form( -method=>'POST',  
                                                           -action=>$link),  
                                [...]  
                            };  
                            
                            

                            Aufruf der Sub dementsprechend:

                              
                                advsearchstart($cgi, $LINK);  
                            
                            

                            Eine erschöpfende Abhandlung zum ursprünglichen Problem findet sich im Handbuch.
                            http://perl.apache.org/docs/1.0/guide/porting.html#The_First_Mystery
                            http://perl.apache.org/docs/general/perl_reference/perl_reference.html#The_Diagnosis

                            --
                            水-金-地-火-木-土-天-海-冥
      2. Der minimale Code, der bei mir ebenfalls das nicht korrekte Verhalten zeigt.

        Ich hab mal eine minimale Veränderung gemacht damit der Code überhaupt läuft und dann funktioniert alles:

          
        #! /usr/bin/perl -w  
        use strict;  
        use CGI;  
        use CGI::Carp qw(fatalsToBrowser);  
          
        my $cgi = new CGI;  
        my $LINK = $cgi->url;  
        ## Ausgabe der HTML-Seite starten ##################################  
        print $cgi->header(),  
              $cgi->start_html(-title=>"Erweiterte Suche",  
                            -style=>{-src=>['stylesheets/default.css'],  
                               -media =>'screen'}),  
              $cgi->start_div({-id=>"container"}),  
                               $cgi->start_div({-id=>"liste"});  
          
        ### Auswertung der uebergebenden Parameter ########################  
        if(defined $cgi->param('searchAdv')){  
          
            ## Testausgabe - Werte werden noch korrekt ausgegeben  
            my @Feldnamen = $cgi->param();  
          
           foreach my $Feld (@Feldnamen) {  
                print $cgi->b('Feldname: '), $Feld,  
                          $cgi->b(', Inhalt: '),  
                          $cgi->param($Feld), "<br>"; }  
          
            ## Aufruf der Funktion zum Auswerten der Daten  
            &advsearch;  
          
        }else {  
          
            ## Anzeige der Suchseite  
            &advsearchstart;  
        };  
          
        ### Subroutine zum Anzeigen der Suchmaske  
        sub advsearchstart  
        {  
            ## Ueberschrift  
            print $cgi->h1("Erweiterte Suche");  
            print $cgi->start_form( -method=>'POST',  
                                    -action=>$LINK),  
                  $cgi->checkbox( -name=>'dateCheck',  
                               -label=>'Datum'),  
                  $cgi->br,  
                  $cgi->hr,  
                  $cgi->submit(-value=>'Suchen',  
                         -name=>'searchAdv'),  
                  $cgi->end_form(),  
                  $cgi->end_div();  
        };  
          
        sub advsearch {  
          
            ## Ueberschrift  
            print $cgi->h1("Suchergebnis");  
          
            ## Testausgabe - bleibt leer  
            my @Feldnamen = $cgi->param();  
          
            foreach my $Feld (@Feldnamen) {  
                  print $cgi->b('Feldname: '),  
                          $Feld,  
                          $cgi->b(', Inhalt: '),  
                          $cgi->param($Feld), "<br>"; }  
          
            ## Ueberpruefen, ob etwas ausgewaehlt  
            if ($cgi->param()) {  
          
                print $cgi->p("ja");  
          
            }else{  
              ## Wenn nichts ausgewaehlt wurde  
              print $cgi->p("keine Auswahl getroffen");  
            }  
          
          
            # Ende der Seite  
            print   $cgi->end_div();  
          
        };## Ende Funktion advsearch  
          
        ## Seite zumachen  
        print   $cgi->div({-id=>"footer"}, "ENDE"),  
                $cgi->end_div(),  
                $cgi->end_html();  
          
        ##EOF##  
          
        
        

        Ich bin nachwievor überzeugt dass dein Fehler woanders liegt und du uns ihn einfach nicht verraten willst.

        Struppi.

        --
        Javascript ist toll (Perl auch!)