Variablen-Vorbelegung nicht nachzuvollziehen.
Patric
- perl
0 Cheatah
Hallo,
ich habe letztens schon einmal diesbezüglich ins Forum gepostet, bin leider noch nicht fündig geworden. Es geht um folgendes: Ich rufe bei submit eines Forms (einer HTML-Page) ein perl-Script auf, welches anhand der übergebenen Daten einen SQL-Request startet. Wiederhole ich den Submit einige Male mit verschiedenen eingegebenen Suchbegriffen, so haben die entsprechenden Variablen im Perl-Script irgendwann nicht mehr die Werte aus dem Form als Inhalt. Web-Server ist Apache/1.3.6 (Unix) mit mod_perl. Letztens bekam ich die Antwort, daß ich unsauber programmiert habe. Bin Perl-Anfänger und habe leider nichts verdächtiges gefunden. Deshalb anbei der Code, um den es geht. Besten dank schon einmal.
Der Aufruf des Scripts in der HTML-Page:
<form name="test" action="write.pl">
Und das zugehörige Script:
#!/usr/bin/perl
require "cgi-lib.pl";
ReadParse(); # aus CGI-LIB.PL
@Zeilen = ("");
#Seitenkopf ausgeben
print <<"EOT";
Content-type: text/html
...
EOT
if (open(INPUT, "<../files/".$in{'1'}.$in{'2'}.".txt")) {
while(<INPUT>) {
push(@Zeilen,$_);
}
close(INPUT);
}
if(open(OUTPUT,">../files/blk".$in{'1'}.$in{'2'}.".txt")==false) {
print "Es ist ein Fehler beim Speichern Ihres Eintrages aufgetreten.\n";
}
else {
print OUTPUT "<p >$in{'NAME'} (<a href=\"mailto:$in{'eMail'}\">$in{'eMail'}</a>) schrieb<br><br>\n";
print OUTPUT "$in{'Eintrag'}</p><br>\n";
for(@Zeilen) { print OUTPUT "$\_\n" }
close(OUTPUT);
print "<div align=\"center\">\n";
print "</div>\n";
}
print "</body></html>\n";
Hi,
Web-Server ist Apache/1.3.6 (Unix) mit mod_perl. Letztens bekam ich die Antwort, daß ich unsauber programmiert habe.
von mir, stimmt's? ;-)
Dann hab ich Dich sicher auch auf http://perl.apache.org/ hingewiesen. Dort steht, was Du beachten mußt.
Bin Perl-Anfänger und habe leider nichts verdächtiges gefunden.
Dann will ich mal sehen, ob ich etwas verdächtiges finde:
#!/usr/bin/perl
Aha.
#!/usr/bin/perl -w
use strict;
Dann findet Perl nämlich die verdächtigen Dinge für Dich.
require "cgi-lib.pl";
Das ist (hoffnungslos) veraltet.
use CGI ':standard'; # und Script natürlich darauf anpassen
@Zeilen = ("");
my @Zeilen; # es empfiehlt sich btw., kleine Variablennamen zu verwenden, also @zeilen. Nicht weil es syntaktisch besser wäre oder so, sondern es hat sich einfach eingebürgert. Macht Quelltexte lesbarer.
#Seitenkopf ausgeben
print header;
...
Was immer diese drei Punkte symbolisieren, wirst Du vermutlich in einem
print start_html;
Konstrukt durchführen. Siehe perldoc CGI.
if (open(INPUT, "<../files/".$in{'1'}.$in{'2'}.".txt")) {
open INPUT, '/absolute/path/to/files/'.param('1').param('2').'.txt' or die "Kann Datei nicht oeffnen: $!";
»» while(<INPUT>) {
push(@Zeilen,$_);
»» }
@Zeilen = <INPUT>;
»» close(INPUT);
Die Zeile bleibt :-)
if(open(OUTPUT,">../files/blk".$in{'1'}.$in{'2'}.".txt")==false) {
blk? So wie "block"? Ich glaube, Du möchtest
perldoc -f flock
perldoc perlopentut
lesen. Das open-Konstrukt bitte wie oben.
»» print OUTPUT "<p >$in{'NAME'} (<a href="mailto:$in{'eMail'}">$in{'eMail'}</a>) schrieb
$in{...} jeweils durch param(...) ersetzen.
»» for(@Zeilen) { print OUTPUT "$_\n" }
Moment, @Zeilen hast Du doch gerade aus einer Datei gelesen, oder? Tja, dann verdoppelst Du gerade die Zahl der Newlines :-)
»» close(OUTPUT);
close OUTPUT or die "Kann Datei nicht schliessen: $!"; # bei Schreibzugriffen immer!
»» print "<div align="center">\n";
»» print "</div>\n";
Naja, nicht alles muß man mit CGI.pm ausgeben. Könnte man aber :-)
print "</body></html>\n";
print end_html;
Tja, also, pauschal betrachtet... Gut, ich habe früher auch solche (und schlimmere) Scripts geschrieben, aber glaube mir - heute ärgere ich mich, wenn ich mal eins warten möchte :-)
Cheatah