Heike: Bild vom Server löschen

Hallo,

ich habe folgendes Problem:

Mit diesem Formular frage ich die Datenbank (MySQL) nach den vorhandenen Einträgen ab

**************

<FORM ACTION="/cgi-bin/bildergalerie_loeschen.cgi" METHOD="post">
<?php
   include "config.inc.php3";
   $res = mysql_db_query($dbname, "select * from $tabelle order by image asc");
   $num = mysql_num_rows($res);

for ($i=0; $i<$num; $i++)
   {
   $image = mysql_result($res, $i, "image");
   $siteid = mysql_result($res, $i, "siteid");
   $alternativtext = mysql_result($res, $i, "alternativtext");

echo "
<input type='radio' name='auswahl' value='$siteid'><br>
<img src='/bilder/$image' width='80'><br>
Bildname: $image<br>
Alternativtext: $alternativtext<br>
";

}
   mysql_close($conn);
?>
<INPUT TYPE="hidden" name="bild" value='$image'>
<INPUT TYPE="submit" NAME="Submit" VALUE="Löschen">

**********************

Jetzt möchte ich den Wert des Feldes $image an das folgende CGI-Script übergeben (...input type="hidden" usw) und diese Datei über das folgende Perl-Script vom Server löschen, doch leider hab ich irgendwo einen Denkfehler, es wird keine Variable an das PerlScript übergeben?!

***************

#!/usr/bin/perl

CGI Modul nutzen

use CGI;

Parametervariable festlegen

$a = new CGI;

$pfad = "/home/www/html/bilder";
opendir(DIR,"$pfad");
@files = readdir(DIR);
closedir(DIR);

$test1= CGI::param('$bild');
$test2= $a->param("$bild");
$test3= "$bild";

unlink("$pfad/$test1");
unlink("$pfad/$test2");
unlink("$pfad/$test3");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "$test1, $test2, $test3,\n";
print "</body></html>\n";

***********
Kann mir jemand helfen???
Im voraus herzlichen Dank

