Анимация
JavaScript
|
Главная Библионтека Регистрация переменных bool session register(mixed $name [, mixed $name1, ...]) PHP узнает о том, что ту или иную переменную нужно сохранить в сессии, если ее предварительно зарегистрировать. Для этого и предназначена функция session register() . Она принимает в параметрах одно или несколько имен переменных (имена задаются в строках, без знака $ слева), регистрирует их в текущей запущенной сессии и возвращает значение "истина", если все прошло корректно. Примечание Почему же тогда я описал типы параметров как mixed, а не как string? Да потому, что на самом деле в функцию можно передавать не одну строку в каждом параметре, а сразу список строк. Каждая такая строка будет регистрировать отдельную переменную с соответствующим именем. Более того - элементом списка может опять же быть список строк, и т. д. Нет ничего страшного, если мы дважды зарегистрируем одну и ту же переменную в сессии. На самом деле, чаще всего как раз так и происходит - при повторном запуске сценария. Вот пример: i Листинг 25.1. Пример работы с сессиями <? session start(); session register("count"); $count=@$count+1; ?> <body> <h2>Счетчик</h2> В текущей сессии работы с браузером Вы откр1ли эту страницу <?=$count?> раз(а). Закройте браузер, чтобы обнулить счетчик. </body> Как видим, все предельно просто. Идентификатор сессии и имя группы Что же, теперь мы уже можем начать писать кое-какие сценарии. Но вскоре возникнет небольшая проблема. Дело в том, что на одном и том же сайте могут сосущество- Session name() лишь сменяет имя текущей группы и сессии, но не создает новую сессию и временное хранилище! Это значит, что мы должны в большинстве случаев вызывать session name(имя группы) еще до ее инициализации - вызова session start() , в противном случае мы получим совсем не то, что ожидали. Если функция session name() не была вызвана до инициализации, PHP будет использовать имя по умолчанию - PHPSESiD. Примечание Кстати говоря, имя группы сессий, устанавливаемое рассматриваемой функцией, - это как раз имя того самого Cookie, который посылается в браузер клиента для его идентификации. Таким образом, пользователь может одновременно активизировать две и более сессий - с точки зрения PHP он будет вать сразу несколько сценариев, которые нуждаются в услугах поддержки сессий PHP. Они "ничего не знают" друг о друге, поэтому временные хранилища для сессий должны выбираться не только на основе идентификатора пользователя, но и на основе того, какой из сценариев запросил обслуживание сессии. Имя группы сессий Что, не совсем понятно? Хорошо, тогда рассмотрим пример. Пусть разработчик A написал сценарий счетчика, приведенный в листинге 25.1. Он использует переменную $count, и не имеет никаких проблем. До тех пор, пока разработчик B, ничего не знающий о сценарии A, не создал систему статистики, которая тоже использует сессии. Самое ужасное, что он также регистрирует переменную $count, не зная о том, что она уже "занята". В результате, как всегда, страдает пользователь: запустив сначала сценарий разработчика B, а потом - A, он видит, что данные счетчиков перемешались. Непорядок! Нам нужно как-то разграничить сессии, принадлежащие одному сценарию, от сессий, принадлежащих другому. К счастью, разработчики PHP предусмотрели такое положение вещей. Мы можем давать группам сессий непересекающиеся имена, и сценарий, знающий имя своей группы сессии, сможет получить к ней доступ. Вот теперь-то разработчики A и B могут оградить свои сценарии от проблем с пересечениями имен переменных. Достаточно в первой программе указать PHP, что мы хотим использовать группу с именем, скажем, sesA, а во второй - sesB. string session name([string $newname]) Эта функция устанавливает или возвращает имя группы сессии, которая будет использоваться PHP для хранения зарегистрированных переменных. Если $newname не задан, то возвращается текущее имя. Если же этот параметр указан, то имя группы будет изменено на $newname, при этом функция вернет предхдущее имя. менно активизировать две и более сессий - с точки зрения PHP он будет выглядеть как два ли более различных пользователя. Однако не забывайте, что, случайно установив в сценарии Cookie, имя которого совпадает с одним из имен группы сессий, вы "затрете" Cookie. Вот простой пример применения этой функции. <? session name("CounterScript" session start(); session register("count"); $count=@$count+1; ?> В текущей сессии Вы открыли эту страницу <?=$count?> раз( а). Рекомендую всегда указывать имя группы сессии вручную, не полагаясь на значение по умолчанию. За это вам скажут спасибо разработчики других сценариев, когда они захотят использовать вашу программу вместе со своими. Идентификатор сессии Мы уже говорили с вами, зачем нужен идентификатор сессии (sid). Фактически, он является именем временного хранилища, которое будет использовано для хранения данных сессии между запусками сценария. Итак, один sid - одно хранилище. Нет SID, нет и хранилища, и наоборот. В этом месте очень легко запутаться. В самом деле, как же соотносится идентификатор сессии и имя группы? А вот как: имя - это всего лишь собирательное название для нескольких сессий (то есть, для многих sid), запущенных разными пользователями. Один и тот же клиент никогда не будет иметь два различных sid в пределах одного имени группы. Но его браузер вполне может работать (и часто работает) с несколькими SID, расположенными логически в разных "пространствах имен". Итак, все sid уникальны и однозначно определяют сессию на компьютере, выполняющем сценарий - независимо от имени сессии. Имя же задает "пространство имен", в которое будут сгруппированы сессии, запущенные разными пользователями. Один клиент может иметь сразу несколько активных пространств имен (то есть несколько имен групп сессий). string session id([string $sid]) Функция возвращает текущий идентификатор сессии sid. Если задан параметр $sid, то у активной сессии изменяется идентификатор на $sid. Делать это, вообще говоря, не рекомендуется. Фактически, вызвав session id() до session start() , мы можем подключиться к любой (в том числе и к "чужой") сессии на сервере, если знаем ее идентификатор. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 [ 115 ] 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |