Вы не печатаете никаких выходных данных, кроме заголовка 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
, но тривиально обойти форму и передать любой набор значений (действительных или нет) в сценарий напрямую, поэтому вам все еще нужно проверять и проверять все на стороне сервера, потому что вы не знаете, откуда оно будет на самом деле или клиент правильно его проверял.