Добавление динамического содержимого

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

Заменим РНР-код в файле processorder.php на приведенный ниже:

<?php

echo '<р>3аказ обработан в ' ;

echo date ('H:i, jS F Y');

echo '</p>';

?>

Этот фрагмент можно записать и одной строкой, если воспользоваться операцией конкатенации:

<?php

echo "<р>3аказ обработан в ".date ('Н:i, jS F Y')."</p>";

?>

В этом коде используется встроенная PHP-функция date (), которая сообщает клиенту дату и время обработки его заказа. Значения будут меняться при каждом выполнении сценария. Вывод, полученный в результате одного из таких запусков рассматриваемого сценария, показан на рис. 1.3.

Динамическое содержимое

Вызов функций

Посмотрите, как вызывается функция date (). Это общая форма вызова функции. РНР имеет обширную библиотеку функций, которыми вы можете пользоваться при разработке Web-приложений. Большинству этих функций нужно передавать некоторые данные, чтобы они возвращали соответствующие данные в качестве результатов.

Вызов функции имеет следующий вид:

date ('Н:i, jS F Y')

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

Использование функции date ()

Аргумент, передаваемый функции date (), должен быть строкой формата, который определяет требуемый стиль вывода. Каждая буква в строке представляет часть строки даты и времени суток. Н представляет часы в 24-часовом формате, i — минуты с ведущим нулем, когда он необходим, j — день месяца без ведущего нуля S представляет обычный суффикс (в данном случае “th”), F —полное название месяца, Y - год.

 

Доступ к переменным формы

Весь смысл использования формы заказа заключается в получении информации о заказе клиента. Получение подробной информации о том, что клиент ввел с клавиатуры, реализуется в РНР очень просто, тем не менее, точный метод зависит от выбора версии РНР и от установок в вашем файле php.ini.

Короткие, средние и длинные переменные

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

Вы можете получить доступ к содержимому поля tireqty следующими способами:

 

$tireqty -------------------------------------// короткий стиль

$_POST['tireqty'] -----------------------// средний стиль

$HTTP_POST_VARS['tireqty']--- // длинный стиль

 

■ Короткий стиль ($tireqty) удобен в работе, однако он требует включения конфигурационной настройки register globals. Из соображений безопасности по умолчанию она отключена. Этот стиль способствует появлению ошибок, которые делают программный код менее безопасным, что и привело к тому, что короткий стиль использовать не рекомендуется. Не стоит применять данный стиль в новом коде, поскольку в версии РНР6 его, видимо, уже не будет.

■ Средний стиль ($_POST[ 'tireqty' ]) теперь является рекомендованным подходом. Создание коротких версий имен переменных на основе среднего стиля не приводит к проблемам безопасности и просто облегчает работу.

■ Длинный стиль ($HTTP_POST_VARS [' tireqty' ]) представляет собой наиболее подробную форму записи. Следует отметить, что данный стиль признан устаревшим и, скорее всего, в долгосрочной перспективе он вообще выйдет из употребления. Длинный стиль используется для достижения наибольшей переносимости, однако сейчас может быть отключен с помощью директивы конфигурации register long arrays, что приводит к увеличению производительности. Так что и этот стиль не стоит применять в новом коде — кроме тех случаев, когда ваше ПО будет наверняка установлено на старых серверах.

При использовании короткого стиля имена переменных в сценарии ничем не отличаются от имен полей в HTML-форме. Вам не надо объявлять эти переменные или предпринимать какие-либо действия по созданию этих переменных в сценариях. Они фактически передаются в сценарий так, как передаются аргументы в функцию. Когда вы пользуетесь этим стилем, вы просто манипулируете такими переменными как, например, $tireqty. Поле tireqty формы создает в сценарии, выполняющем обработку, переменную $ tireqty.

Подобное удобство доступа к переменным может показаться довольно-таки привлекательным, однако перед тем как просто включить registeг globals, неплохо бы разобраться с причинами, по которым команда разработчиков РНР приняла решение по умолчанию отключить register globals.

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

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

Средний стиль предусматривает считывание переменных форм из массивов $_POST, $_GET и $_REQUEST. Подробное описание всех переменных форм содержится либо в массиве $_POST, либо в массиве $_GET. Какой массив используется, зависит от того, какой метод был выбран для передачи формы — POST или GET. Кроме того, сочетание всех данных, передаваемых посредством метода POST или GET, доступно через массив $_REQUEST.

Если форма была отправлена с помощью метода POST, то данные, помещенные в поле tireqty, будут сохранены в $_POST [' tireqty' ]; если же форма была передана с помощью метода GET — то в $_GET [' tireqty' ]. И в том и в другом случае данные будут доступны в $_REQUEST [' tireqty' ].

Эти массивы относятся к категории так называемых суперглобальных.

Рассмотрим пример создания упрощенных копий переменных.

Для копирования значения одной переменной в другую служит операция присваивания, для обозначения которой в языке РНР используется знак равенства (=). Приведенная ниже строка кода создает новую переменную с именем $ tireqty и копирует в нее содержимое $_POST [' tireqty' ]:

$tireqty = $_POST [' tireqty'];

Разместите показанный ниже блок кода в начало сценария обработки формы. Так как этот сценарий не генерирует никаких выходных данных, нет никакой разницы, поместите ли вы его выше или ниже дескриптора <html> и других HTML-дескрипторов, с которых начинается ваша страница. Обычно этот блок размещают в самом начале сценария, чтобы потом его было легче найти.

