Реализация двух функциональностей в одном php-файле

Следующее задание относится к часто возникающей проблеме.

Например, пользователь обращается к странице, требующей авторизации. Если пользователь еще не авторизовался, то ему предлагается форма с логином и паролем. А, если пользователь уже авторизован, то выводится содержание страницы.

Прямолинейное решение состоит в создании двух файлов: один — это описание формы, второй — полезное содержание страницы. Так как обращение всегда выполняется к первому файлу, то для предоставления содержания авторизованному пользователю придется выполнить переадресацию.

Более гибкое решение: чтобы не создавать лишние файлы и обойтись без переадресации, и в том, и в другом случае запрос делается по одному и тому же URL (к одному php-файлу). А в зависимости от полученных данных, отрабатывается одна или другая часть скрипта.

В простейшем варианте задача можно сформулировать так.

Необходимо подготовить php-файл, решающий две задачи:

— когда данных в полученном запросе нет (при первом обращении к странице!) с его помощью выводится html-форма, которую должен заполнить и отослать пользователь;

— при втором обращении, выполняемом при отсылке формы (в запросе содержатся данные из неё!), скрипт выводит результаты обработки формы.

Чтобы реализовать второй шаг, атрибут action формы должен указывать на свой же файл.

ЗАДАНИЕ 3(php-файл "двойного назначения")

1. При первом запуске пользователю предлагается форма с обязательным для заполнения текстовым полем "Имя пользователя". Предположим, что поле имеет атрибут name со значением 'firstname'.

Кроме того, форма содержит кнопку "Отправить".

Для отсылки формы применяется метод POST.

2. При получении формы выполняется проверка, заполнено ли текстовое поле (пустая или нет переменная $_POST['firstname']) .

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

Если поле не заполнено, то повторно выводится форма.

Очевидно, что при самом первом запуске массив $_POST не имеет элементов. Поэтому этот случай нужно объединить с ситуацией незаполненного пользователем поля.

Порядок выполнения задания

1. Для выполнения ветвления (первый вызов файла для заполнения формы, или второй, когда передана информация из формы) использовать проверку переменной $_POST['firstname']. Следует учесть, что при незаполненном текстовом поле из формы будет передаваться пустая строка, причем даже, если не задан атрибут value="".

2. Если при выводе имени пользователя на второй странице будет использоваться here-doc или echo со строкой в двойных кавычках, то обращение к элементу суперглобального массива $_POST должно быть взято в фигурные скобки.

3. В описанном способе реализации программы атрибут action формы должен содержать имя своего файла.

Если в дальнейшем будет переименован, то придется редактировать значение атрибута action, в котором это имя использовано явно. Чтобы избежать этого, ссылку на свой файл можно генерировать с помощью скрипта. Для этого вместо жестко прописанного имени файла нужно воспользоваться значением элемента суперглобального массива $_SERVER, в котором хранится имя загруженного файла, —$_SERVER['PHP_SELF'].

Вопросы для самоконтроля

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

2. Какими способами можно вставлять в формируемый текст html-страницы значения php-переменных?

3. В чем разница в синтаксисе и семантике приемов here-doc и now-doc?

4. По каким правилам при вычислении выражений выполняется неявное преобразование строк в числа?

5 В чем разница между операторами echo и print?

6. Как в файлах сценариев предпочтительнее располагать обычный html-текст и почему?

7. Как из серверного скрипта получить доступ к данным, полученным в запросе?

8. В чем назначение функций isset и empty?

9. Как определить тип значения, хранимого переменной в данный момент времени? В каком виде можно получить информацию об этом?

10. Какую задачу позволяет решить php-файл, реализующий две разные функциональности? В чем суть его реализации?

Справочная информация

Структура РНР-файла

Файлы РНР-кода имеют обычно расширение .php . В общем случае состоят из:

а) фрагментов обычной html-разметки (включая кода для клиентской стороны на javascript) и

б) фрагментов кода на РНР, которые выделяются специальной разметкой.

В простейшем случаях — это обычный html-файл. В другом частном случае файл может содержать только php-код, причем при необходимости интерпретатор берет на себя формирование структуры html-страницы (добавляет теги <html>, <body> и т.п.).

Код РНР может разделяться на несколько блоков, между которыми может находиться код HTML.

<?

if($what){

?>

html-текст

<?

} else {

?>

другой html-текст

<?

}

?>

Переменные

Идентификаторы php-переменных всегда начинаются со знака доллара, а имя переменной должно начинаться с буквы или подчеркивания и далее может содержать в любом порядке буквы, цифры и знак подчеркивания. Регистры букв в именах переменных и функций учитываются (как в Си).

Так как РНР — это язык без типизации, переменные не нуждаются в предварительном описании. Они создаются автоматически при присваивании значений.

<html><body>

<?php

$var = "Привет!";

print $var;

?>

</body></html>

В зависимости от места создания, переменные, включая глобальные, имеют ограничения на область видимости (правила определения области видимости несколько отличаются от Си).

Переменные и строки

