Bu recursive fonksiyon deli gidebilir miyim?

2 Cevap php
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() );
    }
}

Bu fonksiyon kullanmak güvenli midir ya da herhangi bir kusurları vardır? Onun tek amacı, her oturum için benzersiz bir kimlik oluşturmak için.

2 Cevap

Sen özyinelemeli fonksiyon değer döndüren değil, yani işlevi çağrılır olduğu durumda, geri hiçbir değeri olsun istiyorum. Yapmanız gereken:

return generate_session_id( $db );

Gerçi hiç burada özyinelemeye gerekmez. Sadece normal bir döngü yapmak:

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

Ayrıca, gerçekten numarası kendiniz oluşturmak gerekiyor? Bu gerektiren bazı oturum yönetimini kullanıyor musunuz?

Oldukça güvenli görünüyor. Ama bu bir, er, benzersiz id sağladığı uniqid noktası değil mi? Ve neden bunu bir MD5 hash yapıyorsun? Bu sorunların bir dizi tanıttı ...