如何使用PHP从持久会话处理程序中检索特定信息?

时间:2017-02-20 18:26:47

标签: php mysql session handler persistent

我使用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 个答案:

答案 0 :(得分:0)

第一个选项是反序列化此字符串。 http://php.net/manual/en/function.unserialize.php

第二个选项,您可以将preg_match函数与下一个模式一起使用:

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

答案 1 :(得分:0)

我无法找到处理序列化字符串格式的任何地方,这不是我之前见过的。

然而,这是一个快速的功能,将它变成一个阵列(它可能不是太优雅,但我只有一杯咖啡):

$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'];

heres an example