
- •Тема 1 Основы cgi-программирования
- •1.1 Методы передачи данных
- •1.2 Передача документа пользователю
- •1.3 Передача информации cgi-сценарию
- •Тема 2 Характеристика языка php
- •2.1 Принцип работы php
- •2.2 Переменные, константы, выражения
- •Тема 3 Работа с данными формы
- •3.1 Передача данных
- •3.2 Трансляция полей формы в переменные
- •Тема 4 Конструкции языка
- •4.1 Условные инструкции
- •4.2 Инструкции циклов
- •4.3 Инструкции включения
- •Тема 5 Ассоциативные массивы
- •5.1 Списки и ассоциативные массивы
- •5.2 Операции над массивами
- •5.3 Списки и строки
- •5.4 Сериализация
- •Тема 6 Работа с массивами
- •6.1 Сортировка массивов
- •6.2 Функции для работы с массивами
- •Тема 7 Функции и области видимости
- •7.1 Формат определения функции, передача параметров
- •7.2 Глобальные, локальные, статические переменные
- •7.3 Рекурсия, вложенные и условно-определяемые функции
- •7.4 Передача функций по ссылке и возврат функцией ссылки
- •Тема 8 Строковые функции
- •8.1 Функции работы со строками
- •8.2 Работа с блоками текста
- •Тема 9 Математические функции
- •9.1 Встроенные константы
- •9.2 Встроенные функции
- •Тема 10 Работа с файлами и каталогами,
- •10.1 Функции работы с файлами
- •10.2 Блокирование файла
- •10.3 Функции работы с каталогами
- •10.4 Запуск внешних программ
- •Тема 11 Работа с датами и временем,
- •11.1 Представление времени в формате timestamp
- •11.2 Работа с датами, григорианский календарь
- •11.3 Посылка писем через php
- •Тема 12 Работа с www
- •12.1 Установка заголовков ответа
- •12.2 Работа с Cookies
- •Тема 13 Управление интерпретатором
- •13.1 Управление интерпретатором
- •13.2 Управление сессиями
- •Тема 14 Работа с базой данных mysql
- •14.1 Соединение с базой данных
- •14.2 Выполнение запросов к базе данных
- •Тема 15 Загрузка файлов на сервер
- •15.1 Multipart-формы, тег выбора файла
- •15.2 Поддержка закачки в php
- •Учебное издание
- •Разработка программного обеспечения на платформе net: php.Net
- •246019 Г. Гомель, ул. Советская, 104
3.2 Трансляция полей формы в переменные
Интерпретатор все данные из полей формы преобразует в глобальные одноименные переменные. Значение поля name после начала работы программы будет храниться в переменной $name, а значение поля age – в переменной $age.
Теперь сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки – выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров – проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку.
<html>
<body>
<?if(!@$doGo)
{
?>
<form action=”<?=$SCRIPT_NAME?>”>
//<form action=hello.php>
Введите имя:
<input type=text name="name" value="Елена"><br>
Ваш возраст:
<input type=text name="age" value="5"><br>
<input type=submit name="doGo" value="Отправить">
</form>
<?
} else {
?>
Привет!<br>
<?
print "Привет, ".$_GET['name'].
". Вам ".$_GET['age']." лет.";
?>
<?
}
?>
</body>
</html>
Конструкция <?=выражение?> является более коротким обозначением для <?echo(выражение) ?>, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу.
Обратите внимание на полезный прием: в параметре action тэга <form> мы не задали явно имя файла сценария, а извлекли его из переменной SCRIPT_NAME (которая устанавливается автоматически перед запуском сценария). Это позволило нам не "привязываться" к имени файла, т.е. теперь мы можем его в любой момент переименовать без потери функциональности.
Если РНР установлен не как модуль Apache, а как отдельный обработчик, то переменная $SCRIPT_NAME будет содержать не то значение, на которое мы рассчитываем.
К тому же, теперь исчезла необходимость и в промежуточном файле form.html, его код встроен в сам сценарий.
Трансляция переменных окружения и Cookies. В переменные преобразуются не только все данные формы, но и переменные окружения (включая QUERY_STRING, CONTENT_LENGTH и многие другие), а также все Cookies.
Пример сценария, который печатает IP-адрес пользователя, который его запустил, а также тип его браузера (эти данные хранятся в переменных окружения REMOTE_USER и HTTP_USER_AGENT):
<html><body>
Ваш IP-адрес: <?=$REMOTE_USER?><br>
Ваш браузер: <?=$HTTP_USER_AGENT?>
</body></html>
По умолчанию, трансляция выполняется в порядке ENVIRONMENT-GET-POST-COOKIE, причем каждая следующая переменная как бы перекрывает предыдущее свое значение. Например, пусть у нас есть переменная окружения а=10, параметр, поступивший из GET-формы a=20 и Cookie а=30. В этом случае в переменную $а сценария будет записано 30, поскольку Cookie перекрывает GET, a GET перекрывает переменные окружения.
Трансляция списков. Механизм трансляции полей формы в РНР работает приемлемо, когда среди них нет полей с одинаковыми именами. Если же таковые встречаются, то в переменную записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при работе, например, со списком множественного выбора <select multiple>:
<select name=Sel multiple>
<option>First
<option>Second
<option>Third
</select>
B таком списке вы можете выбрать (подсветить) не одну, а сразу несколько строчек, используя клавишу <Ctrl> и щелкая по ним кнопкой мыши. Пусть мы выбрали First и Third. Тогда после отправки формы сценарию придет строка параметров Sel=First&Sel=Third, и в переменной $Sel окажется только Third. Для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде имени массива с индексами:
<select name="Sel[]" multiple>
<option>First
<option>Second
<option>Third
</select>
Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого индексация начинается с нуля), и, действительно, создаст переменную $Sel типа массив, содержимое которого следующее:
array (0=>"First", 1=>"Third").
Пример работы с автомассивами:
$A[]=10;
$А[]=20;
$А[]=30;
После отработки этих строк будет создан массив $A, заполненный последовательно числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных скобок при присваивании элементу массива не указано ничего, то подразумевается элемент массива, следующий за последним.
Прием с автомассивом применим не только к этому элементу формы: автомассивы мы можем применять и в любых других полях.
Пример, создающий 2 переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива:
<input type=checkbox name=Arr[] value=chl>
<input type=checkbox name=Arr[] value=ch2>
<input type=text name=Arr[] value="Some string">
<textarea name=Arr[] >Some text</textarea>
Автомассивы можно использовать для любых элементов формы.
Трансляция массивов. Пусть имеется форма, содержащая следующие элементы:
Имя: <input type=text name=Data[name]><br>
Адрес: <input type=text name=Data[address]><br>
Город:<br>
<input type=radio name=Data[city]
value=Moscow>Mоcква<br>
<input type=radio name=Data[city]
value=Peter>Caнкт-Петербург<br>
<input type=radio name=Data[city]
value=Kiev>Kиeв<br>
После передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов.
В сценарии к отдельным элементам формы можно будет обратиться при помощи указания ключа массива: например, $Data[’city’] обозначает значение той радиокнопки, которая была выбрана пользователем, a $Data["name"] – введенное имя. В сценарии мы обязательно должны заключать ключи в кавычки или апострофы – в противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы мы, наоборот, должны их избегать. Многомерные массивы (то есть, массивы массивов) указывать нельзя.