这种递归函数会变得疯狂吗?

时间:2009-11-11 03:24:32

标签: php recursion

function generate_session_id( &$db )
{
    $user_sess_id = md5( uniqid( mt_rand(), true );

    try
    {
        $stmt = $db->prepare("SELECT COUNT(*) AS session_exists FROM sessions WHERE session_id = :session_id");
        $stmt->bindParam(':session_id', $user_sess_id);
        $stmt->execute();
        $result = $stmt->fetch( PDO::FETCH_ASSOC );

        if( $result['session_exists'] == 1 )
        {
            // Recursion !
            generate_session_id( $db );
        }      
        else
        {
            return $user_sess_id;
        }
    }
    catch( PDOException $e )
    {
        die( "generate_session_id(): " . $e->getMessage() );
    }
}

此功能是否安全使用或是否存在任何缺陷?它的唯一目的是为每个会话生成唯一的ID。

2 个答案:

答案 0 :(得分:1)

看起来很安全。但是,它不提供一个,呃,唯一的id?你为什么要在它上面做MD5哈希?这引入了一系列问题......

答案 1 :(得分:1)

你没有返回递归函数的值,所以如果以递归方式调用函数,你将得不到任何值。你需要这样做:

return generate_session_id( $db );

尽管如此,你根本不需要递归。只需做一个正常的循环:

do {
    // generate id
    $id_exists = // look if id exists
} while ($id_exists);

另外,你真的需要自己生成ID吗?您是否正在使用需要此处理的会话处理?