2011-12-17 16 views
1

マイコード:私はこのようなクラスを使用MySQLの接続が無効なため、リンクのリソースの失敗

class cdbsHandler 
{ 
    [...] 
    private $link; 

    function __construct($mysqld) 
    { 
     [...] 

     $this->link = mysql_connect(
      $mysqld['host'], $mysqld['user'], $mysqld['password'] 
     ); 

     mysql_select_db($mysqld['database'], $this->link); 
    } 

    function write($sessionId, $data) 
    { 
     $sessionId = mysql_real_escape_string($sessionId, $this->link); 
    } 
    [...] 
} 

$mysqldは、データベースの資格情報がある

static function startSession($name, $mysqld) 
{ 
    [...] 
    $sessionHandler = new cdbsHandler($mysqld); 
    session_set_save_handler(
     array ($sessionHandler,"open"), 
     array ($sessionHandler,"close"),array ($sessionHandler,"read"), 
     array ($sessionHandler,"write"),array ($sessionHandler,"destroy"), 
     array ($sessionHandler,"gc") 
    ); 
    session_start(); 
} 

。 静的関数は、ユーザーがページを読み込むたびに呼び出されます。

私が手にエラーがある:

mysql_real_escape_string(): 2 is not a valid MySQL-Link resource 
(calling mysql_real_escape_string in the write function) 

資格情報が正しいです。それらは設定ファイルからロードされ、セッションの開始後に数行の接続を確立するために使用されます。私には非常に重要なようで何

私は実際にログインすることだとデータが、すぐログインページは、上記のエラーが表示されたホームページに私をリダイレクトするように、データベース(/セッション)に書き込まれますがされています。 (。。ログインページがセッションデータに保存されたフォーム・トークンを検証しかし、その要求を送信した後にスクリプトがもはやいかなるセッションデータにアクセスすることはできません)

詳細情報: コードからですデータベース "バックアップ"を持つmemcachedセッションハンドラ。

+0

多くのコードが不足しているような気がします。問題がどこにあるかを確認できるように、コードをもっと提供してください。例えば、 'write()'関数/ '$ sessionId'変数はどこでどのように使われていますか? – Ryan

+0

データベース接続が正常に完了しましたか? mysql_connect()コールの後に 'die or(mysql_error())'を追加してみてください。 –

+0

@ Ryan:セッションに書き込むときに使用され、sessionIdは自動的にphpによって関数に渡されます。 – Kazuo

答えて

1

ほとんどの場合、これは(あなたの情報に基づいて最善の推測)何が起こっているかである:

the manual毎のセッションの書き込みハンドラは、スクリプトが終了した後まで呼び出されません。 PHPの多くのバージョンでは、すべてのクラスデストラクタはの前に実行され、はセッション書き込みハンドラを呼び出します。したがって、__destruct()で接続を閉じると、write()が呼び出される前に__destruct()が呼び出され、セッションを保存しようとすると無効な接続が発生します。

+0

情報ありがとうございます。私は__destruct関数を使用していませんが、何かをしなければならないかもしれません。どのように接続がまだ利用可能であることを確認するための任意のアイデア? – Kazuo

+0

何もきれいではありません - セッションを明示的に閉じる(session_write_close)か、セッションを書き込む前に(re)接続してください(ewww)。 – sirbrialliance

関連する問題