2 Stimmen

Warum erhalte ich eine leere Seite von meinem Perl CGI-Skript?

Der Benutzer gibt einen Produktcode, den Preis und den Namen über ein Formular ein. Das Skript fügt es dann entweder der Datenbank hinzu oder löscht es aus der Datenbank. Wenn der Benutzer versucht, ein Produkt zu löschen, das nicht in der Datenbank ist, erhalten sie eine Fehlermeldung. Bei erfolgreichem Hinzufügen oder Löschen erhalten sie auch eine Meldung. Wenn ich es jedoch teste, erhalte ich nur eine leere Seite. Perl gibt keine Warnungen, Syntaxfehler oder ähnliches aus; sagt alles ist in Ordnung, aber ich erhalte immer noch nur eine leere Seite.

Das Skript:

#!/usr/bin/perl
#c09ex5.cgi - speichert Daten in einer Datenbank und entfernt Daten aus einer Datenbank
print "Content-type: text/html\n\n";
use CGI qw(:standard);
use SDBM_File;
use Fcntl;
use strict;

#Variablen deklarieren
my ($code, $name, $price, $button, $codes, $names, $prices);

#Werte den Variablen zuweisen
$code = param('Code');
$name = param('Name');
$price = param('Price');
$button = param('Button');

($code, $name, $price) = format_input();
($codes, $names, $prices) = ($code, $name, $price);

if ($button eq "Save") {
      add();
}
elsif ($button eq "Delete") {
      remove();
}
exit;

sub format_input {
         $codes =~ s/^ +//;
         $codes =~ s/ +$//;
         $codes =~ tr/a-z/A-Z/;
         $codes =~ tr/ //d;
         $names =~ s/^ +//;
         $names =~ s/ +$//;
         $names =~ tr/ //d;
         $names = uc($names);
         $prices =~ s/^ +//;
         $prices =~ s/ +$//;    
         $prices =~ tr/ //d;
         $prices =~ tr/$//d;
    }

