GIbt es in Perl sowas wie urlencode in PHP(GET-Problem)
Andreas
- perl
0 Klaus Mock0 Reiner0 Andreas0 Klaus Mock0 Andreas
0 Urmel0 Urmel
Hallo!
Gibt es in Perl auch sowas wie folgenden Code in PHP:
".urlencode($Variable)."
Und zwar will ich gerne eine Variable per Get-Methode übergeben, nur sobald diese ein Leerzeichen enthält ist es vorbei.
In php habe ich das so gemacht:
link.php?Variable=<?echo ".urlencode($Variable).";?>
Nur wie mache ich das in PERL???
Hab so ein Script, das nur weiterleiten soll aber die Variablen übergeben:
print <<EOF ;
<html>
<meta http-equiv="refresh" content="0;URL=http://217.223.146.148/insert.php?Produkt=".urlencode($Produkt)."">
EOF
Ich dachte den Befehl gäbe es auch in PERL, gibts wahrscheinlich auch, ich kwende Ihn wahrscheinlich falsch an. Oder ist das gar nicht möglich? Genau diese Variante geht jedenfalls mit PHP, halt mit echo.
Die Daten werden dann erst von einem PHP-Script gelesen. Wenn ich das normal über ein Formular mit POST übergebe, ist alles OK.
Wäre sehr Dankbar für Eure Hilfe!
Gruß
Andreas
Hallo,
Gibt es in Perl auch sowas wie folgenden Code in PHP:
".urlencode($Variable)."
Da Perl nicht ursprünglich für Web-G'schichtln entwickelt wurde, ist keine äquivalente Funktion eingebaut.
Allerdings ist
1.) das Encoding nicht so kompliziert, eine Regex gen+ügt
2.) eine solche Funktion im Modul CGI (eigentlich in CGI::Util) enthalten, das allerdings inzwischen zum 'Standard-Lieferumfang' gehört.
also
my $qery = new CGI;
print $query->escape('Was auch immer für ein Text!');
Grüße
Klaus
Hallo,
my $qery = new CGI;
print $query->escape('Was auch immer für ein Text!');
oder als Funktionen:
sub escape {
shift() if ref($_[0]);
my $toencode = shift;
return undef unless defined($toencode);
$toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
return $toencode;
}
sub unescape {
shift() if ref($_[0]);
my $todecode = shift;
return undef unless defined($todecode);
$todecode =~ tr/+/ /; # pluses become spaces
$todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
return $todecode;
}
Reiner
Hallo!
Also ich habe das mal so probiert:
#!/usr/bin/perl
use CGI qw(param);
print "Content-type: text/html\n\n" ;
$Beschreibung = param("Beschreibung");
$Preis = param("Preis");
print '<html>';
print '<head>';
print '<meta http-equiv="refresh" content="0;URL=http://217.234.346.185/session.php?';
my $qery = new CGI;
print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');
print '">';
exit ;
Aber da bekomme ich nur
<meta http-equiv="refresh" content="0;URL=http://217.224.146.148/session.php?
angezeigt, sonst passiert nichts.
Wie soll ich das sonst machen?
Gruß
Andreas
Hallo,
Ich denke daß da Perl die Mitarbeit verweigert, weil
use CGI qw(param);
aussagt, daß Du nur die Funktion param brauchen wirst
und
my $query = new CGI;
print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');
aber ersten das Modul im Objektorientierten Ansatz und dazu noch die Methode escape verwenden will
Außerdem würde
print $query->escape('Preis=$Preis&Beschreibung=$Beschreibung');
Preis%3D%24Preis%26Beschreibung%3D%24Beschreibung
als Ergebnis bringen, da ja der ganze String 'escaped' wird, Du aber wahrscheinlich
Preis=1234&Beschreibung=abc%20edef%20dshfdskhs
erwartest.
Das ist jetzt mal eine Vermutung, falls Du den Error-Log Deines Webservers inspizieren würdest, würdest Du auch entsprechende Hinweise finden.
warum nicht:
#!/usr/bin/perl -w
use strict; # sollte in keinem guten Script fehlen
use CGI;
my $query = new CGI;
print "Content-type: text/html\n\n" ;
my $Beschreibung = $query->escape($query->param('Beschreibung'));
my $Preis = $query->escape($query->param('Preis'));
print '<html>';
print '<head>';
print '<meta http-equiv="refresh" content="0;URL=http://217.234.346.185/session.php?';
print "Preis=$Preis&Beschreibung=$Beschreibung";
print '">';
exit ;
(Ich weiß könnte noch etwas besser sein, aber ich wollte nicht zu weit vom geposteten Code weg)
Literaturhinweise (unvollständig):
Grüße
Klaus
Hi KLaus!
Danke, klappt jetzt wunderbar!
Ich habe ja das Probkem dass ich an die Error-Log des Servers nicht dran darf, ich weiß, könnte ich auch lokal installieren, aber ich habe mich jetzt für PHP entschieden, da ich damit sehr viel besser klar komme.
Da ich jetzt auch den Warenkorb in PHP geschrieben habe, brauchte ich ein Script, welches die Unzähligen alten Seiten auf diesen Umleitet, denn vorher hatten wir da noch keinen Warenkorb, außerdem was das CGI-BIN Verzeichnis noch im Hauptverzeichnis dieser Domain...
mit PHP geht einiges viel einfacher, wobei ich manchmal, man glaubt es kaum, anfange PERL zu vermissen, denn manche Sachen waren in Perl besser als in PHP.
Naja, jedenfalls nochmal Danke für deine Hilfe,
Gruß
Andreas
Hallo,
Danke, klappt jetzt wunderbar!
Na toll, aber hast Du auch verstanden, warum es jetzt klappt?
mit PHP geht einiges viel einfacher, wobei ich manchmal, man glaubt es kaum, anfange PERL zu vermissen, denn manche Sachen waren in Perl besser als in PHP.
Tja, das ist so eine Problem, Perl ist vielleicht für den Anfang etwas schwierig, wenn man das Konzept dahinter nicht versteht. Allerdings läßt einen Perl selbst in vertrackten Situationen äußerst selten im Regen stehen. Deshalb werde ich mich wohl nie mit PHP ernsthaft auseinandersetzen. Naja nie ist vielleicht nicht richtig, aber zumindest nich, solange ich es irgenwie vermeiden kann;-)
Grüße
Klaus
Hallo Andreas,
mir ist nicht ganz klar welches problem es dort geben soll.
Wenn du eine variable übergeben willst per Get die aber auch gleichzeitg Leerzeichen beinhaltet, solltest du diese variable vielleicht ersteinmal koodieren. So eine Arte Filter einbauen.
Ich kann dir jetzt leider nicht sagen ob es eine solche Funktion berreits schon für Perl gibt , kann gut sein, allerdings sollte es auch so keine große schwierigkeit sein sich einen "Filter" selbst zu programmieren.
Also vor dem Abschicken checkst du erstmal die Variable nach besonderen Zeichen durch (z.b. Leerzeichen) und anschließend ersetzt du diese.
Einfaches Beispiel.
$getstring =~ s/ /%20/g;
*nicht getestet
Dieser Befehl ersetzt alle " " Leerzeichen durch ein "%20".
Du solltest dich vielleich mal mit der Mustererkennung oder auch "pattern Matching" genannt, auseinandersetzen.
anschließend musst du diese "koodierte" -Variable natürlich in dem anderen script wieder zurücksetzten bzw. die umkehrwerte für den filter benutzen, sprich aus "%20" wird wieder " ".
Gruß Urmel
ohhhh da war wohl jemand schnell ;)
cool jetzt weiss ich endlich das es da was gibt (CGI-Funktion), DANKE ;)