未设置php的wierd行为
我正在开发一个电子商务网站,在这个网站上我需要在数据库中存储会话。我通过实现php本身提供的SessionHandlerInterface类实现了这一点。但是它工作得非常好,在数据库中存储了会话,并且正确地读取了会话 然而,当我使用unset来取消设置会话变量时,我面临着一个问题。有时它确实有效,有时则无效未设置php的wierd行为,php,session,Php,Session,我正在开发一个电子商务网站,在这个网站上我需要在数据库中存储会话。我通过实现php本身提供的SessionHandlerInterface类实现了这一点。但是它工作得非常好,在数据库中存储了会话,并且正确地读取了会话 然而,当我使用unset来取消设置会话变量时,我面临着一个问题。有时它确实有效,有时则无效 例如:如果我有一个名为ABCunset的会话变量,可能会将其从数据库中删除,也可能不会删除该变量 <?php //inc.session.php require_once 'Remot
例如:
如果我有一个名为ABC
unset
的会话变量,可能会将其从数据库中删除,也可能不会删除该变量
<?php
//inc.session.php
require_once 'RemoteAddress.php';
class SysSession implements SessionHandlerInterface
{
private $remote_write;
private $remote_read;
private $link;
private $ip_address_write;
private $ip_address_read;
public function open($savePath, $sessionName)
{
$link = new mysqli("localhost","root","","cakenbake");
if($link){
$this->link = $link;
return true;
}else{
return false;
}
}
public function close()
{
mysqli_close($this->link);
return true;
}
public function read($id)
{
$this->remote_read=new RemoteAddress();
$this->ip_address_read=$this->remote_read->getIpAddress();
$stmt=$this->link->prepare("SELECT `Session_Data`,`ip_address` FROM Session WHERE `Session_Id` = ? AND `Session_Expires` > '".date('Y-m-d H:i:s')."'");
$stmt->bind_param("s",$id);
$stmt->execute();
//$result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = '".$id."' AND Session_Expires > '".date('Y-m-d H:i:s')."'");
/*$result=$this->link->prepare("Some query inside")
* This shows up an error stating prepare method not found
*
*/
$res=$stmt->get_result();
if($row=$res->fetch_assoc()){
if($this->ip_address_read==$row['ip_address'])
return $row['Session_Data'];
else return "";
}else{
return "";
}
}
public function write($id, $data)
{
$this->remote_write=new RemoteAddress();
$this->ip_address_write=$this->remote_write->getIpAddress();
if(!empty($data))
{
$DateTime = date('Y-m-d H:i:s');
$NewDateTime = date('Y-m-d H:i:s',strtotime($DateTime.' + 1 hour'));
$stmt=$this->link->prepare("REPLACE INTO Session SET Session_Id = ?, Session_Expires = '".$NewDateTime."', Session_Data = '".$data."', ip_address = '".$this->ip_address_write."'");
$stmt->bind_param("s",$id);
// $result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = '".$id."', Session_Expires = '".$NewDateTime."', Session_Data = '".$data."'");
if($stmt->execute()){
return true;
}else{
return false;
}
}
}
public function destroy($id)
{
$stmt = $this->link->prepare("DELETE FROM Session WHERE Session_Id =?");
$stmt->bind_param("s",$id);
if($stmt->execute()){
return true;
}else{
return false;
}
}
public function gc($maxlifetime)
{
$result = $this->link->query("DELETE FROM Session WHERE ((UNIX_TIMESTAMP(Session_Expires) + ".$maxlifetime.") < UNIX_TIMESTAMP(NOW()))");
if($result){
return true;
}else{
return false;
}
}
}
$handler = new SysSession();
session_set_save_handler($handler, true);
?>
问题不在于取消设置
功能,而在于写入
功能。写入
功能负责对特定会话id进行任何更新
wierd behiviour不是unset,而是您实现的write函数
请参见!empty
约束检查数据是否为空。我可以猜测的是,在删除特定变量后,该特定id的数据库必须为空。因此,写操作尝试使用空值更新行,但由于该约束,它无法执行此操作
只需删除!空的
标签,它将像一个符咒一样工作 但是,当我使用unset来取消设置会话变量时,我面临着一个问题。有时它确实有效,有时则无效。
请显示您的unset()
代码,因为我在您的类中没有看到它。目前无法诊断您的问题。@MonkeyZeus没有定义unset函数。它是在PHP中预定义的,甚至SessionHandlerInterface
类只包含这6个要实现的函数。@Dilipchabaria您是说unset()
有时不起作用,但是您未能显示您在哪里使用了unset()
。请包括错误的MCVE。