私は PHP を試していてsession_set_save_handler
、PDO 接続を使用してセッション データを保存したいと考えています。
書き込みアクションのコールバックとしてこの関数があります。
function _write($id, $data) {
logger('_WRITE ' . $id . ' ' . $data);
try {
$access = time();
$sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
logger('This is the last line in this function that appears in the log.');
$stmt = $GLOBALS['db']->prepare($sql);
logger('This never gets logged! :(');
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':access', $access, PDO::PARAM_INT);
$stmt->bindParam(':data', $data, PDO::PARAM_STR);
$stmt->execute();
$stmt->closeCursor();
return true;
} catch (PDOException $e) {
logger('This is never executed.');
logger($e->getTraceAsString());
}
}
最初の 2 つのログ メッセージは常に表示されますが、直後の 3 番目のメッセージ$stmt = $GLOBALS['db']->prepare($sql)
はログ ファイルに記録されず、例外の痕跡もありません。
セッションデータベース テーブルは空のままです。
コールバックからのログ メッセージ_close
は常に存在します。
データベースに接続する方法は次のとおりです。
$db = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PHP 5.2.10 を使用しています。
$GLOBALS['db']->exec($sql)
「手動で準備した」コンテンツで単純に実行しようとしまし$sql
たが、それでも黙って失敗しました。クエリ自体は問題なく、db コンソールから実行できました。
編集:
VolkerK が問題を特定した後、この奇妙な現象の背後にある理由を説明するこの記事を見つけました。ひょっとしたら、他の方にも参考になるかもしれません。
2回目の編集:
最も簡単な魔法の解決策は、以下の関数呼び出しをフロント コントローラー (メインの index.php) ファイルの最後に追加することです。
session_write_close();