2011-11-11 19 views
2

CGI :: Sessionを使用してMySQLデータベースにセッションを格納する際に問題があります。ここでCGI :: Session :: Driver :: mysqlを使用したPerl CGI ::セッション

スニペット

#!/usr/bin/perl 

use CGI; 
use CGI::Session; 
use CGI::Session::Driver::mysql; 
use DBI; 
use DBD::mysql; 
use Net::LDAPS; 

require '../include/include.pl'; 

$LDAP_SERVER = 'my.test.ldap.example.com'; 
$LDAP_SSL_PORT = '636'; 
$LDAP_BASE = 'ou=users,dc=example,dc=com'; 

$ldap = Net::LDAPS->new($LDAP_SERVER, port=> $LDAP_SSL_PORT) 
    or die "Unable to create LDAP object because: $! \n"; 

$dbh = DBI->connect("DBI:mysql:host=$db_host;database=$db_name",$db_user,$db_pswd) 
    or die "Unable to connect to database: \"$DBI::errstr\" $! \n"; 

$q = CGI->new; 

$usr = $q->param('usr') || undef; 
$userDN = "uid=$usr,$LDAP_BASE"; 

if($usr) { 
    $pwd = $q->param('pwd'); 
    $ldapMsg = $ldap->bind($userDN, password=>$pwd); 
    $result = $ldap->code; 

    if ($result == 0) { 
     $session = CGI::Session->new('driver:mysql', undef, 
        { TableName=>'car_sessions', 
         IdColName=>'id', 
         DataColName=>'a_session', 
         Handle=>$dbh}) 
      or die "Unable to create session because: $!"; 

     $session->expire('+1h'); 
     $session->param(-name=>'car_login', -value=>$usr); 
     $sess_cookie = $q->cookie(-name=>'CGISESSID', -value=>$session->id, -expires=>'+1h', -path=>'/hr_car/'); 
     $login_cookie = $q->cookie(-name=>'car_login', -value=>$usr, -expires=>'+1h', -path=>'/hr_car/'); 
     print $q->header(-cookie=>[$sess_cookie, $login_cookie], -location=>'manage.cgi'); 
    } 

LDAPが正しく結合され、そしてクッキーが正しく設定されているが、何も私のセッションテーブルに現れていません!

何ができますか?

+0

大丈夫です! $ session-> flush(); – daniel0mullins

答えて

0

私はこの問題がauto-flushing being unreliableと考えています。自動フラッシュが発生する前にDBIハンドルが範囲外になるという明白な問題があります。セッションの設定が完了したら、それを削除した後に$session->flushに電話してください。

あなたはfile-scoped lexicals代わりに$dbhのためのグローバルや友人を使用してこの問題を軽減することが、Perlは正しい順序でそれらをクリーンアップすることができるかもしれない、それはちょうど良いアイデアです。

PS厳密と警告をオンにし、これらの変数をすべて宣言します。あなたの問題は、タイプミスによって簡単に引き起こされ、あなたはそれを知らなかったでしょう。