Patric: Variablen-Vorbelegung nicht nachzuvollziehen.

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";

  1. 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