http://profiphp.ru/php_for_dummies/web_applications.html


Другие виды Web-приложений

Наиболее часто употребляемым и простым методом получения Web-приложением информации от пользователей является использование форм. Далее информация проходит процедуру проверки, хранения и вывода. Но для больших проектов необходимо использовать более мощные инструменты.


Независимость Web-страниц


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


Перемещение между страницами


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


Вывод ссылок


Вывод ссылок осуществляется так:


echo '<a href="page.php">Новая страница</a>';


Использование форм

В дескрипторе <form> можно задать сценарий, который будет обрабатывать информацию, введенную пользователем. После щелчка на кнопке Submit этому сценарию будут переданы данные формы и отобразится новая Web-страница. Но можно воспользоваться пустой формой с кнопкой, после щелчка на которой пользователь переместится на новую страницу. При щелчке на кнопку оправки будет выполнен переход на страницу, адрес которой указан в атрибуте action дескриптора <form>.


Перемещение пользователей


Функция Header позволяет осуществить переход на другую страницу без щелчка на ссылке или кнопке:


header( "Location: URL" );


Результатом выполнения функции будет передача браузеру файла, расположенного по указанному URL-адресу. Необходимо также придерживаться правила использования данной функции: она должна вызываться перед генерацией какого-либо содержимого страницы. Эти же ограничения касаются и функции Setcookie.


Функция Header предоставляет универсальный способ перехода на определенную страницу без вмешательства пользователей и используется в большинстве случаев для вывода различных страниц для разных пользователей. Рассмотрим такой пример:


if ( $autorization == 1 ) {

header( 'Location: admin.php' );

}

else {

header( 'Location: login.php' );

}


В приведенном фрагменте, если переменная $autorization содержит значения 1, значит пользователь авторизован и выводится специальная страница администрирования (admin.php), иначе - страница авторизации (login.php).


Перемещение данных между страницами


Для реализации вывода необходимой информации на разных страницах на языке РНР можно воспользоваться несколькими способами:


- URL-адрес. Требуемая информация добавляется к URL-адресу новой страницы.


- Cookie. Информация сохраняется в клиентской части приложения, на

локальном компьютере пользователя.


- HTML-формы. Данные из полей формы будут переданы серверному сценарию.


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


Добавление информации к URL-адресу


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


переменная:значение


Например:


<a href="page.php?age=5">Новая страница</a>


В данном примере при переходе на новую страницу 'page.php' передается переменная 'age' со значением 5. Строка 'age=5' добавляется в конец URL-адреса сразу после знака ?.


При передаче в адресе URL нескольких пар "переменная-значение" они отделяются друг от друга амперсантом (&). Например:


<a href="page.php?age=5&start=1">Новая страница</a>


Доступ ко всем переменным, передаваемым в строке URL, можно получить через встроенный массив $_GET:


echo $_GET['page'], $_GET['start'];


Аналогичным образом данные можно извлечь и из ассоциативного массива $_REQUEST:


echo $_REQUEST['page'], $_REQUEST['start'];


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


Передача информации с помощью данных Cookie


Еще одним вариантом сохранения информации и передачи ее от страницы к странице, является в использовании Cookie. Эти данные представляют собой набор пар "переменная-значение", точно как и в данных, добавляемых к URL-адресу. Данные Cookie сохраняются браузером на пользовательском компьютере и позже могут использоваться сценариями. Сохранив данные Cookie один раз, их можно использовать при последующих посещениях данной Web-страницы. Если для данных Cookie не указать время их жизни, то они будут удалены сразу же после завершения работы с Web-приложением.


Манипулирование данными Cookie


Для сохранения данных в Cookie необходимо воспользоваться функцией Setcookie, которая имеет следующий общий синтаксис:


setcookie( "переменная", "значение" );


Рассмотрим следующий пример, в котором с помощью данных Cookie на клиентском узле сохраняется выражение 'age=15':


setcookie( 'age', '15' );


К данным Cookie можно обратиться с помощью встроенного массива $_COOKIE:


echo $_COOKIE['age'];


Также следует отметить, что данные Cookie недоступны на той странице, на которой они были установлены. Для получения к ним доступа нужно заново отобразить текущую страницу или перейти на новую.


В случае необходимости можно задать время жизни данных Cookie:


setcookie( "переменная", "значение", "время-жизни" );