sub add {
   #Variable deklarieren
   my %candles;

 #Datenbank öffnen, formatieren und Datensatz hinzufügen, Datenbank schließen
     tie(%candles, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
          or die "Fehler beim Öffnen von candlelist. $!, gestoppt";

     format_vars();
     $candles{$codes} = "$names,$prices";
     untie(%candles);

 #Webseite erstellen      
      print "\n";
      print "Candles Unlimited\n";
      print "\n";
      print "Danke, das folgende Produkt wurde hinzugefügt.\n";
      print "Kerze: $codes $names $prices\n";
      print "\n";
      } #Ende add

sub remove {
   #Variablen deklarieren
   my (%candles, $msg);

 tie(%candles, "SDBM_File", "candlelist", O_RDWR, 0)
          or die "Fehler beim Öffnen von candlelist. $!, gestoppt";

     format_vars();

     #Überprüfen, ob das Produkt aufgelistet ist
     if (exists($candles{$codes})) {
          delete($candles{$codes});
          $msg = "Die Kerze $codes $names $prices wurde entfernt.";
        }
     else {
     $msg = "Das von Ihnen eingegebene Produkt ist nicht in der Datenbank";
     }
     #Datenbank schließen
     untie(%candles);

#Webseite erstellen
print "\n";
print "Candles Unlimited\n";
print "\n";
print "Candles Unlimited\n";
print "$msg\n";
print "\n";
}

1voto

SqlACID Punkte 4018

Führen Sie es auf der Befehlszeile mit aus:

perl something.cgi Button=Save

...gibt mir einen Fehler:

Undefined subroutine &main::format_vars called at something.pl line 55.

Wenn ich beide Verweise von format_vars() in "format_input()" ändere, erhalte ich meiner Meinung nach die richtige Ausgabe.

1voto

Dave Sherohman Punkte 44017

Sie drucken keine Ausgabe außer dem Content-Type-Header, es sei denn, add oder remove wird aufgerufen. Das Problem ist nur, dass Sie vergessen haben, ein Formular anzuzeigen (vermutlich eins, das die Schaltflächen enthält), wenn keine Schaltfläche angeklickt wurde.

Bearbeiten: Wenn Sie Ihren geposteten Code kopieren und etwas aufräumen und ihn unter der URL http://localhost/~me/foo.cgi?Code=1;Name=2;Price=3;Button=Save oder http://localhost/~me/foo.cgi?Code=1;Name=2;Price=3;Button=Delete aufrufen, erhalte ich eine ordnungsgemäße HTML-Ausgabe. Die bereinigte Version des für dies verwendeten Codes lautet:

#!/usr/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";
use CGI qw(:standard);
use SDBM_File;
use Fcntl;
use strict;

#Variablen deklarieren
my ($code, $name, $price, $button, $codes, $names, $prices);

#Werte den Variablen zuweisen
$code = param('Code');
$name = param('Name');
$price = param('Price');
$button = param('Button');

($code, $name, $price) = format_input();
($codes, $names, $prices) = ($code, $name, $price);

if ($button eq "Save") {
  add();
}
elsif ($button eq "Delete") {
  remove();
}
exit;

sub format_input {
  $codes =~ s/^ +//;
  $codes =~ s/ +$//;
  $codes =~ tr/a-z/A-Z/;
  $codes =~ tr/ //d;
  $names =~ s/^ +//;
  $names =~ s/ +$//;
  $names =~ tr/ //d;
  $names = uc($names);
  $prices =~ s/^ +//;
  $prices =~ s/ +$//;
  $prices =~ tr/ //d;
  $prices =~ tr/$//d;
  }

sub add {
#   #Variable deklarieren
#   my %candles;
#
# #Datenbank öffnen, formatieren, Datensatz hinzufügen, Datenbank schließen
#     tie(%candles, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
#          or die "Fehler beim Öffnen der candlelist. $!, gestoppt";
#
#     format_vars();
#     $candles{$codes} = "$names,$prices";
#     untie(%candles);

 #Webseite erstellen   
 print "\n";
 print "Candles Unlimited\n";
 print "\n";
 print "Danke, das folgende Produkt wurde hinzugefügt.\n";
 print "Kerze: $codes $names $prices\n";
 print "\n";
 } #Ende add

sub remove {
#   #Variablen deklarieren
#   my (%candles, $msg);
#
# tie(%candles, "SDBM_File", "candlelist", O_RDWR, 0)
#          or die "Fehler beim Öffnen der candlelist. $!, gestoppt";
#
#     format_vars();
#
#     #Feststellen, ob das Produkt aufgelistet ist
#     if (exists($candles{$codes})) {
#          delete($candles{$codes});
#          $msg = "Die Kerze $codes $names $prices wurde entfernt.";
#        }
#     else {
#     $msg = "Das eingegebene Produkt ist nicht in der Datenbank";
#     }
#     #Datenbank schließen
#     untie(%candles);

  #Webseite erstellen
  print "\n";
  print "Candles Unlimited\n";
  print "\n";
  print "Candles Unlimited\n";
#  print "$msg\n";
  print "Aufruf entfernen";
  print "\n";
  }

Beachten Sie, dass bei aktivierten warnings eine Menge "uninitialized value"-Warnungen ausgegeben werden, da Sie $code vs. $codes, $name vs. $names und $price vs. $prices auf problematische Weise durcheinanderbringen. (Hinweis: Sie weisen ($code, $name, $price) = format_input(); zu, aber format_input gibt nicht drei Werte zurück.)

Ich vermute, dass Sie, wie in einem früheren Kommentar vorgeschlagen, wieder/Ständig mit Groß- und Kleinschreibung zu kämpfen haben. Mein erster Versuch, dies zu testen, scheiterte, weil ich "button=Save" anstelle von "Button=Save" in der URL verwendete. Die Namen der HTTP Anfrageparameter sind im Allgemeinen konventionell alle in Kleinbuchstaben, und aus gutem Grund, da dies hilft, Probleme dieser Art zu vermeiden.

Weitere zufällige Kommentare:

  • Sie können Ihre Variablen gleichzeitig deklarieren und ihnen Werte zuweisen, z. B. my $code = param('Code');. Dies wird im Allgemeinen als bessere/bevorzugte Praxis angesehen, da die Deklaration so spät wie möglich erfolgt, um den Gültigkeitsbereich der Variable zu minimieren.

  • In format_input ist es redundant, sowohl s/^ +//; s/ +$//; als auch tr/ //d; zu verwenden, da tr auch führende und abschließende Leerzeichen entfernt.

  • Beim Abrufen von Werten Ihrer Parameter sollten Sie entweder Standardwerte angeben, wenn der Parameter leer/fehlt, oder prüfen, ob er leer/fehlt, und dem Benutzer eine Fehlermeldung anzeigen.

  • Sie sollten auch nach elsif ($button eq "Delete") eine abschließende else-Klausel haben, um einen Fehler anzuzeigen, wenn $button fehlt oder ungültig ist. Ja, ich weiß, dass dieses Skript dazu gedacht ist, von einem bestimmten Formular aufgerufen zu werden, also sollte es "immer" einen gültigen $button haben, aber es ist trivial, das Formular zu umgehen und jeden Satz von Werten (gültig oder nicht) direkt an das Skript zu senden, also müssen Sie dennoch alles auf der Serverseite überprüfen und validieren. Alles, weil Sie nicht wissen, woher es tatsächlich stammt oder ob der Client es ordnungsgemäß validiert hat.

0voto

Duane Stine Punkte 1

Dies ist, wie ich das Skript ausgeführt habe und es hat die richtigen Ergebnisse geliefert. Stellen Sie sicher, dass die PERL-Module ordnungsgemäß installiert sind, wo immer Sie die Website hosten.

Hinweis: Der Hosting-Service, den ich verwende (BlueHost), erfordert, dass ich meine Perl-Module über den #!/usr/bin/perlml aufrufe

  #!/usr/bin/perlml

  use strict;
  use warnings;

  print "Content-type: text/html\n\n";
  use CGI qw(:standard);
  use SDBM_File;
  use Fcntl;
  use strict;

  #Variablen deklarieren
  my ($code, $name, $price, $button, $codes, $names, $prices);

  #Werte den Variablen zuweisen
  $code = param('Code');
  $name = param('Name');
  $price = param('Price');
  $button = param('Button');

  ($codes, $names, $prices) = format_input();
  ($codes, $names, $prices) = ($code, $name, $price);

  if ($button eq "Speichern") {
  hinzufügen();
  }
  elsif ($button eq "Löschen") {
  entfernen();
  }
  exit;

  sub format_input {
  $codes =~ s/^ +//;
  $codes =~ s/ +$//;
  $codes =~ tr/a-z/A-Z/;
  $codes =~ tr/ //d;
  $names =~ s/^ +//;
  $names =~ s/ +$//;
  $names =~ tr/ //d;
  $names = uc($names);
  $prices =~ s/^ +//;
  $prices =~ s/ +$//;
  $prices =~ tr/ //d;
  $prices =~ tr/$//d;
  }

  sub hinzufügen {
  #Variable deklarieren
  my %kerzen;

  #Datenbank öffnen, formatieren und Datensatz hinzufügen, Datenbank schließen
  tie(%kerzen, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
  or die "Fehler beim Öffnen von candlelist. $!, gestoppt";

  format_input();
  $kerzen{$code} = "$name,$price";
  untie(%kerzen);

  #Webseite erstellen      
  print "\n";
  print "Kerzen ohne Grenzen\n";
  print "\n";
  print "Danke, das folgende Produkt wurde hinzugefügt.\n";
  print "Kerze: $codes, $names, $prices\n";
  print "\n";
  } #Ende hinzufügen

  sub entfernen {
  #Variablen deklarieren
  my (%kerzen, $msg);

  tie(%kerzen, "SDBM_File", "candlelist", O_RDWR, 0)
  or die "Fehler beim Öffnen von candlelist. $!, gestoppt";
  format_input();

  #Überprüfen, ob das Produkt aufgelistet ist
  if (exists($kerzen{$code})) {
  delete($kerzen{$code});
  $msg = "Die Kerze $code, $name, $price wurde entfernt.";
  }
  else {
  $msg = "Das von Ihnen eingegebene Produkt ist nicht in der Datenbank vorhanden.";
  }
  #Datenbank schließen
  untie(%kerzen);

  #Webseite erstellen
  print "\n";
  print "Kerzen ohne Grenzen\n";
  print "\n";
  print "Kerzen ohne Grenzen\n";
  print "$msg\n";
  print "\n";
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X