Спонсор: Microsoft
Воронежский государственный университет
Опубликован: 04.02.2009 | Доступ: свободный | Студентов: 8216 / 665 | Оценка: 4.14 / 3.78 | Длительность: 19:54:00
Самостоятельная работа 5:

Разработка CGI-приложений на Perl и PHP

< Лекция 5 || Самостоятельная работа 5: 123 || Лекция 6 >

Рассмотрим для примера сценарий выполняющий четыре арифметические операции над целыми числами, которые пользователь вводит через поля веб-формы в браузере.

#!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. Сохранение в файле последовательности псевдослучайных чисел

Перед выполнением данного сценария следует правильно настроить права доступа для веб-сервера к каталогу.

< Лекция 5 || Самостоятельная работа 5: 123 || Лекция 6 >
Михаил Олифиренко
Михаил Олифиренко
Александр Табачук
Александр Табачук

Это только у меня не работает кнопочка "Получить код DreamSpark"? Пишет "временно не доступно..." А когда заработает?