Параметр время-жизни определяет время, по истечении которого данные Cookie будут удалены. Обычно это значение вычисляется с помощью функции Time или Mktime. Для задания времени жизни данных Cookie к результату функции Time следует прибавить соответствующее значение в секундах. Например:


setcookie( 'age', '15', time( ) + 3600 );


В данном примере удаления данных произойдет через 1 час.


Для удаления данных Cookie соответствующей переменной необходимо присвоить пустое значение.


Передача информации с помощью HTML-форм


Поcле щелчка на кнопке Submit, введенная в поля формы информация передается сценарию, адрес которого задан в дескрипторе <form>. Для описания формы используется следующий общий синтаксис:


<form action="form.php" method="POST">

<input type="text" name="age" value="Возраст" />

<input type="submit" value="Отправить" />

</form>


Однако формы могут передавать скрытые от пользователей данные (hidden fields). Их можно использовать как вместе с обычными полями, так и отдельно от них.


<form action="form.php" method="POST">

<input type='hidden' name='user' value='<?php echo $user ?>'>

<input type="submit" value="Отправить" />

</form>


Ha Web-странице отображается только кнопка 'Отправить', причем пользователю не нужно вводить никакой информации. После щелчка на этой кнопке вызывается сценарий 'form.php', а значение скрытого поля сохраняется в элементе массива $_POST['user']. Такой подход позволяет передавать требуемую информацию между страницами Web-узла.


Использование сеансов РНР


Сеанс (session) являет собой некую информацию, которая создается и существует на время взаимодействия пользователя с Web-приложением. Посетители Web-узла в течении одного сеанса могут просматривают большое количество страниц, и очень часто требуется иметь доступ к одной и той же информации на каждой из них.


После создания сеанса значения установленных переменных становятся доступными на любой странице Web-приложения.


Опишем операции, которые выполняются при открытии сеанса интерпретатором РНР:


- Присваивание сеансу уникального идентификатора (session ID). В окружении РНР это значение хранится в переменной $PHPSESSID.


- Сохранения переменных сеанса в файле, который размещается на сервере с идентичным именем идентификатором сеанса.


- Передача интерпретатором РНР идентификатора сеанса каждой странице.


Если у пользователя разрешено использование Cookie, то передача требуемых данных между сервером и клиентским браузером осуществляется с использованием этого механизма. В противном случае работа модуля РНР определяется значением директивы Session.use_trans_sid конфигурационного файла php.ini.


Файл с данными сеанса доступен для всех сценариев в рамках этого сеанса. Все переменные сеанса хранятся также в массиве $_SESSION.


Открытие и закрытие сеансов


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


Функцию Session_start нужно вызывать до вывода какой-либо информации на Web-странице.


Интерпретатор РНР может автоматически добавлять функцию Session_start в начале каждой серверной страницы. Для этого необходимо внести соответствующие изменения в конфигурационный файл php.ini, а именно: задать для директивы Session_start значение 1.


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


Использование сеансовых переменных


Для использования значения переменный сессии необходимо сохранить ее в массиве $_SESSION следующим образом:


$_SESSION['age'] = 15;


При открытии сеанса на другой странице к предварительно сохраненным значениям можно обратиться через массив $_SESSION.


Для удаления переменной в любой момент можно воспользоваться функцией Unset:


unset( $_SESSION['age'] );


Поддержка сеансов при отключенном режиме использования данных Cookie


При использовании механизма поддержки сеансов модуль РНР проверяет, допускает ли клиентский браузер использование данных Cookie. Если соответствующий режим включен, выполняются следующие действия.


- Переменной PHPSESSID присваивается значение идентификатора сеанса. Данные Cookie используются для передачи PHPSESSID между сценариями или страницами.


Если клиентский браузер запрещает использовать данные Cookie, то модуль РНР работает по-другому:


- Создается константа с именем SID, в которой содержится пара 'переменная-

значение' вида 'PHPSESSID=идентификатор-сеанс'а.


- После этого использование идентификатора сеанса определяется значением директивы Session.use_trans_sid в конфигурационном файле php.ini. Если эта директива включена, то идентификатор сеанса передается между страницами или сценариями, в противном случае — нет.


По умолчанию директива Session.use_trans_sid отключена. Для ее включения следует внести соответствующие изменения файла php.ini:


Session.use_trans_sid = 1


После внесения изменений нужно перезапустить Web-сервер.


Включение директивы Session.use_trans_sid имеет как преимущества, так и недостатки.