<?php

--------------// создание коротких имен переменных

--------------$tireqty=$_POST[ 'tireqty' ] ;

--------------$oilqty = $_POST [' oilqty' ] ;

--------------$sparkqty= $_POST [' sparkqty' ] ;

?>

Этот код создает три переменных $tireqty, $oilqty и $sparkqty и помещает в них данные, которые были переданы с помощью метода POST формы. Чтобы этот сценарий выполнял сколько-нибудь заметные действия, вставьте следующие строки в нижнюю часть РНР-сценария:

echo '<р>Заказано: </р>';

echo $tireqty.' покрышек<br />';

echo $oilqty.' бутылок масла<br />';

echo $sparkqty.' свечей зажигания<br />';

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

Динамическое содержимое

Конкатенация строк

В сценарии оператор echo применялся для вывода значений, введенных пользователем в каждое из полей формы, за которыми следовал некоторый пояснительный текст. Присмотревшись к операторам echo мы заметим, что между именем переменной и следующим за ним текстом находится точка (.), например:

echo $tireqty.' покрышек<br />';

Эта точка есть не что иное, как операция конкатенации строк, которая используется для объединения строк (фрагментов текста) в единый текст. Эта операция позволяет избегать записи нескольких операторов echo.

Каждую переменную, отличную от переменной типа массива, можно поместить в двойные кавычки, после чего применить к ней оператор echo. (Массивы представляют собой более сложный тип переменных.) Например:

echo "$tireqty покрышек<br />";

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

echo '$tireqty покрышек<br />';

приведет к передаче в браузер строки "$tireqty покрышек<br />". Если имя переменной заключено в двойные кавычки, то имя переменной заменяется ее значением. Если имя переменной или какой-либо другой текст заключен в одинарные кавычки, то они передаются без изменений.

Переменные и литералы

Переменные и строки, конкатенацию которых мы осуществляем в каждом из операторов echo, имеют разную природу. Переменные — это символы, применяемые для обозначения данных. Строки — это, по сути, данные. Когда мы употребляем фрагменты неструктурированных данных в программе, подобной рассматриваемой, мы называем их литералом , чтобы отличить их от переменной. $tireqty — это переменная, т.е. символ, который представляет введенные клиентом данные. С другой стороны, ' покрышек<br />' — это литерал. Он представляет сам себя. Правда, не всегда. Вспомним второй пример, приведенный выше на этой странице? РНР заменяет в этой строке имя переменной $tireqty значением, которое хранится в этой переменной.

Вспомните, что в РНР существует два вида строк — с двойными кавычками и с одинарными кавычками. РНР будет предпринимать попытки вычислить значения строк, заключенных в двойные кавычки, что приведет к результатам, которые рассматривались выше. Строки, заключенные в одинарные кавычки, трактуются как обычные литералы.

Имеется и третий способ указания строк — с помощью heredoc-синтаксис (<<<), который хорошо знаком программистам на языке Perl. Этот синтаксис позволяет определять длинные строки аккуратно, указывая маркер конца строки, который и будет использоваться для завершения строки. В представленном ниже примере определяется и выводится длинная строка:

echo <<<theEnd

строка 1

строка 2

строка 3

theEnd

Лексема theEnd выбрана совершенно произвольно. При ее выборе должно лишь гарантироваться, что она нигде не встречается в тексте.
Для завершения heredoc-строки необходимо поместить в начале новой строки лексему конца строки, heredoc-строки допускают вставку переменных, подобно строкам в двойных кавычках.

Идентификаторы

Идентификаторы представляют собой имена переменных. (Имена функций и классов — это тоже идентификаторы) Использование идентификаторов регламентируется следующими простыми правилами.

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

■ Идeнтификaторы не могут начинаться с цифры.

■ В РНР идентификаторы чувствительны к регистру символов. Идентификаторы $tireqty и $TireQty отнюдь не равнозначны. Попытка использования строчных символов вместо прописных и наоборот — очередная часто встречающаяся ошибка программирования. Исключение из этого правила составляют встроенные РНР-функции — их имена могут быть представлены в любом регистре.

■ Переменные могут иметь те же имена, что и встроенные функции. Однако это может привести к путанице, а посему подобных ситуаций следует избегать. Нельзя также создавать функции, имена которых совпадают с именами других функций.

В дополнение к переменным, передаваемым из HTML-формы, вы можете объявлять и использовать свои собственные переменные.

Одна из особенностей РНР заключается в том, что переменные не обязательно объявлять до того, как вы будете ими пользоваться. Переменная создается в момент первого присваивания ей значения.

Значения переменным присваиваются с помощью операции присваивания (=). На сайте компании “Автозапчасти от Вована” требуется подсчитать общее количество единиц товара и общую сумму оплаты. Для хранения этих чисел имеет смысл создать две переменных. Для начала они инициализируются нулевыми значениями; это делают следующие строки в нижней части РНР-сценария:

$totalqty = 0;

$totalamount = 0.00;

Каждая из двух приведенных строк создает переменную и присваивает ей литеральное значение. Переменным можно присваивать также значения других переменных, как показано в примере ниже:

$totalqty = 0;

$totalamount = $totalqty;