スレッド表示 | フラット表示〕 全トピック 920 件中 31 番目 次≫ ≪前

セッション情報が上書きされる

created: 2009-03-02 18:33 | modified: 2009-03-04 00:52 | reply: 4

[4265] Re.セッション情報が上書きされる

user: ゆうじ | created: 2009-03-03 00:47
こんばんわ。

Win2000SP4、Apache2.0.63、PHP5.2.9、Mysql4.1.22 環境で
自作のセッションハンドラで再現するか試してみました。

sess1.php をリクエストすると
$_SESSION['test']を'テスト文字列'で初期化して
sess2.php にリダイレクトします。
sess2.php で $_SESSION['test'] を表示するものです。

このコードだと sess2.php で 'テスト文字列' が表示されてるので
リダイレクトそのものが原因とは考えにくいです。

セッションが保存されるタイミングに問題があるかもしれません。
リダイレクトの前に session_write_close() を
呼んでみるとどうでしょうか。

現象を再現できる最小限のコードを挙げてもらえれば
こちらでも試してみます。


mySession.php
<?php
/**
* Table `mysess`
*
CREATE TABLE `mysess` (
`sessid` varchar(50) NOT NULL default '',
`value` blob,
`time` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`sessid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/

/**
* mySession: Session handler
*/
class mySession
{
protected $db = null;
public $tableName = 'mysess';
public $keyName = 'sessid';

function __construct ()
{
$this->db = mysql_connect('localhost', 'username', 'password');
if (mysql_error() || !is_resource($this->db))
return;
mysql_select_db('mydbname', $this->db);
if (mysql_error($this->db))
return;
}

function open ( $save_path, $session_name )
{
if (is_resource($this->db))
return true;
else
return false;
}

function close ()
{
return true;
}

function read ( $sessid )
{
$lifetime = time() - 1800;
$sql = "select * from `".$this->tableName."`where `".$this->keyName."` = '".mysql_escape_string($sessid)."' and `time` > ".$lifetime;
$results = mysql_query($sql, $this->db);
if (mysql_error($this->db) || !is_resource($results) || !mysql_num_rows($results))
return '';
$record = mysql_fetch_assoc($results);
if (!isset($record['value']) || !strlen($record['value']))
return '';
return $record['value'];
}

function write ( $sessid, $value )
{
$time = time();
$sql = "replace into `".$this->tableName."` set `".$this->keyName."` = '".mysql_escape_string($sessid)."', `value` = '".mysql_escape_string($value)."', `time` = ".$time;
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else
return true;
}

function destroy ( $sessid )
{
$sql = "delete from `".$this->tableName."` where `".$this->keyName."` = '".mysql_escape_string($sessid)."'";
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else
return true;
}

function gc ( $maxlifetime )
{
$lifetime = time() - $maxlifetime;
$sql = "delete from `".$this->tableName."` where `time` < ".$lifetime;
mysql_query($sql, $this->db);
if (mysql_error($this->db))
return false;
else {
mysql_query("optimize table `".$this->table_name."`", $this->db);
return true;
}
}
}
?>


sess1.php
<?php
require_once 'mySession.php';

$sessHandler = new mySession;
session_set_save_handler (
array(&$sessHandler, 'open'),
array(&$sessHandler, 'close'),
array(&$sessHandler, 'read'),
array(&$sessHandler, 'write'),
array(&$sessHandler, 'destroy'),
array(&$sessHandler, 'gc')
);

session_start();

$_SESSION['test'] = 'テスト文字列';
header('Location: http://localhost/sess2.php');
exit();

?>


sess2.php
<?php
require_once 'mySession.php';

$sessHandler = new mySession;
session_set_save_handler (
array(&$sessHandler, 'open'),
array(&$sessHandler, 'close'),
array(&$sessHandler, 'read'),
array(&$sessHandler, 'write'),
array(&$sessHandler, 'destroy'),
array(&$sessHandler, 'gc')
);

session_start();

if (array_key_exists('test', $_SESSION)) {
echo $_SESSION['test'];
} else {
echo 'Empty session';
}
exit();

?>
Parent: 4264  reply: 4266 返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 31 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