ProfiPHPProfiPHP
Категория: PHP для чайников

Другие виды 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 этого не делает.

Добавить комментарий

Имя:
Текст комментария: