Использование неинициализированного значения $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"} > }

Другие вопросы по тегам