Heike

  1. Hi,

    es wird keine Variable an das PerlScript übergeben?!

    nein; per HTTP wird _nie_ eine Variable übergeben. Immer nur Parameter.

    #!/usr/bin/perl

    #!/usr/bin/perl -w
    use strict;

    Anschließend werden Dir einige Scriptmängel aufgezeigt werden, von denen Du die meisten mit Hilfe von

    perldoc -f my

    beheben kannst. Lob für die Verwendung von CGI.pm.

    $test1= CGI::param('$bild');
    $test2= $a->param("$bild");
    $test3= "$bild";

    Heißt der URL- bzw. POST-Parameter wirklich "$bild"? Ein Dollarzeichen sieht man selten in der URL, obwohl es durchaus erlaubt ist.

    print "Content-type: text/html\n\n";

    print CGI::header;

    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";

    [...]

    print <<EOP;
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html><head><title>Test-Ausgabe</title></head><body>
    ...
    EOP

    Cheatah

    --
    X-Will-Answer-Email: No
  2. Hallo,

    ich habe folgendes Problem:

    Jetzt möchte ich den Wert des Feldes $image an das folgende CGI-Script übergeben (...input type="hidden" usw) und diese Datei über das folgende Perl-Script vom Server löschen, doch leider hab ich irgendwo einen Denkfehler, es wird keine Variable an das PerlScript übergeben?!

    ***************

    #!/usr/bin/perl

    use strict;
    use warnings;

    gehört hier noch hin.

    CGI Modul nutzen

    use CGI;

    Parametervariable festlegen

    $a = new CGI;

    Aussagekräftiger Variabelname, nebenbei ist $a und $b bereits reserviert.

    $pfad = "/home/www/html/bilder";
    opendir(DIR,"$pfad");

    opendir(DIR,"$pfad") || die "Kann $pfad nicht öffnen, weil: $!";

    @files = readdir(DIR);
    closedir(DIR);

    $test1= CGI::param('$bild');
    $test2= $a->param("$bild");

    und hier ist der Fehler (den du mit Hilfe von strict gefunden hättest)

    Was steht den $bild? Kann es sein, das du "bild" meinst?

    $test3= "$bild";

    unlink("$pfad/$test1");
    unlink("$pfad/$test2");
    unlink("$pfad/$test3");

    auch hier solltest du den Erfolg checken

    unlink("$pfad/$test3") || print "Kann $pfad/$test3 nicht löschen, weil $!";

    print "Content-type: text/html\n\n";
    print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
    print "<html><head><title>Test-Ausgabe</title></head><body>\n";
    print "$test1, $test2, $test3,\n";
    print "</body></html>\n";

    Erst benutzt du CGI und dann wieder nicht?

    print CGI::header(), CGI::start_html(-title => 'Test-Ausgabe');

    Struppi.

    1. Hallo,

      ich habe folgendes Problem:

      Jetzt möchte ich den Wert des Feldes $image an das folgende CGI-Script übergeben (...input type="hidden" usw) und diese Datei über das folgende Perl-Script vom Server löschen, doch leider hab ich irgendwo einen Denkfehler, es wird keine Variable an das PerlScript übergeben?!

      ***************

      #!/usr/bin/perl

      use strict;
      use warnings;

      gehört hier noch hin.

      CGI Modul nutzen

      use CGI;

      Parametervariable festlegen

      $a = new CGI;

      Aussagekräftiger Variabelname, nebenbei ist $a und $b bereits reserviert.

      $pfad = "/home/www/html/bilder";
      opendir(DIR,"$pfad");

      opendir(DIR,"$pfad") || die "Kann $pfad nicht öffnen, weil: $!";
      ***************

      Das versteh ich nicht, wenn ich direkt den Pfadnamen bei unlink("$pfad/brunnen.jpg"); angebe wird die Datei gelöscht.
      *******************

      @files = readdir(DIR);
      closedir(DIR);

      $test1= CGI::param('$bild');
      $test2= $a->param("$bild");

      und hier ist der Fehler (den du mit Hilfe von strict gefunden hättest)

      Was steht den $bild? Kann es sein, das du "bild" meinst?

      $test3= "$bild";

      ********************
      Diese 3 $test(s) sind Versuche um den Wert aus dem hidden Feld des Formulares von oben darzustellen, ich hab alle Varianten ausprobiert aber ich bekomm den Wert aus dem hidden Feld $image nicht! Das ist mein eigentliches Problem!
      ********************

      unlink("$pfad/$test1");
      unlink("$pfad/$test2");
      unlink("$pfad/$test3");

      auch hier solltest du den Erfolg checken

      *********** Kann ja nicht gehen, wenn $test1/2/3 leer sind*********

      unlink("$pfad/$test3") || print "Kann $pfad/$test3 nicht löschen, weil $!";

      print "Content-type: text/html\n\n";
      print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
      print "<html><head><title>Test-Ausgabe</title></head><body>\n";
      print "$test1, $test2, $test3,\n";
      print "</body></html>\n";

      Erst benutzt du CGI und dann wieder nicht?

      print CGI::header(), CGI::start_html(-title => 'Test-Ausgabe');

      Struppi.

      ***********
      Will eigentlich nur wissen wie ich einen Wert über ein Formular an ein mein CGI-Script übergeben kann....

      Danke Struppi!

      1. Hi,

        Diese 3 $test(s) sind Versuche um den Wert aus dem hidden Feld des Formulares von oben darzustellen, ich hab alle Varianten ausprobiert aber ich bekomm den Wert aus dem hidden Feld $image nicht! Das ist mein eigentliches Problem!

        steht im HTML(!)-Code (also _nicht_ im PHP- oder Perl-Code, sondern in dem, was der Browser letzten Endes erhält) _wirklich_ <input type="hidden" name="$image">? Ich wage es zu bezweifeln. Schau noch mal _genau_ in den Quellcode im Browser.

        unlink("$pfad/$test3");
        auch hier solltest du den Erfolg checken
        *********** Kann ja nicht gehen, wenn $test1/2/3 leer sind*********

        Eben deswegen sollst Du ja die Rückgabe überprüfen. Übrigens sind einzelne Leerzeilen zwischen Zitat und eigenem Text als optischer Trenner wesentlich sinnvoller als Sternchen.

        Will eigentlich nur wissen wie ich einen Wert über ein Formular an ein mein CGI-Script übergeben kann....

        _Das_ machst Du nicht falsch. Dein Fehler liegt woanders.

        Cheatah

        --
        X-Will-Answer-Email: No
      2. #!/usr/bin/perl

        use strict;
        use warnings;

        gehört hier noch hin.

        CGI Modul nutzen

        use CGI;

        Parametervariable festlegen

        $a = new CGI;

        Aussagekräftiger Variabelname, nebenbei ist $a und $b bereits reserviert.

        $pfad = "/home/www/html/bilder";
        opendir(DIR,"$pfad");

        opendir(DIR,"$pfad") || die "Kann $pfad nicht öffnen, weil: $!";
        ***************
        Das versteh ich nicht, wenn ich direkt den Pfadnamen bei unlink("$pfad/brunnen.jpg"); angebe wird die Datei gelöscht.
        *******************

        Du sollst prüfen ob es gelungen ist das Verzeichniss zu öffnen.

        open F, "name" || die ...

        || => ist eine "or" Verknüpfung.

        @files = readdir(DIR);
        closedir(DIR);

        $test1= CGI::param('$bild');
        $test2= $a->param("$bild");

        und hier ist der Fehler (den du mit Hilfe von strict gefunden hättest)

        Was steht den $bild? Kann es sein, das du "bild" meinst?

        $test3= "$bild";
        ********************
        Diese 3 $test(s) sind Versuche um den Wert aus dem hidden Feld des Formulares von oben darzustellen, ich hab alle Varianten ausprobiert aber ich bekomm den Wert aus dem hidden Feld $image nicht! Das ist mein eigentliches Problem!

        Weil dein Feld auch nicht '$image' heißt sondern 'image', bzw 'bild' und nicht '$bild'

        unlink("$pfad/$test1");
        unlink("$pfad/$test2");
        unlink("$pfad/$test3");

        auch hier solltest du den Erfolg checken

        *********** Kann ja nicht gehen, wenn $test1/2/3 leer sind*********

        Selbst wenn es gehen könnte, solltest du es testen.
        Das ist irgendwie so 'ne Unsitte von VB Programmierern (zumindest die ich kenne) nix wird geprüft, wird schon alles laufen. Wenn ich dein PHP Programm seh krieg ich das gruseln. Aber da kann ich nicht helfen.

        Aber auch diese Perlprogramm strotzt vor Unzulänglichkeiten, die in erster Linie dir als (vermutlich) Anfänger Fallstricke ohne Ende aufbauen.

        Wie gesagt, benutze user strict; und schalte die Warnungen an. Dann musst du alle Variabeln mit my deklarieren, aber es schützt dich vor Schreibfehlern und wenn du dann noch alle Warnungen eliminierst, ist dir bei deiner Fehlersuche schon viel geholfen.

        So wie du es hier machst, brauchst du mehr Zeit zur Fehlersuche als zum programmieren.

        Struppi.