Ввод параметров из строки запроса

Параметры передаются в основном методом GET, и только в исключительных случаях (пароли) методом POST. Параметры вводятся программой getCGIparm, и есть некоторое количество макрокоманд для облегчения этого процесса.

GETPARM(ПЕРЕМЕННАЯ, ПРАВИЛО, СОБЩЕНИЕ_ОБ_ОШИБКЕ)
В переменную интерпретатора sh вводится неименованное значение, полученное из параметра, если оно удовлетворяет заданному правилу. Если не удовлетворяет, то выводится сообщение об ошибке. Если третий параметр не задан, то выводится некоторое предопределенное сообщение об ошибке.
Правила здесь не описываются, их можно почитать в справочных материалах к getCGIparm (см man getCGIparm).
GETnPARM(ПЕРЕМЕННАЯ, ПРАВИЛО, СОБЩЕНИЕ_ОБ_ОШИБКЕ)
В переменную интерпретатора sh вводится именованное значение, имя которого совпадает с заданной переменной, если оно удовлетворяет заданному правилу. Если не удовлетворяет, то выводится сообщение об ошибке. Если третий параметр не задан, то выводится некоторое предопределенное сообщение об ошибке.
get_name(ПЕРЕМЕННАЯ)
В переменную интерпретатора sh вводится неименованное значение, если оно удовлетворяет принятому виду имен. Если такое значение отсутствует, то выводится сообщение об ошибке.
get_named(ПЕРЕМЕННАЯ)
В переменную интерпретатора sh вводится именованное значение, имя которого совпадает с заданной переменной, если оно удовлетворяет принятому виду имен. Если такое значение отсутствует, то выводится сообщение об ошибке.
get_numed(ПЕРЕМЕННАЯ)
В переменную интерпретатора sh вводится именованное значение, имя которого совпадает с заданной переменной, если оно является записью целого числа Если такое значение отсутствует, то выводится сообщение об ошибке.
NAMED
Правило для getCGIparm, которое используется в get_name и get_named макрокомандах.
NUMER
Правило для getCGIparm, которое используется в get_numed макрокоманде
Пример странички, которая должна выводить номер договора по имени:
        hpage(Номер договора,dnl
        <!-- $Id$ -->
        exec(dnl
        get_name(name
        sqlour(dnl
        SELECT '<table>
          <tr><td>' || nm || '</td></tr>
        </table>'
         FROM nm WHERE nnm = '${name}'
        )))
       
Обращение к этой странице такое:
        страница.shtml?имя_договора
       
Если же надо передать два и больше переметров, то их надо именовать. Например, для такого обращения (предположим, проверяем, существует ли договор с заданным номером и именем):
        страница.shtml?name=имя_договора&num=номер_договора
       
страницу надо переписать так:
        hpage(Номер договора,dnl
        <!-- $Id$ -->
        exec(dnl
        get_named(name
        get_numed(num
        sqlour(dnl
        SELECT '<table>
          <tr><td>' || CASE WHEN EXISTS(SELECT * FROM nm WHERE nnm = '${name}' AND nm = ${num}) || '</td></tr>
        </table>'
        )))
       
При таком способе ввода есть гарантия, что если попытаться вместо номера, например, ; DELETE FROM nm; SELECT... то результатом будет только сообщение об ошибке во входном параметре.

А.А.Бабайлов (C)2003..2022