Formulare: Variablenübergabe
Leeloo5E
- perl
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
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.
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
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.
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
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.
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
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.
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
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.
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
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.
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
Der minimale Code, der bei mir ebenfalls das nicht korrekte Verhalten zeigt.
Dieser Code erzeugt nur einen Fehler, weil $LINK nirgends definiert wurde.
Struppi.
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
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.
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
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.
Hallo,
Hast du den von mir modifizierten Code mal getestet?
Ja, das habe ich und er funktioniert bei mir NICHT.
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
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.
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
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.
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
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 56Zeile 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
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 nichtuse vars qw($cgi, $LINK)
definieren.
In qw() wird eine Liste nur mit Leerzeichen getrennt.
Struppi.
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
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
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 56Da 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
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
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
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
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.
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
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.
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
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.