Formularwerte in CGI-Skripten
Jan Runte
- cgi
Hallo,
wenn ich ein Formular als Suchprogramm (CGI) abschicke und Werte wie
"indiana_jones_und_der_letzte_kreuzzug" habe, findet das CGI-Skript
keinen Eintrag in der CSV-Datei. Der Eintrag ist aber eindeutig vorhanden
und es handelt sich auch nicht um Schreibfehler. Benutzte ich nur
einen "_" in einem String, wie "jurassic_park" erkennt das CGI-Skript den
Eintrag und zeigt ihn ordnungsgemäß an. Er findet also nur Strings, die
nur einen "_" enthalten und nicht mehrere. Der Browser zeigt auch
die korrekte Schreibweise an, die ich brauche:
"movie_view.cgi?id=indiana_jones_und_der_letzte_kreuzzug"
#!/usr/bin/perl
$searchfile= "$ENV{DOCUMENT_ROOT}/cgi-bin/movies.csv";
&VarRead;
$searchstring= $Formular[1];
$searchstring =~ tr/+/_/;
open(SEARCH, "<$searchfile");
while(<SEARCH>)
{
chomp ($_);
@moviedaten= split(/;/,$_, 35);
if ($moviedaten[0] eq $searchstring)
{
last;
}
}
close(SEARCH);
print "Content-type: text/html\n\n";
if ($moviedaten[1] eq $searchstring)
{
*Anzeige*
.
.
.
} else {
print "ERROR - NOT FOUND";
}
sub VarRead
{
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'}
}
else {
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
{
($name, $value) = split(/=/, $Feld);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.\n)*-->//g;
$Formular[$i] = $name;
$i = $i + 1;
$Formular[$i] = $value;
$i = $i + 1;
}
}
Beispiel:
unter "www.little-wing-imagine.de/cgi-bin/movies.cgi" könnt ihr einen Eintrag
auswählen, der z.B. mehrere Leerstellen hat, die dann per Skript in "_" ersetzt
werden.
oder unter "www.little-wing-imagine.de/schauspieler". da könnt Ihr
"catherine zeta jones" (funktioniert auch nicht) auswählen unter "z".
Könnt Ihr mir da weiterhelfen, bevor ich alles umstrukturiere (muß ja nicht sein)??
Vielen Dank auch im voraus.
mfG jR.
Also an den Leerstellen liegt es nicht. (a perfect world; air force one geht)
Ich kann perl nicht soo gut, was bedeutet die 35 bei
split(/;/,$_, 35); ? Doch nicht etwa max. Laenge ?
Also an den Leerstellen liegt es nicht. (a perfect world; air force one geht)
Ich kann perl nicht soo gut, was bedeutet die 35 bei
split(/;/,$_, 35); ? Doch nicht etwa max. Laenge ?
das bedeutet, daß 35 Spalten von dem String abgetrennt werden, wo
jede Spalte mit einem "Semikolon" enden.
Die Länge kann ja nicht sein, da der komplette ersetzte String auch in der
URL-Leiste zu sehen ist. Kann aber vielleicht auch etwas damit zu tun haben,
wenn eine ?-Variabel nur eine maximale Länge annehmen kann.
Das mit den beiden Strings oben, die funktionieren, kann ich jetzt natürlich
auch nicht erklären. Komische Sache das.
Hat denn keiner eine Lösung??
bye jR.
Hi,
wenn ich ein Formular als Suchprogramm (CGI) abschicke und Werte wie
"indiana_jones_und_der_letzte_kreuzzug" habe, findet das CGI-Skript
keinen Eintrag in der CSV-Datei.
dazu kann ich Dir leider auch nichts sagen, schon gar nicht, ohne ein oder zwei betroffene Einträge gesehen zu haben. Aber vielleicht hilft ja folgendes:
$searchfile= "$ENV{DOCUMENT_ROOT}/cgi-bin/movies.csv";
use CGI;
my $cgi = new CGI;
my $searchstring = $cgi->param("suche"); # bei <input name="suche">
$searchstring =~ tr/+/_/;
open(SEARCH, "<$searchfile");
while(<SEARCH>)
{
»» chomp ($_);
»» @moviedaten= split(/;/,$_, 35);
»» if ($moviedaten[0] eq $searchstring)
Hast Du es hier mal mit $moviedaten[0] =~ /^$searchstring$/i o.ä. versucht?
Interessant wäre auch, den veränderten $searchstring mal auszugeben. Vielleicht sieht er ja anders aus, als Du erwartest?
Cheatah