Разработка CGI-приложений на Perl и PHP
Рассмотрим для примера сценарий выполняющий четыре арифметические операции над целыми числами, которые пользователь вводит через поля веб-формы в браузере.
#!c:/perl/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
$method = $ENV{'REQUEST_METHOD'};
if ($method eq 'POST')
{
$length = $ENV{'CONTENT_LENGTH'};
read(STDIN, $qstr, $length);
}
else
{
if ($method eq 'GET') { $qstr = $ENV{'QUERY_STRING'}; }
else
{
print "Method ".$method." is not supported </BODY></HTML>";
exit(0);
}
}
$qstr =~ tr/+/ /;
$qstr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@pars = split(/&/, $qstr);
$n_pars = @pars;
foreach $par (@pars)
{
($name, $value) = split(/=/, $par);
$opers{$name} = $value;
}
$op1 = int($opers{'A'});
$op2 = int($opers{'B'});
$op = $opers{'op'};
switch:
{
if ($op eq '+') { $res = $op1 + $op2; last switch; }
if ($op eq '-') { $res = $op1 - $op2; last switch; }
if ($op eq '*') { $res = $op1 * $op2; last switch; }
if ($op eq '/')
{
if ($op2 == 0)
{
print " Divide by zero! </BODY></HTML>";
exit(0);
}
else
{
$res = $op1 / $op2; last switch;
}
}
{
print "Operator ".$op." is not supported </BODY></HTML>";
exit(0);
}
}
print "Result: ".$op1.$op.$op2.' = '.$res;
print "<p><a href=\'".$ENV{'HTTP_REFERER'}."\'>Back</a></p>";
print "</HTML></BODY>\n";
10.3.
Калькулятор арифметических операций для целых операндов
В данном примере из строки запроса извлекаются 3 параметра с именами "A", "B" и "op", после чего в зависимости от значения третьего параметра выполняется соответствующая арифметическая операция над первыми двумя параметрами.
В итоге формируется html страница с результатом вычисления и обратной ссылкой на исходную страницу с формой. Для определения адреса исходной страницы используется значение переменной окружения HTTP_REFERER:
Result: 34*12 = 408
Для поиска синтаксических ошибок в сценариях на Perl можно использовать непосредственный запуск интерпретатора в командной строке, который находится в установочном каталоге Perl:
Основы разработки сценариев на языке PHP
PHP - сценарии могут размещаться в отдельном файле (с расширением .php) или встраиваются непосредственно в HTML документ.
Существует несколько способов внедрения кода PHP в HTML документы:
- С помощью открывающего тега <?php и закрывающего тега ?>.
- С помощью коротких тегов <? и ?>. Данная возможность доступна только при специальной настройке.
- С помощью тэгов <script language="php"> и </script>
- Путем использования echo тэгов в стиле ASP: <% и %>. Такая возможность доступна при соответствующей конфигурационной настройке.
В дальнейшем в примерах будет использоваться первый из вариантов внедрения PHP кода.
Код, который находится внутри указанных тэгов, обрабатывается интерпретатором PHP, весь остальной код остается неизменным.
Для того, чтобы увидеть текущие настройки PHP, и для проверки его работоспособности полезно использовать специальную функцию phpinfo():
<?php phpinfo(); ?>10.4. Использования php-функции phpinfo()
После выполнения этого кода, в веб-браузере можно будет увидеть примерно следующее (показана небольшая часть):
В целом же листинг содержит информацию об установленных опциях и расширениях PHP, версии PHP, информацию о веб-сервере и переменных окружения, информацию о версии ОС, путях, настройках конфигурационных переменных, полях заголовка HTTP и PHP лицензии.
Следующий пример демонстрирует вариант с внедрением PHP кода в HTML:
<html>
<body>
<p>Hello! </p>
<p>Today is:
<?php
$today = date("F j, Y, g:i a");
echo($today);
?>
</p>
</body>
</html>
10.5.
Внедрение PHP кода в HTML документ
Результат обработки этого документа представлен ниже:
Одной из главных задач, решаемых с помощью PHP, является обработка данных, получаемых от пользователя через веб-формы. Рассмотрим каким образом в PHP реализуется такая обработка.
<?php
$method = $_SERVER["REQUEST_METHOD"];
if ($method == "GET") $query = "_GET";
elseif ($method == "PUT") $query = "_PUT";
else die("$method is not supported!");
print "<p><b>Method</b>: $method </p>";
print "<p><u>Params:</u></p>";
foreach ($$query as $name => $value)
{
print "<b>$name</b> = <i>$value</i> <br>";
}
?>
10.6.
Вывод списка параметров, полученных сервером в запросе от клиента
В первой строке сценария с помощью переменной окружения REQUEST_METHOD из глобального ассоциативного массива $_SERVER определяется метод передачи данных в запросе клиента. В зависимости от выбранного метода переданные данные будут извлекаться либо из глобальной переменной $_GET либо из $_PUT. Если метод отличается от GET или PUT, либо неопределен, то происходит принудительное завершение работы сценария с выдачей сообщения через вызов функции die(). В принципе, можно также использовать глобальный массив $_REQUEST, содержащий внутри себя массивы $_GET, $_ POST и $_COOKIE, позволяющий избавиться от проверки метода передачи.
Конструкция вида $$query демонстрирует косвенное обращение к переменной, т.е. переменная $query содержит идентификатор другой переменной, и для обращения к ней необходимо добавить еще один знак $.
Обе переменные $_GET и $_ POST являются ассоциативными массивами, поэтому для перебора элементов был использован специальный оператор
foreach (имя_массива as ключ => значение)
Следует обратить внимание на то, что внутрь строковых констант, ограниченных символами " " можно вставлять переменные. После обработки такой строки интерпретатором вместо переменной вставляется ее фактическое значение. Также для конкатенации строк можно использовать оператор ' .' В целом можно сказать, что в PHP можно использовать операторы ветвления, выбора и циклов аналогичные тем, что используются в языке C.
Код сценария, реализующего четыре арифметические операции над целыми числами представлен в листинге ниже:
<?php
$method = $_SERVER["REQUEST_METHOD"];
if ($method == "GET") $query = "_GET";
elseif ($method == "PUT") $query = "_PUT";
else die("$method is not supported!");
$q = $$query;
$a = $q["A"];
$b = $q["B"];
$op = $q["op"];
switch ($op)
{
case '+': $result = (int)$a + (int)$b; break;
case '-': $result = (int)$a - (int)$b; break;
case '*': $result = (int)$a * (int)$b; break;
case '/':
{
if ($b == '0') die("divide by zero!");
}
default: die("operator $op is not defined");
}
print "<p>Result: $a $op $b = $result </p>";
print "<p><a href=".$_SERVER['HTTP_REFERER'].">Back</a></p>";
?>
10.7.
Калькулятор арифметических операций для целых операндов
В PHP имеется широкий диапазон функция для работы с файлами. Например, следующий пример демонстрирует чтение файла, в котором находится выполняемый PHP код:
<?php
$fh = fopen("read.php","r");
if (!$fh) die("Cannot open file");
while (!feof ($fh))
{
$line = fgets($fh);
echo $line,"<br>";
}
fclose($fh);
?>
10.8.
Чтение файла, содержащего PHP код, выполняемого сценария
В данном примере используются практические те же самые функции, что и в языке C:
- fopen(путь_к_файлу, тип_доступа) – открытие файла;
- feof (указатель_на_файл) – проверка на наличие признака конца файла;
- fgets(указатель_на_файл) – чтение строки из файла;
- fclose(указатель_на_файл) – закрытие файла.
Для записи данных в файл можно использовать функцию fputs(указатель_на_файл, строка). В следующем примере сгенерированные функцией rand() псевдослучайные числа сохраняются в файле rand.dat:
<?php
$n = 10;
$fh = fopen("rand.dat","w");
if (!$fh) die("Cannot open file");
srand();
for ($i=0; $i < $n; $i++)
{
$d = rand(0,100);
fputs($fh,"$d\n");
}
fclose($fh);
?>
10.9.
Сохранение в файле последовательности псевдослучайных чисел
Перед выполнением данного сценария следует правильно настроить права доступа для веб-сервера к каталогу.



