Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Обработка загруженных файлов на сервере

Обработать загруженный файл на сервере тоже крайне просто. Файл сохра­няется как рhрх(где х является наращиваемым целым числом) во временном каталоге (этот каталог можно задать с помощью переменной окружения TEMPDIR). В конце запроса файл автоматически уничтожается, поэтому при необходимости дальнейшего использования его нужно скопировать из той же страницы. Доступ к имени файла осуществляется тем же способом, что и ко всем данным формы: с помощью имени, указанного в элементе ввода как переменная РНР (в данном случае - $userfile).

Файл можно скопировать в место постоянного хранения с помощью функции сору(), рассмотренной нами ранее в этой главе. Хотя временный загруженный файл автоматически уничтожается в конце запроса, лучше после копирования уничтожить его явным образом с помощью функции un­link ().

Поэтому, например, чтобы скопировать наш загруженный файл в C:\upload. txt (в Windows), а затем удалить его, можно использовать такой код:

<HTML>

<!-- upload.php —> <?

// Копировать файл в C:\upload.txt. Не забудьте преобразовать обратную косую черту!

if (copy($userfile, "С:\\upload.txc")) { echo("<B>File successfully copied!</B>"); }

else { echo("<B>Error: failed to copy file...</B>"); }

// Уничтожить файл после копирования

unlink($userfile);

?></HTML>

 

 

Тема № 12. Регулярные выражения.

В курсе Java Script вы уже проходили регулярные выражения. Мы напомним вам, что это такое и приведем функции PHP для работы с ними. Все, что вы проходили раньше, работает и в PHP.

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

Регулярные выражения пришли к нам из Unix и Perl. В PHP существует два различных механизма для обработки регулярных выражений: POSIX-совместимые и Perl-совместимые. Их синтаксис во многом похож, однако Perl-совместимые регулярные выражения более мощные и, к тому же, работают намного быстрее (в некоторых случаях до 10 раз быстрее). Поэтому здесь мы будем вести речь только о Perl-совместимых регулярных выражениях. Кстати, необходимо заметить, что полное описание синтаксиса регулярных выражений, имеющееся в PHP Manual, занимает более 50 килобайт и, естественно, здесь мы не будем рассматривать весь синтаксис. Нам необходимы только основы, которые помогут вам понять, как именно пишутся регулярные выражения.

Сутью механизма регулярных выражений является то, что они позволяют задать шаблон для нечеткого поиска по тексту. Например, если перед вами стоит задача найти в тексте определенное слово, то с этой задачай хорошо справляются и обычные функции работы со строками. Однако если вам нужно найти "то, не знаю что", о чем вы можете сказать только то, как приблизительно это должно выглядеть - то здесь без регулярных выражений просто не обойтись. Например, вам необходимо найти в тексте информацию, про которую вам известно только то, что это "3 или 4 цифры после которых через пробел идет 5 заглавных латинских букв", то вы сможете сделать это очень просто, возпользовавшись следующим регулярным выражением:

/\d{3,4}\s[A-Z]{5}/

Регулярные выражения, как уже было сказано выше, представляют собой строку. Строка всегда начинается с символа разделителя, за которым следует непосредственно регулярное выражение, затем еще один символ разделителя и потом необязятельный список модификаторов. В качестве символа разделителя обычно используется слэш ('/'). Таким образом в следующем регулярном выражении: /\d{3}-\d{2}/m, символ '/' является разделителем, строка '\d{3}-\d{2}' - непосредственно регулярным выражением, а символ 'm', расположенный после второго разделителя - это модификатор.

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

