- session_create_id
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 2 notes
- Php session id is empty
- Check to see if a session has already been started in PHP.
- Checking to see if a session exists in versions lower than 5.4.
- Using the session_status function in PHP 5.4 and above.
- Why not just check if the $_SESSION array is empty?
session_create_id
session_create_id() используется для создания нового идентификатора текущей сессии. Возвращает идентификатор сессии, который не подвержен коллизиям.
При неактивной сессии проверка на коллизии не осуществляется.
Идентификатор сессии создаётся в соответствии с настройками php.ini.
Важно использовать тот же идентификатор пользователя на вашем веб-сервере, что и для скрипта задачи сборщика мусора. В противном случае, у вас могут возникнуть проблемы доступа, особенно с дескриптором сохранения файлов.
Список параметров
Если указан параметр prefix , то новый идентификатор сессии будет с префиксом prefix . Не все символы возможно использовать в идентификаторе сессии. Допускается использовать только символы из диапазона: a-z A-Z 0-9 , (запятая) и — (минус) .
Возвращаемые значения
session_create_id() возвращает новый, не подверженный коллизиям, идентификатор текущей сессии. Если используется при неактивной сессии, проверка на коллизии пропускается. В случае неудачи возвращается false .
Примеры
Пример #1 Пример использования session_create_id() с функцией session_regenerate_id()
// Функция My session start с управлением на основе временных меток
function my_session_start () session_start ();
// Не разрешать использование слишком старых идентификаторов сессии
if (!empty( $_SESSION [ ‘deleted_time’ ]) && $_SESSION [ ‘deleted_time’ ] < time () - 180 ) session_destroy ();
session_start ();
>
>
?php
// Функция My session regenerate id
function my_session_regenerate_id () // Вызов session_create_id() пока сессия активна, чтобы
// удостовериться в отсутствии коллизий.
if ( session_status () != PHP_SESSION_ACTIVE ) session_start ();
>
// ВНИМАНИЕ: Никогда не используйте конфиденциальные строки в качестве префикса!
$newid = session_create_id ( ‘myprefix-‘ );
// Установка временной метки удаления. Данные активной сессии не должны удаляться сразу же.
$_SESSION [ ‘deleted_time’ ] = time ();
// Завершение сессии
session_commit ();
// Убеждаемся в возможности установки пользовательского идентификатора сессии
// ЗАМЕЧАНИЕ: Вы должны включать опцию use_strict_mode для обычных операций.
ini_set ( ‘session.use_strict_mode’ , 0 );
// Установка нового пользовательского идентификатора сессии
session_id ( $newid );
// Старт сессии с пользовательским идентификатором
session_start ();
>
// Убеждаемся, что опция use_strict_mode включена.
// Опция use_strict_mode обязательна по соображениям безопасности.
ini_set ( ‘session.use_strict_mode’ , 1 );
my_session_start ();
// Идентификатор сессии должен генерироваться заново при:
// — Входе пользователя в систему
// — Выходе пользователя из системы
// — По прошествии определённого периода времени
my_session_regenerate_id ();
// Далее основной код программы
?>
Смотрите также
- session_regenerate_id() — Генерирует и обновляет идентификатор текущей сессии
- session_start() — Стартует новую сессию, либо возобновляет существующую
- session.use_strict_mode
- SessionHandler::create_sid() — Возвращает новый идентификатор сессии
User Contributed Notes 2 notes
This function is very hard to replicate precisely in userland code, because if a session is already started, it will attempt to detect collisions using the new «validate_sid» session handler callback, which did not exist in earlier PHP versions.
If the handler you are using implements the «create_sid» callback, collisions may be detected there. This is called when you use session_regenerate_id(), so you could use that to create a new session, note its ID, then switch back to the old session ID. If no session is started, or the current handler doesn’t implement «create_sid» and «validate_sid», neither this function nor session_regenerate_id() will guarantee collision resistance anyway.
If you have a suitable definition of random_bytes (a library is available to provide this for versions right back to PHP 5.3), you can use the following to generate a session ID in the same format PHP 7.1 would use. $bits_per_character should be 4, 5, or 6, corresponding to the values of the session.hash_bits_per_character / session.sid_bits_per_character ini setting. You will then need to detect collisions manually, e.g. by opening the session and confirming that $_SESSION is empty.
function session_create_random_id ( $desired_output_length , $bits_per_character )
$bytes_needed = ceil ( $desired_output_length * $bits_per_character / 8 );
$random_input_bytes = random_bytes ( $bytes_needed );
// The below is translated from function bin_to_readable in the PHP source (ext/session/session.c)
static $hexconvtab = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-‘ ;
$p = 0 ;
$q = strlen ( $random_input_bytes );
$w = 0 ;
$have = 0 ;
$chars_remaining = $desired_output_length ;
while ( $chars_remaining —) if ( $have < $bits_per_character ) if ( $p < $q ) $byte = ord ( $random_input_bytes [ $p ++] );
$w |= ( $byte $have += 8 ;
> else // Should never happen. Input must be large enough.
break;
>
>
// consume $bits_per_character bits
$out .= $hexconvtab [ $w & $mask ];
$w >>= $bits_per_character ;
$have -= $bits_per_character ;
>
Php session id is empty
Доброго времени суток всем.
Помогите с проблемой разобразаться — функция session_id() ничего не возвращает.
Т.е. конструкция echo «session ничего не отображает,
результат такой: session >Никто не сталкивался с такой проблемой ?
Цитата |
Return Values |
Но при попытке вызвать session_start() дает:
Warning: session_start() [function.session-start]: Cannot send session cookie — headers already sent by (output started at Z:\home .
и при всем при этом сессия работает и переменные через нее нормально передаю
ну походу это надо делать до какого либо вывода в поток. попробуй получить ID до вывода.. ну и я надеюсь ты уже осуществлял работу с сесией.. тоесть она создана..
$SessionId = session_id();
if ( empty($SessionId) )
session_start();
$SessionId = session_id();
>
Я как то раз задавал этот вопрос насчет session_id(); так вот, ОН НЕ ПОСТОЯННЫЙ, все время генерируется новый.
DmitryOpalev, у меня указанная выше конструкция в index. php , а любая ссылка на страницах переводит на index с набором управляющих переменных, в зависимости от которых
уже определяю что надо делать .
или может спасет
if (!isset($_SESSION[‘lolo’]))
$_SESSION[‘lolo’] = session_id();
>
session_start();
die(var_dump(session_id()));
Sanchopansa, ну да . только у меня задача — получить какой-то уникальный идентификатор на то время, пока пользователь сидит на сайте .
а session_id все время меняется
Читаем When using session cookies , specifying an id for session_id() will always send a new cookie when session_start() is called, regardless if the current session id is identical to the one being set.
Попробую поставить вопрос по-другому — я хочу сделать корзину и мне нужен какой-то уникальный идентификатор, который был «жил» до тех пор, пока пользователь не закроет
окно браузера.
Никто не сталкивался с такой задачей ?
linker прав на все 1000 . но мне надо ПОЛУЧИТЬ идентификатор, как его хранить — тут вопросов нет . попробую еще подробней
для формирования заказа нужен какой-то уникальный номер, рассматривал 2 пути
1. при нажатии на кнопку «в корзину» делается вставка в таблицу заказов и получаю
оттуда последний IDENTITY. дальше его использую его как номер заказа. при следующих
нажатиях на кнопку просто проверяю — а есть ли запись с таикм ИД, и если есть,
то уже вставка идет в таблицу товаров заказа
Такой способ я использовал на одном сайте, когда оформлял заказ на печать фото
2. попробовать получить ИД сесии и сипользовать его в качестве идентификатора
список товаров заказа хранить пока в массиве и при подтверждении уже записывать
в БД, получать какой-то номер заказа и выдавать его пользователю (выдавать 32 символа
как номер заказа — жестоко для пользователя;) )
Вот сейчас решил попробовать вариант 2 . но что-то пока не получается
Есть такой массив $_SESSION, он для каждого пользователя грубо говоря свой. Id сессии хранится в куках или передается в адресной строке. Например, пользователь зашел на сайт
$_SESSION['basket'][$id_tovar] = $count_tovar;
$result = mysql_query("SELECT `id`, `name` FROM `tovars` WHERE `id` IN (" . implode(',', array_keys($_SESSION['basket'])) . ")");
echo 'В корзине:
'
while($Tovar = mysql_fetch_assoc($result))
echo $Tovar['name'] . ' в количестве ' . $_SESSION['basket'][$Tovar['id']] . '
';
$remove_id = isset($_GET['id']) ? abs($_GET['id']) : 0;
if (isset($_SESSION['basket'][$remove_id]))
unset($_SESSION['basket'][$remove_id]);
народ, вылезла у меня другая проблема .
или туплю или хз .
работаю через $_SESSION
когда пользователь нажал на кнопку «Купить», то
сначала проверяю
и если ничего нет, то вставка в БД, получаю последний ид и присваиваю его
в $_SESSION[‘OrderId’].
вывожу
показывает что $_SESSION[‘OrderId’] есть и равен нужному значению.
после возврата в index. php , вывожу
и вот тут мне показывается, что $_SESSION[‘OrderId’] и близко нет .
никто не сталкивался с такой ситуацией ?
$sId = session_id();
if ( empty($sId) ) < session_start(); >
Check to see if a session has already been started in PHP.
This is a PHP guide on how to check to see if a session already exists.
As you probably already know, session_start is a PHP function which creates a new session.
However, if you call this function more than once, your script will throw an E_NOTICE error.
Although the solution seems pretty straight forward (do not call it more than once), in certain scenarios, you won’t be entirely sure if a session has already been started or not. In some cases, it might be out of your control.
There are two ways to approach this.
Checking to see if a session exists in versions lower than 5.4.
If you are using a PHP version that is lower than 5.4.0, you can do the following.
If you run the code above, you will see that a session is always present.
- We check to see if the function session_id returns an empty string.
- If the session_id function returns an empty string, then we can presume that a session does not exist.
- If this is the case, we can simply start the session by calling the function session_start.
Using the session_status function in PHP 5.4 and above.
In PHP version 5.4.0 and above, we can use the session_status function. As the name suggests, this function returns the status of the current session.
This function can return three different integer values, all of which are available as predefined constants.
- 0 – PHP_SESSION_DISABLED: Sessions are currently disabled.
- 1 – PHP_SESSION_NONE: No session exists.
- 2 – PHP_SESSION_ACTIVE: A session already exists.
If we were to use session_status, our code would look like this:
if(session_status() == PHP_SESSION_NONE)< //session has not started session_start(); >
As you can see, using this function makes your code a little more self-explanatory!
Why not just check if the $_SESSION array is empty?
You can check to see if the $_SESSION array exists and is not empty. However, it is worth noting that $_SESSION can be manually created like so.
In other words, the $_SESSION array can exist even if no session is present.
Another issue is that this array can be empty, even if a session already exists.