>我正在为SessionHandlerInterface类使用以下编写方法:
public function write($session_id, $session_data) {
$sth = DBCxn::get()->prepare("UPDATE sessions SET session_data = ?, last_update = NOW() WHERE session_id = ?");
$sth->execute(array($session_data, $session_id));
if ($sth->rowCount() == 0) {
$sth = DBCxn::get()->prepare("INSERT INTO sessions (session_id, session_data, last_update) VALUES (?, ?, NOW())");
$sth->execute(array($session_id, $session_data));
}
问题是,如果更新查询的session_data
没有更改,rowCount()
将返回 0,反过来,该函数将尝试插入已存在的session_id
并返回错误。
我认为作为解决方案,可以进行选择查询以验证session_id
是否存在。
还有什么其他选择可以用来解决这个问题?
read()
在write()
之前(在会话开始时)被调用,并且您将在其中进行SELECT
查询。
因此,您已经知道是否应该执行INSERT
或UPDATE
- 只需将属性用作"行存在"标志,您将从read()
内部设置该标志,稍后可以在write()
中检查。