Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未设置php的wierd行为_Php_Session - Fatal编程技术网

未设置php的wierd行为

未设置php的wierd行为,php,session,Php,Session,我正在开发一个电子商务网站,在这个网站上我需要在数据库中存储会话。我通过实现php本身提供的SessionHandlerInterface类实现了这一点。但是它工作得非常好,在数据库中存储了会话,并且正确地读取了会话 然而,当我使用unset来取消设置会话变量时,我面临着一个问题。有时它确实有效,有时则无效 例如:如果我有一个名为ABCunset的会话变量,可能会将其从数据库中删除,也可能不会删除该变量 <?php //inc.session.php require_once 'Remot

我正在开发一个电子商务网站,在这个网站上我需要在数据库中存储会话。我通过实现php本身提供的SessionHandlerInterface类实现了这一点。但是它工作得非常好,在数据库中存储了会话,并且正确地读取了会话

然而,当我使用unset来取消设置会话变量时,我面临着一个问题。有时它确实有效,有时则无效

例如:
如果我有一个名为
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。