Язык РНР в основном сохраняет синтаксис Си. Однако, если Си — язык универсальный, то РНР — специализированный. Так как основной задачей РНР является формирование кода html-страниц, то значительная часть php-программ связана с обработкой символьных строк. В РНР имеются особенности использования переменных и строк, которые упрощают программирование этих операций.

Для записи символьных строк используются два типа ограничителей — одинарные или двойные кавычки. Но, если в JavaScript это равноценные конструкции, то в РНР для них два применяются два разных способа обработки.

а) Строки, заключенные в одинарные кавычки (апострофы) никак не интерпретируются и обрабатываются обычным образом, как фиксированная последовательность символов.

б) Строки, заключенные в двойные кавычки, интерпретируются. Смысл интерпретации состоит в том, что такие строки просматриваются интерпретатором, отыскивающим внутри строк переменные. Если переменная найдена, то она внутри строки заменяется значением переменной.

Пример.

Предположим, что нужно сформировать строку, состоящую из имени переменной, знака равно и числовое значение переменной. Если использовать традиционную технику, то необходимо конкатенировать строку и число. В Javascript это выглядит так: str = 'x=' + x; , где + означает операцию конкатенации.

В РНР операция конкатенации строк обозначается точкой и имеется два варианта записи аналогичного выражения:

$str = 'x=' . $x;

$str = "x=$x";

Еще одной особенностью РНР является возможность использовать "многострочные" строки:

$str='начало

продолжение';

Методы here-doc и now-doc

Если строго придерживаться синтаксиса HTML (XHTML), то внутри HTML-кода приходится использовать много кавычек. Например,

<a href="javascript:alert('Hello')"

style="color:red;" target='_self'> Hello</a>

Если такая строка генерируется РНР-кодом, то один из типов кавычек придется заменять escape-последовательностями. Когда речь идет о большом фрагменте HTML-кода, то такие замены требуют большой внимательности.

Чтобы облегчить работу в подобных случаях, в РНР есть способ формирования больших фрагментов страниц из обычного HTML-кода, известный как "Here Document" или here-doc. Этот прием удобен тем, что отпадают заботы о бэкслэшах и кавычках.

а) Раздел Here Document начинается с трех символов <<< и идентификатора блока (метки "here document"). Этот идентификатор не должен встречаться внутри текста блока. После идентификатора не должно быть даже пробела, т.е. сразу перевод строки!

б) Тот же идентификатор отмечает конец текста, причем он должен быть записан в отдельной строке и начинаться с первой ее позиции.

Рассмотрим пример:

$str = <<<HERE_NAME // нет точки с запятой

Большой фрагмент html-текста, который с помощью метода here-document

запоминается в строковой переменной

HERE_NAME; // с первой позиции, есть точка с запятой

В примере для выделения блока here-doc выбран идентификатор HERE_NAME. Сформированная с помощью here-doc строка может использоваться как любая другая, например, для вывода в документ.

Смысл использования конструкции here-doc аналогичен литералам, заключенным в двойные кавычки.

Начиная с версии 5.3 в языке есть также конструкция nowdoc — аналог для литералов, заключенных в одиночные кавычки. Т.е. это создание многострочных фрагментов текста, содержание которых интерпретатором не анализируется. Единственное синтаксическое отличие от here-doc — идентификатор начала блока должен быть взят в одиночные кавычки:

$str = <<<'NOW_NAME' // одиночные кавычки, нет точки с запятой

. . .

NOW_NAME; // с первой позиции, есть точка с запятой

Функции echo и print

Чтобы результаты работы скрипта были помещены на веб-страницу, необходимо запрограммировать вывод генерируемого программой HTML-кода в создаваемый документ (т.е. нужен некоторый аналог функции document.write в скриптах на JavaScript). Для вывода информации из скриптов имеется несколько способов.

а) Оператор print.

Базовый синтаксис этого оператора следующий:

<?php

print('Это будет помещено в исходный текст html-страницы');

print "И это тоже!";

?>

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

б) Оператор echo.

Этот оператор используется точно так же, как и print.

Различие между echo и print: функция echo может быть применена для вывода сразу несколько выражений, а print этого не может:

<? echo "Первое", "Второе"; // выводится без пробела между словами

print "Первое", "Второе"; // не работает!!!

?>

Оба оператора могут выводить "многострочные" строки.

<? echo "Первое

Второе"; //выводится на страницу с пробелом между словами

print "Первое

Второе"; //аналогично предыдущему

?>

Использование списка выводимых элементов echo удобно, когда конкатенация затрудняет вывод информации в нужном виде.

Замечание.

Не стоит выводить с помощью echo или print обычную (статичную) html-разметку. Её "оборачивание" в php-код не только создаст дополнительную работу php-интерпретатору, но усложнит чтение кода. Например, может потребоваться экранировать кавычки в html-тексте.

Следовательно, статические фрагменты нужно включать в сценарий страницы как обычный HTML-код, который без изменений будет скопирован из файла скрипта в выходной поток.

Наши рекомендации