2011-01-14 22 views
3

私は、カスタムセッションハンドラを使用してセッションデータをMySQLデータベースに保存しようとしています。 「mysql_close():指定された引数が有効なMySQL-Linkリソースではありません

function _open(){ 

    global $_sess_db; 
    $_sess_db = mysql_connect("localhost", "root", "******"); 
    if ($_sess_db) { 
     return mysql_select_db('style', $_sess_db); 
    } 
    return false; 
} 

function _close(){ 
    global $_sess_db; 
    return mysql_close($_sess_db); //error happens here 
} 

エラーメッセージの全文は、最終的には最終的にポイント:私はhereからもらった私が使用しているコードを、ここで

mysql_close(): supplied argument is not a valid MySQL-Link resource 

だ:しかし、私は次の警告を得続けますreturn mysql_close($ _ sess_db); "ライン。私はmysql_connect情報が実際に動作することを確認できます。残りのセッションハンドラ関数も定義しています。

また、実際にはセッションハンドラ関数を呼び出すことなく、ページロード時にすぐにこれらのエラーが発生します。


答えて

3

問題は可変スコープです。関数の外部で変数が最初に定義されていない場合、globalキーワードは何も行いません。代わりにスーパーグローバル$ GLOBALS ['_ sess_db']を使用するか、または最初に$ _sess_dbを任意の関数の外で定義することができます。

+0

これに加えて、複数のデータベースを使用していない場合は、引数を渡さなかった場合に最後に開かれた接続を自動的に閉じるので、閉じるDB接続を指定する必要はありません。 – dqhendricks

+1

また、スクリプトの最後に非永続データベース接続が自動的に閉じられるため、プロジェクトによってはDB接続を閉じる必要がない場合もあります。 – dqhendricks

+0

うん、可変スコープが問題でした。私はもはやそのエラーを取得していません。しかし、セッションを開始した後、私は$ _SESSION ['uid'] = 4を実行しようとしています。しかし、これはデータベースに反映されていません。 session_write関数を定義したので、そのカスタム関数は$ _SESSION ['uid'] = ... rightのために使用されるはずです。その場合、私のカスタムハンドラ関数に問題はありますか? – maxedison

0

_openにいくつかのデバッグプリントアウトを追加してみてください()と_close()、あなたは彼らがあることを期待していないとき、それらが呼び出されるかどうかを確認します。

+0

私は彼らがいつ呼び出されることになっているのか分かりません。ページが読み込まれるたびに自動的に呼び出されるべきですか?それは起こっていることです。言い換えれば、私はsession_start()を呼び出していないので、前のセッションは存在しません。 – maxedison

+0

また、php.iniファイルでセッションを自動起動に設定していません。 – maxedison