どこかで、何かが原因で空のセッションがデータベースに書き込まれています。
最近、Zend/Db を使用するように変更を実装しましたが、問題が発生したのはこの後です。
ここに私の読み取り機能があります
public function read($sessionId)
{
$sql = new Sql($this->database);
$predicate = new Where();
$query = $sql->select();
$query->from('sessions');
$query->columns(array('sessiondata'));
$query->where($predicate->equalTo('sessionid', $sessionId));
$query->where($predicate->greaterThan('expiry', new Expression("NOW()")));
/**
* @var $stmt \Zend\Db\Adapter\Driver\StatementInterface;
*/
$stmt = $sql->prepareStatementForSqlObject($query);
$result = $stmt->execute();
if ($result instanceof ResultInterface && $result->isQueryResult() && $result->getAffectedRows() > 0) {
$resultSet = new ResultSet;
$resultSet->initialize($result);
$data = $resultSet->toArray();
return $data[0]['sessiondata'];
} else {
echo "read_fail";
return false;
}
}
そして私の書き込み機能
public function write($sessionId, $sessionData)
{
$expiry = date("Y-m-d H:i:s", time() + CATALINA_MAX_SESSION_TIME - 1);
$sql = new Sql($this->database);
$query = $sql->select()
->from('sessions')
->columns(
array(
'sessionid'
)
)
->where(
array(
'sessionid' => $sessionId
)
);
/**
* @var $stmt \Zend\Db\Adapter\Driver\StatementInterface;
*/
$stmt = $sql->prepareStatementForSqlObject($query);
$result = $stmt->execute();
$sql = new Sql($this->database);
if ($result->count() > 0) {
$query = $sql->update('sessions')
->set(array(
'expiry' => new Expression("NOW() + interval 1 hour"),
'touch' => new Expression("NOW()"),
'sessiondata' => $sessionData
)
)
->where(array('sessionid' => $sessionId));
} else {
$query = $sql->insert()
->into('sessions')
->columns(
array(
'sessionid',
'expiry',
'sessiondata'
)
)
->values(
array(
'sessionid' => $sessionId,
'expiry' => $expiry,
'sessiondata'=> $sessionData
)
);
}
$stmt = $sql->prepareStatementForSqlObject($query);
$result = $stmt->execute();
}
空のセッションがデータベース内のアクティブなセッションを上書きする原因となっている何かが欠けていますか?
ありがとう