- Преимущества. Механизм поддержки сеансов функционирует корректно даже в том случае, если пользователь отключил режим использования данных Cookie.


- Недостатки. Идентификатор сеанса передается в URL-адресе и, как следствие, отображается в адресной строке браузера. С точки зрения обеспечения безопасности этого следует избегать.


Для каждого пользователя идентификатор сессии является уникальным и постоянным на весь сеанс работы. Если идентификатор передается неправильно, либо не передается совсем, это приведет к тому, что при каждом последующем обращении к сайту, PHP по умолчанию будет подставлять к ссылкам новый PHPSESSID. Поэтому рекомендуется отключать директиву Session.use_trans_sid, чтобы не переполнить директорию хранения сессий и избежать многократной индексации поисковиками одной и той же страницы.


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


К счастью, в окружении РНР имеется соответствующая константа SID, значение которой можно пересылать на следующую страницу вручную. В этой константе содержится пара 'имя-переменной=значение', которую к адресу URL можно добавить следующим образом:


echo '<a href="/script.php?'.htmlspecialchars( SID ).'">Нажмите</a>';


В приведенной ссылке после имени файла стоит вопросительный знак и константа SID с идентификатором сеанса. Таким образом, адрес URL будет выглядеть примерно так:


script.php?PHPSESSID=743eplgpgd5k35jclubnjg8on5


Еще одним способом передачи идентификатора сеансов является использование скрытых полей формы и метода POST.


Использование форм для загрузки файлов


Для обеспечения загрузки файлов на Web-узел можно разработать специальную HTML-форму, которая будет иметь приблизительно следующий вид:


<form enctype="multipart/form-data" action="uploadfile.php" method="POST">

<input type="file" name="user_file" />

<input type="submit" value="Загрузить" />

</form>


Также можно добавить скрытое поле ограничения размера загружаемого файла:


<input type="hidden" name="MAX_FILE_SIZE" value="500000" />


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


Для загрузки файлов, атрибут 'Enctype' дескриптора <form> должен иметь значение 'multipart/form-data'. Поле File используется для удаленной загрузки файла.


В конфигурационный файл php.ini нужно внести следующие изменения:


- upload_max_filesize. Если необходимо загрузить файлы большего размера, следует изменить значение Upload_max_filesize. По умолчанию оно составляет 2 Мбайт.


- post_max_size. Директива Post_max_size определяет максимальный объем информации, который можно передать с использованием метода POST. По умолчанию значение post_max_size равно 8 Мбайт.


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


Получение информации о загружаемом файле


Кроме самого файла, вместе со значениями полей формы передается и информация о самом файле. Эта информация сохраняется во встроенном массиве $_FILES, который можно использовать для получения данных о каждом загружаемом файле. При этом доступ к информации осуществляется посредством имен полей. Общий формат извлечения информации о файле имеет вид:


$_FILES['имя-поля']['name']

$_FILES['имя-поля']['type']

$_FILES['имя-поля']['tmp_name']

$_FILES['имя-поля']['error']

$_FILES['имя-поля']['size']


Пусть, например, файл загружается с помощью следующего поля формы:


<input type="file" name="user_file" />


Тогда при загрузке изображения 'images.jpg', в суперглобальном массиве $_FILES будет содержаться следующая информация:


[user_file] => Array

(

[name] => images.jpg

[type] => image/jpeg

[tmp_name] => C:\Windows\Temp\phpCA2C.tmp

[error] => 0

[size] => 192751

)


В массиве $_FILES значение Name определяет имя загружаемого файла; Type — его тип; Tmp_name - путь или имя временного файла; Error – номер ошибки; Size — размер файла. Обратите внимание, что в поле Name содержится только имя файла, а в поле Tmp_name - полный путь и имя.


Перемещение файлов в требуемый каталог


Для перемещения загруженных файлов из временного каталога предназначена функция Move_uploaded_file со следующим общим синтаксисом:


move_uploaded_file( путь/имя_временного_файла, путь/имя_постоянного_файла );


В элементе Tmp_name массива $_FILES хранится временное имя файла и его местоположение. Так что для перемещения файла, например в каталог 'с:\uploads', можно воспользоваться функцией Move_uploaded_file следующим образом:


move_uploaded_file( $_FILES['user_file'][ 'tmp_name'], 'с:\uploads\new_images.jpg' );


Следует заметить, что каталог, в который перемещается файл, должен быть предварительно создан, поскольку функция Move_upload_file этого не делает.