Использование неинициализированного значения $form_data{"BuildAcct"}
* Второе обновление за воскресенье *
Теперь в этот момент я обнаружил некоторый дополнительный успех при отображении нужной подпрограммы. Новый фрагмент кода, который позволил мне фактически вызывать определенную подпрограмму, как я хотел.
В ходе исследования я наткнулся на следующий фрагмент, который касается чтения входящих данных FORM. Этот фрагмент позволяет активировать вызов sub моего выбора из этого сценария. Однако из CLI, когда я запускаю perl -x для скрипта, система возвращает следующие нефатальные * предупреждения *, которые я хотел бы получить для понимания и решения. Мои исследования показывают, что (tr///) и $ENV{"REQUEST_METHOD"} и $buffer возвращают пустые значения "" ИЛИ 0. Как мне лучше всего решить эти следующие ошибки? Я понимаю, что могу просто удалить любую ссылку на (tr///) и $buffer для устранения этих ошибок, однако я задаю вопрос об удалении *$ENV{"REQUEST_METHOD"}*, так как это кажется обязательным для функции этого фрагмента???
CLI ERROR
Use of uninitialized value in transliteration (tr///) at test.pl line 36 (#1) Use of uninitialized value $ENV{"REQUEST_METHOD"} in string eq at test.pl line 37 (#1) Use of uninitialized value $buffer in split at test.pl line 44 (#1)
#!/usr/bin/perl -w
# (test.pl)
use DBI;
use DBD::mysql;
use warnings;
use strict;
use diagnostics;
$| = 1;
# The script I am wanting to create, is to allow users at (NAS) HotSpot to create a user account
# which is to write into MySQL db TABLE's *radcheck* and *radreply*.
#
# Now at this point I have found some added success at displaying the desired *sub*
# The new snippet of code which enabled me to actually *invoke* a specific *sub* as I wanted
# from an HTML form.
# Please see below for solution which still has some questions.
print "Content-type: text/html\n\n";
sub BuildAcctNow {
print "<h1 style=\"color:blue;font-family:Arial;font-size:xx-large;\">TO BUILD YOUR ACCOUNT TODAY WE WILL NEED A SMALL AMOUNT OF INFORMATION</h1><br><br>\n\n";
}
sub PauseAcctNow {
print "<h2 style=\"color:red;font-family:Arial;font-size:xx-large;\">YOUR ACCOUNT HAS BEEN PAUSED PLEASE MAKE A PAYMENT HERE.</h2><br><br>\n\n";
}
# In researching I stumbled upon the fllowing snippet which deals with reading inward FORM data.
# This snippet *does* enable the *invocation* of the *sub* of my choice from this script.
# However from the CLI when I run perl -x against the script the system returns the following
# *nonfatal* *warnings* that I would like to gain understading of and resolve.
# My research shows that (tr///) and $ENV{"REQUEST_METHOD"} and $buffer are returning empty
# values, How would I best resolve these following errors? I realize I can just delete any
# reference to (tr///) and $buffer to resolve those errors, howerver I question removing
# $ENV{"REQUEST_METHOD"} as it seems this imperative to the function of th ssnippet???
#
#
# Use of uninitialized value in transliteration (tr///) at test.pl line 36 (#1)
# Use of uninitialized value $ENV{"REQUEST_METHOD"} in string eq at test.pl line 37 (#1)
# Use of uninitialized value $buffer in split at test.pl line 44 (#1)
my ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
if ($FORM{PauseAcct}) {
PauseAcctNow();
exit;
}
elsif ($FORM{BuildAcct}) {
BuildAcctNow();
exit;
}
Конец второго воскресенья ОБНОВЛЕНИЕ
ВОСКРЕСНОЕ ОБНОВЛЕНИЕ ** Я сделал простой сценарий, чтобы, надеюсь, продемонстрировать, что я пытаюсь сделать до этого момента, надеюсь? Сценарий, который мне в конечном итоге понадобится создать, запишет в MySQL db в radcheck и, что позволит пользователям войти в HotSpot (NAS). Поэтому у меня будет более одной подпрограммы в скрипте.
В настоящее время сценарий отображает браузер VIA с пустым экраном, когда я использую документ HTML с правильно названной формой SUBMIT внутри документа BuildAcct.
Я традиционно привык определять подпрограмму в скрипте, а затем я бы определил, есть ли в скрипте тест (ы), который будет ожидать совпадения (ей) от любого определенного имени (ей) формы, когда они взаимодействуют, чтобы затем вызвать конкретный суб.
Ниже приведен тестовый сценарий, который я создал, пытаясь обойти устаревшее использование & при вызове сабвуфера, это вызывает у меня некоторое горе, и я надеюсь получить какой-то ценный вклад.
#!/usr/bin/perl -w
# (test.pl)
use DBI;
use DBD::mysql;
use warnings;
#use strict;
# Presently due to my errors below I have disabled *use strict*.
$| = 1;
# The script I am wanting to create, is to allow users at (NAS) HotSpot to create a user account
# which is to write into MySQL db TABLE's *radcheck* and *radreply*.
#
# Trying to bring myself up to speed with a very basic task which I have defined below, in my
# older scripts I would define the *sub* itself, then in the script I would use an *if* test
# which checks to see if any defined FORM value returns a hit such as $form_data{'BuildAcct'} ne ""
# to call the required *sub* _ThisOne_.
print "Content-type: text/plain\n\n";
sub ThisOne {
print "Trying to display this subroutine upon submission of BuildAcct\n";
}
# Following is the *if* test I am accustomed to using to make a call to a particular sub when
# the form NAME BuildAcct is interacted with, but this is unacceptable now I realize.
# CLI Return:
# Use of uninitialized value $form_data{"BuildAcct"} in string ne at test.pl line 32.
# Use of uninitialized value $form_data{"BuildAcct"} in string ne at test.pl line 41.
if ($form_data{'BuildAcct'} ne "")
{
&ThisOne;
exit;
}
# SO, I have Google'd, and looked over numerous methods of calling *subs*, I am just stuck though,
# Why can't the following *if* test work if use of & is no longer used?
if ($form_data{'BuildAcct'} ne "")
{
ThisOne();
exit;
}
Заранее благодарю за помощь... С наилучшими пожеланиями
ОБНОВИТЬ **
Я выключил ключ -w в сценарии, не уверен, что это отрицательно влияет, довольно плохо знаком с Perl.
Я также создал немного неуклюжий код, который уродлив. Странно то, что из CLI, когда я выполняю скрипт, система возвращает:
Use of uninitialized value $form_data{"BuildAcct"} in string at acctmanager.pl line 211.
Use of uninitialized value $form_data{"Test"} in string at acctmanager.pl line 212.
Тем не менее, в браузере VIA из документа HTML я могу изменять значение имени SUBMIT назад и вперед между BuildAcct и Test, и сценарий успешно возвращает две разные и правильные подпрограммы при отправке.
Подпрограмма BuildAcct возвращает поля формы, которые я определил в этой подпрограмме, тогда как Test выполняет выборку строк MySQL TABLE GROUP и отображает 3 разные таблицы из базы данных и печатает их в браузере.
Ниже мой настоящий код:-(
local ($form_data{'BuildAcct'}) = "$form_data{'BuildAcct'}";
local ($form_data{'Test'}) = "$form_data{'Test'}";
#
# AddNewUser FORM definition.
if ($form_data{'BuildAcct'} ne "")
{
&AddNewUser;
exit;
}
#
# DispTest FORM definition.
elsif ($form_data{'Test'} ne "")
{
&DispTest;
exit;
}
Может ли кто-нибудь подтолкнуть меня в правильном направлении?
заранее спасибо
ORIGINAL POST
На данный момент у меня есть ФОРМА в HTML-документе с именем BuildAcct, аналогично в моем сценарии я определил следующее: вызов функции подпрограммы AddNewUser, когда пользователь отправляет HTML-форму...
if ($form_data{'BuildAcct'} ne "")
{
&AddNewUser;
exit;
}
Скрипт использует cgi-lib.pl
# Enable parsing of FORM_DATA VIA cgi-lib.pl.
&ReadParse(*form_data);
## FORM or IMG FORM Fix
foreach (keys %form_data)
{
## Fix incoming form data with Image buttons
$form_data{$1} = $form_data{$_} if (/(.*)\.x/);
}
Я не могу понять, почему это работает в другом скрипте, который я использую, но этот новый скрипт возвращает следующее при выполнении в CLI;
Use of uninitialized value $form_data{"BuildAcct"} in string ne at acctmanager.pl line 208.
Use of uninitialized value $form_data{"Test"} in string ne at acctmanager.pl line 215.
Помощь и предложения очень ценятся. С уважением
2 ответа
Я думаю, что %form_data
хеш заполняется через cgi-lib.pl, поэтому, когда вы запускаете его через командную строку, cgi-lib.pl не получает никакого ввода от веб-браузера... сказав это, вы не включили код, где вы используете cgi-lib.pl, так что я не уверен.
ps не выключайте предупреждения. Они там по причине. Если ничего другого, вы можете вставить предупреждение в Google. Пока вы на это, всегда ставьте use strict;
в верхней части вашего скрипта и исправьте все необъявленные переменные.
Чтобы исправить ошибку "Использование неинициализированного значения $form_data{"BuildAcct"} в строке",
Вы можете проверить с помощью define($form_data{"BuildAcct"}) или определенной $form_data{"BuildAcct"}, как показано ниже, прежде чем использовать $form_data{"BuildAcct"} :
if (определено $form_data{"BuildAcct"}) { < другой код, основанный на $form_data{"BuildAcct"} > }