Смекни!
smekni.com

Учебник php (стр. 23 из 26)

<?session_start()?><body><A href="php.php">PHP</A><A href="php.php?ss=1">PHP - выражения</A>

Вот что получиться, при наведении мышки на эти ссылки:

http://www.spravkaweb.ru/php.php?PHPSESSID=81456f6a886f2104
http://www.spravkaweb.ru/php.php?ss=1&PHPSESSID=34f5d04a35601510f45

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

<?session_start()?><form action=act.php mathod=post></form>

А вот что получиться при просмотре нашей страницы в виде HTML:

<form action="act.php" method="post"><INPUT TYPE=HIDDEN NAME="PHPSESSID" VALUE="0a561093f84d4321"></form>

Из примера мы видим, что PHP добавил в форму скрытое поле с нужным именем и занчением.

Установка заголовков ответа

Header
Вывод заголовка.

Синтаксис :
int Header(string $string)

Обычно функция Header() является одной из первых команд сценария. Она предназначена для установки заголовков ответа, которые будут переданы браузеру - по одному заголовку на вызов. Вызов Header() обязательно должен осуществляться до любого оператора вывода в сценарии - в противном случае вы получете предупреждение. Текст вне <? и ?> также рассматривается как оператор вывода.

Пример:

// перенаправляет браузер на сайт PHP
Header("Location: http://www.php.net");
// теперь принудительно завершаем сценарий, ввиду того, что после
// перенаправления больше делать нечего
exit;

См. также: запрет кэширования страниц при помощи Header().

Получение заголовков запроса

getallheaders
Получение всех заголовков запроса.

Синтаксис :
array GetAllHeaders()

Функция GetAllHeaders() возвращает ассоцативный массив, содержащий данные о HTTP-заголовках запроса клиента, породившего запуск сценария. Ключи массива содержат названия заголовков, а значения - их величины.

$headers = GetAllHeaders();
foreach($headers as $header=>$value)
echo "$header: $value<br>&bsol;n";

Функция GetAllHeaders() поддерживается PHP только в том случае, если он установлен в виде модуля Apache. В противном случае этой функции просто не будет (да и не может быть, потому что обычный CGI-сценарий не имеет доступа к загаловкам запроса). В частности, в PHP для Windows (который чаще всего реализуют именно в виде сценария) функция GetAllHeaders() недоступна.

Работа с Cookies

Немного теории

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

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

У каждого Cookies есть определенное время жизни, по истечении которого он автоматически уничтожается. Существуют также Cookies, которые "живут" только в течение текущего сеанса работы с браузером.

Каждый Cookie устанавливается сценарием на сервере. Для этого он должен послать браузеру специальный заголовок вида:

Set-cookie: данные

Сценарии с других серверов, а также расположенные в другом каталоге, не будут извещены о "чужих" Cookies. Для них их словно и нет. И это правильно с точки зрения безопасности - кто знает, насколько секретна может быть информация, сохраненная в Cookies?

Получение Cookie

Предположим, сценарий отработал и установил какой-то Cookie, например, с именем Cook и значением Val. В следующий раз при запуске этого сценария (на самом деле, и всех других сценариев, расположенных на том же сервере в том же каталоге или ниже по дереву) ему передастся пара типа Cook=Val (через специальную переменную окружения). PHP это событие перехватит и автоматически создаст переменную $Cook со значением Val. То есть интерпретатор действует точно так же, как если бы значение нашего Cookie пришло откуда-то из формы. Та переменная, которую мы установили в прошлый раз, будет доступна и сейчас.

setcookie
Установка Cookie.

Синтаксис :
int setcookie(string $name [,string $value] [,int $expire] [,string $path] [,string $domain] [,book $secure])

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

Вызов setcookie() определяет новый Cookie, который тут же посылается браузеру вместе с остальными заголовками. Все аргументы, кроме имени, необязательны. Если задан только параметр $name (имя Cookie), то Cookie с указанным именем у пользователя удаляется. Вы можете пропускать аргументы, которые не хотите задавать, пустыми строками "". Аргументы $expire и $secure не могут быть представлены строками, а потому вместо пустых строк здесь нужно использовать 0.
Параметр $expire задает timestamp, который, например, может быть сформирован функциями time() или mktime().
Параметр $secure говорит о том, что величина Cookie может передаваться только через безопасное HTTPS-соединение.

