Почему я получаю пустую страницу из моего Perl CGI-скрипта? - PullRequest
2 голосов
/ 02 мая 2010

Пользователь вводит код продукта, цену и название, используя форму. Затем сценарий либо добавляет его в базу данных, либо удаляет его из базы данных. Если пользователь пытается удалить продукт, которого нет в базе данных, он получает сообщение об ошибке. При успешном добавлении или удалении они также получают сообщение. Однако, когда я проверяю это, я просто получаю пустую страницу. Perl не выдает никаких предупреждений, синтаксических ошибок или чего-либо еще; говорит, что все хорошо, но я все еще просто получаю пустую страницу.

Сценарий:

    #!/usr/bin/perl
#c09ex5.cgi - saves data to and removes data from a database
print "Content-type: text/html\n\n";
use CGI qw(:standard);
use SDBM_File;
use Fcntl;
use strict;

#declare variables
my ($code, $name, $price, $button, $codes, $names, $prices);


#assign values to variables
$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 {
   #declare variable
   my %candles;

 #open database, format and add record, close database
     tie(%candles, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
          or die "Error opening candlelist. $!, stopped";

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

 #create web page      
      print "<HTML>\n";
      print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
      print "<BODY>\n";
      print "<FONT SIZE=4>Thank you, the following product has been added.<BR>\n";
      print "Candle: $codes $names $prices</FONT>\n";
      print "</BODY></HTML>\n";
      } #end add


sub remove {
   #declare variables
   my (%candles, $msg);

 tie(%candles, "SDBM_File", "candlelist", O_RDWR, 0)
          or die "Error opening candlelist. $!, stopped";

     format_vars();

     #determine if the product is listed
     if (exists($candles{$codes})) {
          delete($candles{$codes});
          $msg = "The candle $codes $names $prices has been removed.";
        }
     else {
     $msg = "The product you entered is not in the database";
     }
     #close database
     untie(%candles);

#create web page
print "<HTML>\n";
print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
print "<BODY>\n";
print "<H1>Candles Unlimited</H1>\n";
print "$msg\n";
print "</BODY></HTML>\n";
}

Ответы [ 3 ]

1 голос
/ 02 мая 2010

Вы не печатаете никаких выходных данных, кроме заголовка Content-Type, если не вызывается add или remove. Проблема только в том, что вы забыли отобразить форму (предположительно, содержащую кнопки), если ни одна кнопка не была нажата.

Редактировать: Скопировать опубликованный код и выполнить небольшую очистку, а затем вызвать его по URL-адресу http://localhost/~me/foo.cgi?Code=1;Name=2;Price=3;Button=Save или http://localhost/~me/foo.cgi?Code=1;Name=2;Price=3;Button=Delete, Я получаю правильный вывод HTML. Очищенная версия кода, используемого для этого:

#!/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;

#declare variables
my ($code, $name, $price, $button, $codes, $names, $prices);


#assign values to variables
$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 {
#   #declare variable
#   my %candles;
#
# #open database, format and add record, close database
#     tie(%candles, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
#          or die "Error opening candlelist. $!, stopped";
#
#     format_vars();
#     $candles{$codes} = "$names,$prices";
#     untie(%candles);

 #create web page      
 print "<HTML>\n";
 print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
 print "<BODY>\n";
 print "<FONT SIZE=4>Thank you, the following product has been added.<BR>\n";
 print "Candle: $codes $names $prices</FONT>\n";
 print "</BODY></HTML>\n";
 } #end add


sub remove {
#   #declare variables
#   my (%candles, $msg);
#
# tie(%candles, "SDBM_File", "candlelist", O_RDWR, 0)
#          or die "Error opening candlelist. $!, stopped";
#
#     format_vars();
#
#     #determine if the product is listed
#     if (exists($candles{$codes})) {
#          delete($candles{$codes});
#          $msg = "The candle $codes $names $prices has been removed.";
#        }
#     else {
#     $msg = "The product you entered is not in the database";
#     }
#     #close database
#     untie(%candles);

  #create web page
  print "<HTML>\n";
  print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
  print "<BODY>\n";
  print "<H1>Candles Unlimited</H1>\n";
#  print "$msg\n";
  print "<p>Called remove</p>";
  print "</BODY></HTML>\n";
  }

Обратите внимание, что при включенном warnings это издает много предупреждений о "неинициализированном значении", поскольку вы получаете $code против $codes, $name против $names и $price против $prices путать друг с другом в плохих отношениях. (Подсказка: вы назначаете ($code, $name, $price) = format_input();, но format_input не возвращает три значения.)

Я подозреваю, что, как указывалось в предыдущем комментарии, у вас снова возникают проблемы с учетом регистра. Моя первая попытка проверить это не удалась, потому что я использовал «button = Save» вместо «Button = Save» в URL. Имена параметров HTTP-запроса обычно заключаются в строчные буквы и по понятной причине, поскольку это помогает избежать подобных проблем.

Другие случайные комментарии:

  • Вы можете объявлять переменные одновременно с их первым присвоением, например, my $code = param('Code');. Как правило, это считается лучшей / предпочтительной практикой, поскольку создание вашего объявления как можно позже помогает минимизировать область действия переменной.

  • В format_input он избыточен как s/^ +//; s/ +$//;, так и tr/ //d;, так как tr также удалит начальные и конечные пробелы.

  • При получении значений ваших параметров вы должны либо указать значения по умолчанию, если параметр пустой / отсутствует, либо проверить наличие пустых / отсутствующих и отобразить ошибку для пользователя.

  • У вас также должно быть заключительное предложение else после elsif ($button eq "Delete") для отображения ошибки, если $button отсутствует или недействителен. Да, я знаю, что этот сценарий предназначен для вызова из определенной формы, поэтому он должен «всегда» иметь действительный $button, но тривиально обойти форму и передать любой набор значений (действительных или нет) в сценарий напрямую, поэтому вам все еще нужно проверять и проверять все на стороне сервера, потому что вы не знаете, откуда оно будет на самом деле или клиент правильно его проверял.

1 голос
/ 02 мая 2010

Запуск его в командной строке с:

perl something.cgi Button=Save

... выдает ошибку:

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

Если я изменю обе ссылки format_vars () на "format_input ()", я получу то, что считаю правильным выводом.

0 голосов
/ 29 октября 2015

Вот как я запустил скрипт, и он дал правильные результаты. Убедитесь, что где бы вы ни размещали сайт, на нем установлены соответствующие модули PERL.

Примечание. Служба хостинга, которую я использую (BlueHost), требует, чтобы я вызывал свои модули Perl через #! / Usr / bin / perlml

   #!/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;

   #declare variables
   my ($code, $name, $price, $button, $codes, $names, $prices);


   #assign values to variables
   $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 "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 {
   #declare variable
   my %candles;

   #open database, format and add record, close database
   tie(%candles, "SDBM_File", "candlelist", O_CREAT|O_RDWR, 0666)
   or die "Error opening candlelist. $!, stopped";

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

   #create web page      
   print "<HTML>\n";
   print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
   print "<BODY>\n";
   print "<FONT SIZE=4>Thank you, the following product has been added.<BR>\n";
   print "Candle: $codes, $names, $prices</FONT>\n";
   print "</BODY></HTML>\n";
   } #end add

   sub remove {
   #declare variables
   my (%candles, $msg);

   tie(%candles, "SDBM_File", "candlelist", O_RDWR, 0)
   or die "Error opening candlelist. $!, stopped";
   format_input();

   #determine if the product is listed
   if (exists($candles{$code})) {
   delete($candles{$code});
   $msg = "The candle $code, $name, $price has been removed.";
   }
   else {
   $msg = "The product you entered is not in the database";
   }
   #close database
   untie(%candles);

   #create web page
   print "<HTML>\n";
   print "<HEAD><TITLE>Candles Unlimited</TITLE></HEAD>\n";
   print "<BODY>\n";
   print "<H1>Candles Unlimited</H1>\n";
   print "$msg\n";
   print "</BODY></HTML>\n";
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...