Как я могу получить конкретную информацию из постоянного обработчика сеанса с помощью PHP?

Я использую обработчик сессии PHP для реализации постоянной сессии на моем сайте. Проблема в том, что в какой-то момент мне нужно вставить user_key в другую таблицу MySQL, и я не знаю, как извлечь эту информацию из кода.

Например, строка данных в моей таблице сеанса:

active|i:1487613760;user_username|s:20:"v.lima06@hotmail.com";user_key|s:8:"a5186adc";authenticated|b:1;user_name|s:12:"victor";user_email|s:20:"v.lima06@hotmail.com";remember|b:1;

и я хотел бы знать, есть ли простой способ получить переменную user_key.

Извините, если это немного сбивает с толку.

2 ответа

Первый вариант - десериализовать эту строку. http://php.net/manual/en/function.unserialize.php

Второй вариант, вы можете использовать функцию preg_match со следующим шаблоном:

preg_match('/user_key\|s:\d+:"([a-zA-Z0-9]+)"/', $string, $match);

Я нигде не могу найти что-то для обработки этого формата сериализованной строки, это не то, что я видел раньше.

Тем не менее, вот быстрая функция, чтобы превратить его в массив (это может быть не слишком элегантно, но у меня было только 1 кофе):

$string = 'active|i:1487613760;user_username|s:20:"v.lima06@hotmail.com";user_key|s:8:"a5186adc";authenticated|b:1;user_name|s:12:"victor";user_email|s:20:"v.lima06@hotmail.com";remember|b:1;
';

$array = deserializeSessionString($string);

echo $array['user_key'];

// deserialize a session string into an array
function deserializeSessionString($string)
{
    $output = [];
    // separate the key-value pairs and iterate
    foreach(explode(';', $string) as $p) {
        // separate the identifier with the contents
        $bits = explode('|', $p);

        // conditionally store in the correct format.
        if(isset($bits[1])) {
            $test = explode(':', $bits[1]);
            switch($test[0]) {
                // int
                case 'i':
                    $output[$bits[0]] = $test[1];
                    break;
                case 's':

                    // string
                    // ignore test[1], we dont care about it
                    $output[$bits[0]] = $test[2];
                    break;

                case 'b':
                    // boolean
                     $output[$bits[0]] = ($test[1] == 1 ? true : false);
                    break;
            }
        }

    }

    return $output;
}

тогда вы сможете получить доступ к тому, что вам нужно, только с помощью ключа:

echo $array['user_key'];

вот пример

Другие вопросы по тегам