Примеры:

// Cookie на одну сессию, т.е. до закрытия браузера
SetCookie("TextCookie","value");

// Эти Cookies уничтожаются браузером через 1 час после установки
SetCookie("TextCookie",$val,time()+3600);
SetCookie("TextCookie",$val,time()+3600,"/~rasmus/",".utoronto.ca",1);

После вызова SetCookie() только что созданный Cookie сразу появляется среди глобальных переменных как переменная с заданным в параметре $name именем. Она появиться и при следующем запуске сценария - даже если SetCookie() в нем и не будет вызвана.

SSI и функция virtual()

Немного теории

Для одного и того же документа в Apache нельзя применять два "обработчика". Иными словами, действует принцып: либо PHP, либо SSI. Однако в PHP имеются определенные средства для "эмуляцииquot; SSI-конструкции include virtual.

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

virtual
Имитация include virtual.

Синтаксис :
int virtual(string $url)

Функция virtual() представляет собой процедуру, которая может поддерживаться только в случае, если PHP установлен как модуль Apache. Она делает то же самое, что и SSI-инструкция <-- #include virtual=... -->. Иными словами, она генерирует новый запрос серверу, обрабатываемый им обычным образом, а затем выводит данные в стандартный поток вывода.

Чаше всего функция virtual() используется для запуска внешних CGI-сценариев, написанных на другом языке программирования, или же для обработки SSI-файлов более сложной структуры. В случае, если запускается сценарий, он должен генерировать правильные HTTP-заголовки, иначе будет выведено сообщение об ошибке. Для включения обычных PHP-файлов с участками кода функция virtual() неприменима - это выполняет оператор include.

Управление выводом. Введение.

Данная группа функций позволяет управлять тем, как PHP при выполнении сценария выводит информацию. Это может быть полезно в различных ситуациях, в особенности при посылке браузеру HTML-заголовков (headers) после того, как сценарий начал выводить HTML-текст. (В обычном случае невозможно послать заголовок после того, как был начат вывод текста.)
Эти функции не воздействуют на заголовки, посланные функциями header() или setcookie(), а только на функции, подобные echo() и HTML-тексту между блоками PHP-кода.

<?php ob_start();echo "Hello&bsol;n" setcookie("cookiename", "cookiedata"); ob_end_flush(); ?>

В примере выше вывод командой echo() будет сохранен в буфере вывода до вызова функции ob_end_flush(). В то же время вызов setcookie() успешно сохраняет cookie, не вызывая ошибки.

Функции управления выводом

ob_start
Включение буферизации вывода.

Синтаксис :
void ob_start([string output_callback])

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

Содержимое буфера может быть скопировано в строковую переменную функцией ob_get_contents(). Для вывода содержимого из буфера используется функция ob_end_flush(). Удалить содержимое буфера позволяет функция ob_end_clean().

В аргументе output_callback можно указать функцию, которая будет автоматически вызываться при выводе содержимого буфера. Обычно это используется для модификации содержимого буфера перед выводом (например, сжатия). Тогда при вызове функции ob_end_flush() в указанную функцию будет передаваться содержимое буфера, а то, что она возвратит, будет выведено (заметьте, сама функция не должна ничего выводить).

Буферизация может быть вложенной, и тогда она обрабатывается соответственно вложенности; и содержимое, выводимое из буфера нижнего уровня, будет включаться в буфер верхнего уровня. Не забывайте, что для вывода всего буферизованного содержимого необходимо вызывать функцию ob_end_flush() столько же раз, сколько была вызвана ob_start().

<?phpfunction c($str) { // получает содержимое буфера return nl2br($str); // возвращает содержимое буфера}function d($str) { // получает содержимое буфера return strtoupper($str); // возвращает содержимое буфера}?><?phpob_start("c");?> Тут различный текст... <?php// преобразовывать текст длее в верхний регистрob_start("d");?> еще что-то... <?phpob_end_flush();?> ....... <?phpob_end_flush();?>

ob_get_contents
Получение содержимого буфера вывода.

Синтаксис :
string ob_get_contents()

Если буферизация неактивна, возвращается false.