Одним из самых важных метасимволов является символ обратного слэша ('\'). Если в строке встречается этот символ, то парсер рассматривает символ, непосредственно следующий за ним двояко:

· если следующий символ в обычном режиме имеет какое-либо специальное значение, то он теряет это свое специальное значение и рассматривается как обычный символ. Это совершенно необходимо для того, чтобы иметь возможность вставлять в строку специальные символы, как обычные. Например метасимвол '.', в обычном режиме означает " любой единичный символ ", а '\.' означает просто точку. Также можно лишить специального значения и сам этот символ: '\\'.

· если следующий символ в обычном режиме не имеет никакого специального значения, то он может получить такое значение, будучи соединенным с символом '\'. К примеру символ 'd' в обычном режиме воспринимается просто как буква, однако, будучи соединенной с обратным слэшем ('\d') становится метасимволом, означающим " любая цифра ".

 

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

 

Метасимвол Значение
Метасимволы для задания символов, не имеющих изображения  
\n Символ перевода строки (код 0x0A)
\r Символ возврата каретки (код 0x0D)
\t Символ табуляции (код 0x09)
\xhh Вставка символа с шестнадцатиричным кодом 0xhh, например \x41 вставит латинскую букву 'A'
Метасимволы для задания групп символов
\d Цифра (0-9)
\D Не цифра (любой символ кроме символов 0-9)
\s Пустой символ (обычно пробел и символ табуляции)
\S Непустой символ (все, кроме символов, определяемых метасимволом \s)
\w "Словесный" символ (символ, который используется в словах. Обычно все буквы, все цифры и знак подчеркивания ('_'))
\W Все, кроме символов, определяемых метасимволом \w

С остальными имеющимися метасимволами, построенными по этому принципу вы при желании сможете ознакомиться в PHP manual.

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

Regexp Комментарии
/\d\d\d/ Любое трехзначное число ('123', '719', '001')
/\w\s\d\d/ Буква, пробел (или табуляция) и двузначное число ('A 01', 'z 45', 'S 18')
/\d and \d/ Любая из следующих строк: '1 and 2', '9 and 5', '3 and 4'.

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

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

· Обратный слэш ('\'). Т.е. все метасимволы из приведенной ранее таблицы будут работать.

· Минус ('-'). Используется для задания набора символов из одного промежутка (например все цифры могут быть заданы как '0-9')

· Символ '^'. Если этот символ стоит первым в секции задания подмножества символов (и только в этом случае!) он будет рассматриваться как символ отрицания. Т.о. можно задать все сиволы, которые не описаны в данной секции.

 

Несколько примеров, чтобы было понятно, как это работает:

Regexp Комментарии
[0-9A-Fa-f] Цифра в шестнадцатиричной системе счисления
[\dA-Fa-f] То же самое, но с использованием метасимвола
[02468] Четная цифра
[^\d] Все, кроме цифр (аналог метасимвола \D)
[a^b] Любой из символов 'a', 'b', '^'. Заметьте, что здесь символ '^' не имеет какого-либо специального значения, потому что стоит не на первой позиции внутри квадратных скобок.

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

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

Допустим, у нас есть текст:

12 aaa bbbaaa 27 cccaaa aaa 45

И регулярное выражение для поиска чисел в этом тексте: /\d\d/m (не обращайте пока внимания на модификатор). Поиск по этому регулярному выражению вернет нам 3 значения: '12', '27', '45'. Теперь ограничим поиск, указав, где именно внутри строки должен располагаться текст: /^\d\d/m. Здесь результат будет только один - '12', потому что только это число располагается в начале строки. Аналогично, регулярное выражение /\d\d$/m вернет результат '45'.

Символ точки '.'. Этот метасимвол указывает, что на данном месте в строке может находиться любой символ (за исключением символа перевода строки). Очень удобно использовать его, если вам нужно "пропустить" какую-нибудь букву в слове при проверке. Например регулярное выражение /.bc/ найдет в тексте и 'abc' и 'Abc' и 'Zbc' и '5bc'.

Символ вертикальной черты '|'. Используется для задания списка альтернатив. Например регулярное выражение:

/(красное |зеленое) яблоко/

Найдет в тексте все словосочетания 'красное яблоко' и 'зеленое яблоко'. О значении круглых скобок в этом выражении см. далее.

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

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

/\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/

Некоторые из примененных здесь метасимволов вам еще неизвестны и будут рассмотрены чуть позднее. Давайте рассотрим этот regexp подробнее.

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

/ \( (\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/

Далее идет регулярное выражение в скобках (проверка кода города):

/\((\d{3,5}) \)\s+(\d{3}-\d{2}-\d{2})/

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

/\((\d{3,5}) \) \s+(\d{3}-\d{2}-\d{2})/

Затем идет пропуск пустого места:

/\((\d{3,5})\) \s+ (\d{3}-\d{2}-\d{2})/

И еще одно регулярное выражение в скобках, которое проверяет номер телефона:

/\((\d{3,5})\)\s+ (\d{3}-\d{2}-\d{2}) /

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

Посмотрим, как работает это регулярное выражение. Пусть у нас есть строка: "My phone is (095) 123-45-67". Результатами поиска будут 3 строки: '(095) 123-45-67', '095' и '123-45-67'.

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

Звездочка '*'. Указывает, что символ должен быть повторен 0 или более раз (т.е. символ может отсутствовать или присутствовать в любых количествах). Пример: выражение /ab*c/ найдет строки 'ac', 'abc', 'abbc' и т.д.

Плюс '+'. Указывает, что символ должен быть повторен 1 или более раз (т.е. символ обязан присутствовать и может присутствовать в любых количествах). Пример: выражение /ab+c/ найдет строки 'abc', 'abbc', 'abbbc' и т.д., но не найдет строку 'ac'.

Знак вопроса '?'. Указывает, что символ моет как присутствовать, так и нет, но при этом не может повторяться более одного раза. Пример: выражение /ab?c/ найдет строки 'ac' и 'abc', но не найдет строку 'abbc'.

Фигурные скобки '{' и '}'. Определяют количественную характеристику символа. Внутри скобок через запятую перечисляются минимальное и максимальное количество повторений символа. При этом любой из параметров может быть опущен, а кроме того можно задать точное количество повторений, указав только одно число. Примеры:

· {2,4} - символ долен повториться минимум 2 раза, но не более 4.

· {,5} - символ может отсутствовать (т.к. не задано минимальное количество повторений), но если присутствует, то не должен повторяться более 5 раз.

· {3,} - символ должен повторяться минимум 3 раза, но может быть и больше.

· {4} - символ должен повторяться ровно 4 раза

Есть еще одна тонкость в использовании метасимвола '? '. Посмотрите на такое выражение: /.+a/. Ожидается, что оно вернет нам часть текста до первого вхождения символа ' a ' в этот текст. На самом деле оно будет работать несколько не так, как ожидается и результатом поиска будет весь текст до последнего вхождения символа ' a '. Дело в том, что по умолчанию количественные метасимволы "жадничают" и пытаются захватить как можно больший кусок текста. Если это не нужно (как а нашем случае), то необходимо "отучить" их от жадности, указав знак '? ' после количественного метасимвола: /.+?a/. После этого выражение будет работать так как надо.

 

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

Модификатор Значение
i Включение режима case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы ' ^ ' и ' $ ' указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s По умолчанию метасимвол '. ' не включает в свое определение символ перевода строки. Т.е. для многострочного текста выражение /.+/ вернет только первую строку, а не весь текст, как ожидается. Указание этого модификатора снимает это ограничение.
U Делает все количественные метасимволы "не жадными" по умолчанию (про "жадность" количественных метасимволов см. выше)

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

Функции, которые поддерживают регулярные выражения:

ereg() ereg_replace() eregi() eregi_replace() split()

ereg - парное значение регулярного выражения

int ereg(string pattern, string string, array [regs]);

Ищет в строке string шаблон, переданном в регулярном выражении, указанном в pattern. Если шаблон присутствует в строке, тогда возвращает значение, отличное от нуля. В третий параметр можно записывать части строки, соответствующие шаблону. Поиск чуствителен к регистру.

ereg_replace -- заменяет регулярное выражение

string ereg_replace(string pattern, string replacement, string string);

Ищет по шаблону pattern в строке string и затем заменяет найденный текст на replacement. Возвращает либо измененную строку в случае удачи, либо исходную строку. Чувствителен к регистру.

eregiereg

int eregi(string pattern, string string, array [regs]);

eregi_replace - замена регулярного выражения без учета регистра

string eregi_replace(string pattern, string replacement, string string);

Эта функция идентична ereg_replace() за исключением того, что она игнорирует различие в регистре у букв.

Функция split - разбивает строку на массив

array split(string pattern, string string, int [limit]);

Возвращает массив строк, каждая из которых является подстрокой строки, образованные разбитием этой строки на части, отделенные друг от друга разделителем, определенном в параметре pattern. Третий параметр определяет количество элементов в массиве. Если произойдет ошибка, функция вернет false.

 

ВНИМАНИЕ: в php версии 4.0 и выше вместо описанных метасимволов используются следующие:

[[:alpha:]] Любая буква
[[:digit:]] Любая цифра
[[:alnumt:]] Любая буква или цифра
[[:space:]] Любой пробельный символ
[[:upper:]] Любая заглавная буква
[[:lower:]] Любая маленькая буква
[[:punct:]] Любой знак пунктуации
[[:xdigit:]] Любая шестнадцатиричная буква

 

 


Тема № 13. Cookies.

Представьте себе, что Вы создали свой сайт. И вроде бы симпатичный такой, и хорошо сделан. И регистрация на Вашем сайте есть, и даже общее количество посетителей можно узнать. Но Вам вдруг очень захотелось узнать, а сколько раз каждый из посетителей заходит на Ваш сайт, или проследить перемещение того или иного посетителя по сайту, или определять сразу зарегистрированных пользователей без проверки пароля. И так Вам это нужно, что просто без этого вся работа над сайтом бесполезна. В таком случае можно придумывать очень долго по ночам, как это все сделать. А можно использовать cookies.

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

Cookie - это маленький текстовый файл, который содержит запись в виде пары ключ/значение, который постоянно хранится у клиента. Обычно они хранятся в папочке Cookies (в Windows2000 полный путь к этой папке такой: имя_диска/Documents and Settings/имя_пользователя/Cookies).

В народе бытует поверье, что якобы cookies - эта такая гадость, которая может отформатировать жесткий диск, отправить сведения о вашей системе вражеским шпионам или другие мыслемые и немыслемые бяки. На самом деле это не так. Этот файл содержит в себе только то, что в этот файл изначально записали на сервере, и ничего кроме этого.

Существуют особые ограничения, накладываемые на использование cookies. Во-первых, браузер не может иметь более 300 cookies и более 20 cookies на один сервер. Во-вторых, cookies посылаются только тем серверам, которым разрешено их получать.

В cookies задаются следующие параметры:

· Время истечения срока годности. По умолчанию cookies существуют до момента закрытия браузера. (Например, 01/10/2002, 18:00:00)

· Информация о пути. Указывает каталоги на сервере, для которых действует cookie. По умолчанию указывает все каталоги сервера.

· Информация о домене. В cookie можно настроить имена доменов, для которых они будут посылаться. По умолчанию устанавливается домен сервера, установившего cookie.

· Параметр защиты. Сookies могут посылаться как по защищенным, так и по открытым каналам. По умолчанию - по открытому каналу, но если параметр защиты включен, будут отправляться по защищенным каналам (т.е. через протокол HTTPS).

Чтобы установить cookie используется функция setcookie.

int setcookie (string name, string [value], int [expire], string [path], string [domain], int [secure])

Где первый параметр - имя cookie. value - значение, соответствующее этому cookie. Третий параметр - время жизни cookie (устанавливается при помощи функций time() либо mktime()). Четвертый параметр - информация о пути. domain - имя домена, и secure - параметр защиты (если установлен в 1, cookie посылается по защищенному каналу).

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

 

<?php $cook++; setcookie("cook", $cook, mktime(18,0,0,10,31,2002)); //истекает 31 ноября 2002 года в 18:00:00 echo "Hello! You were here ".$cook;?>

Приведенный выше пример определяет сколько раз пользователь посещал данный сайт. Важно помнить, что cookie и соответствующая переменная (в нашем случае "cook" и $cook) доступны только в том случае, если клиент принимает и возвращает cookie обратно серверу.

Доступ к cookie происходит через глобальную переменную с таким же именем, как и у cookie. Но это не единственный способ доступа к cookie. Второй способ - это доступ через глобальный массив $HTTP_COOKIE_VARS, который хранит только переменные, связанные с cookies.

echo $HTTP_COOKIE_VARS["cook"];

Кроме всего прочего, у Вас есть еще возможность в одном cookie сохранить несколько значений. Для этого cookie рассматривается как массив, и всем элементам этого массива присваиваются значения.

$name = "Vasya";if(!isset($ArrCook[0])){ setcookie("ArrCook[0]", $name);}if(!isset($ArrCook[1])){ $ArrCook[1] = 0;}$ArrCook[1]++;setcookie("ArrCook[1]", $ArrCook[1]); echo "Hello, ".$ArrCook[0]." you were here ".$ArrCook[1]." times!";

 

 


Тема № 14. Сессии.

В этой главе речь пойдет о таком важном механизме, как сессии. Встроенная поддержка сессий появилась в PHP начиная с 4-ой версии (до этого сессии были реализованы в виде внешней библиотеки)

Сессии - это механизм, который позволит вам создавать и использовать переменные, сохраняющие свое значение в течение всего времени работы пользователя с вашим сайтом. При этом у каждого пользователя вашего сайта эти переменные будут собственными, т.е. их область видимости (variable scope) распространяется на все время нахождения на сайте конкретного пользователя, причем для каждого захода пользователя на ваш сайт эти переменные будут различными. Говоря проще, эти переменные принадлежат конкретной сессии работы конкретного пользователя с вашим сайтом (отсюда и название механизма - сессии).

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

В основе всего механизма сессий лежит решение задачи об идентификации того, от кого именно пришел запрос на сервер. Если это будет точно известно, то уже не возникнет большой проблемы в том, чтобы предоставить скрипту информацию, относящуюся именно к этому конкретному пользователю. Данная задача решается путем присвоения каждой сессии уникального идентификатора SESSIONID, который создается в тот момент, когда пользователь заходит на сайт, и уничтожается в момент, когда пользователь уходит с сайта. Этот идентификатор передается на сервер вместе с каждым запросом со стороны клиента и возвращается на машину клиента вместе с результатами обработки запроса. Алгоритм генерации SESSIONID (а в PHP в качестве идентификатора сессии используется т.н. GUID (Global Unique IDentifier)) позволяет гарантировать его уникальность, поэтому исключена возможность того, что две сессии будут иметь один и тот же идентификатор сессии.

PHP может использовать два различных механизма в качестве "транспортного средства" для передачи SESSIONID:

· Cookies

· Параметр query string

Cookies - это, конечно, более удобный способ передачи идентификатора. При этом SESSIONID сохраняется "внутри" браузера и остается незаметным для пользователя. Но поддержка cookies - это необязательное условие для браузера, она может отсутствовать или быть отключена у кого-то из посетителей, поэтому в общем случае полагаться на них нельзя. В этом случае можно использовать менее "красивый", но более надежный способ - передачу SESSIONID через параметр query string. PHP имеет возможность автоматически добавлять SESSIONID ко всем линкам в генерируемых HTML страницах, поэтому вам, как правило, не нужно будет заботиться о том, чтобы добавлять этот идентификатор к каждому линку вручную. Если же вы по каким-либо причинам хотите сами передавать идентификатор сессии - вы всегда можете получить его из константы SESSIONID или из функции session_id().

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

session_start();

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

session.auto_start = 1

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

session_register('имя_перем1','имя_перем1',...);

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

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

Способ обращения к сессионным переменным зависит от настроек в файле php.ini. Если register_globals включен, то обращение к сессионной переменной по синтаксису ничем не будет отличаться от обращения к обычной переменной:

session_register('myVar');$myVar = 5;

Если же он выключен - то обращаться к сессионным переменным необходимо через глобальный массив $HTTP_SESSION_VARS:

session_register('myVar');$HTTP_SESSION_VARS['myVar'] = 5;

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

Session.save_path

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

Session.use_cookies

Определяет, необходимо ли использовать cookies для хранения SESSIONID. Если значение этого параметра установлено в "да" (1, On, Yes, True), то будут использоваться cookies, если в "нет" (0, Off, No, False) - то SESSIONID будет передаваться через параметр query string.

Session.auto_start

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

Session.cookie_lifetime

Время (в секундах), в течении которого будет сохраняться в браузере cookie, содержащая SESSIONID. Если значение этого параметра установлено в 0, то сессия будет сохраняться до тех пор, пока пользователь не закрот окно браузера. Если же значение задано, то по истечение заданного промежутка cookie будет удалена и сессия будет считаться закрытой.

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

Для того, чтобы проиллюстрировать использование сессионных переменных - небольшой пример:

 

Example1.php

<?phpsession_start();session_register("test");$test = "Ура! Сессионная переменная работает";?><a href="example2.php">click here</a>

Example2.php

<?phpsession_start();echo $test;?>

Session_destroy()

Уничтожить: все данные, хранящиеся в сессии; файл, отведенный для данных; переменные в программе и идентификатор посетителя. Функция отменяет действие session_start(). Вызывать нужно после вызова session_start(). Можно применять, чтобы уничтожать сессиию пользователя, а потом сразу вызывать в программе второй раз session_start(), получиться совершенно новый посетитель с новым идентификатором и чистой сессией.

session_save_path()

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

$path=session_save_path() //получить session_save_path("/mydir/temp"); //установить

Session_id()

Получить или установить идентификатор посетителя (128-битное число, представленное в виде строки в 32 байта).

Session_unregister()

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

Session_unset()

Очистить все переменные сессии. В отличии от session_destroy() сессия и идентификатор остается.

 


 

Конспект лекций по курсу «Java-Script»,

/ Составители: Вернодубов А.М., Кровяков С.А.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...