Session_set_save_handler 没有写入数据库

Session_set_save_handler not writing to database

我目前正在学习 php 并尝试将会话数据写入我的数据库,但没有成功。 我有一个 Apache24、PHP 7 环境和 Postgresql 数据库的设置。 当我在另一个 PHP 文件中实例化 sessionhandling class ($sess = new sessionhandling) 时,没有任何内容写入数据库。但是,当我将变量传递给并调用写入函数($sess->write)时,数据被写入数据库。

(希望这不是提出的任何其他问题的重复。在 Whosebug 和 Google 上进行了大量搜索,但没有找到解决我的挑战的任何答案)

我的会话处理程序代码如下:

    <?php
    Include(dirname(__DIR__).'\Userstories\db\Connection.php');
    class sessionhandling extends Connecting implements SessionHandlerInterface {
        public function __construct(){

            // Set handler to overide SESSION

            session_set_save_handler(

                array(&$this, "open"),
                array(&$this, "close"),
                array(&$this, "read"),
                array(&$this, "write"),
                array(&$this, "destroy"),
                array(&$this, "gc")
                );

            register_shutdown_function('session_write_close');

            // Start the session
            session_start();
            session_write_close;

            }

        public function open($save_path, $id) {
            if(self::get()->connect()) {
                return true;
            } else {
                return false;
            }
        }

        public function close() {
            if(self::get()->connect()->pdo = Null) {
                return true;
            } else {
                return false;
            }
        }       

        public function read($id) {
            //$pdo = Connecting::get()->connect();
            $ipdo = self::get()->connect();
            $q_udata = "SELECT data FROM sessions WHERE id=:id";
            $stmt=$ipdo->prepare($q_udata);
            $stmt->bindvalue(':id', $id);
            $stmt->execute();

            if($stmt->execute()) {
                $row = $stmt->fetch(PDO::FETCH_ASSOC);
                $ipdo = NULL;
                return $row['data'];
            } else {
                $ipdo = NULL;
                return '';
            }

        }

        public function write($id, $data){
            $id = (string) $id;
            $data = (string) $data;
            $access = time();
            $ipdo = self::get()->connect();
            $c_id = "SELECT id FROM sessions WHERE id=:id";
            $stmt=$ipdo->prepare($c_id);
            $stmt->bindvalue(':id', $id);
            $stmt->execute();
            $idarray=$stmt->fetch(PDO::FETCH_ASSOC);
            $row_id = $idarray['id'];   

            if(empty($row_id)) {
                $sessionids = 'INSERT INTO sessions(id, data, access) VALUES(:id, :data, :access)';
                $stmt = $ipdo->prepare($sessionids);
                $stmt->bindvalue(':id', $id);
                $stmt->bindvalue(':access', $access);
                $stmt->bindvalue(':data', $data);
                $stmt->execute();
                session_write_close();
            } else {

                $rep_data = "UPDATE sessions SET data = :data, access = :access WHERE id = :id";
                $stmt=$ipdo->prepare($rep_data);
                $stmt->bindvalue(':id', $id);
                $stmt->bindvalue(':access', $access);
                $stmt->bindvalue(':data', $data);
                $stmt->execute();
                session_write_close();
            }

            if($stmt->execute()) {
                $ipdo = NULL;
                return true;
            } else {
                $ipdo = NULL;
                return false;
            }
        }

        public function destroy($id) {
            $ipdo = self::get()->connect();
            $del_data = "DELETE FROM sessions WHERE id =:id";
            $stmt = $ipdo->prepare($del_data);
            $stmt->bindvalue(':id', $id);
            $stmt->execute();
            if($stmt->execute()) {
                $ipdo = NULL;
                return true;
            } else {
                $ipdo = NULL;
                return false;
            }
        }

        public function gc($max) {
            $old = time() - $max;

             $ipdo = self::get()->connect();
             $cleanup = "DELETE * FROM sessions WHERE access < :old";
             $stmt = $ipdo->prepare($cleanup);
             $stmt->bindvalue(':old', $old);
             $stmt->execute();
             if($stmt->execute()) {
                $ipdo = NULL;
                return true;
            } else {
                $ipdo = NULL;
                return false;
            }
        }


    }

?>

当我删除“implements SessionHandlerInterface”会话处理 class 并从打开函数中删除参数 $save_path, $id 时,出现以下错误:"Warning: session_start(): Failed to read session data: user (path: ) in C:\Users\Public\Server\Apache24\htdocs\Userstories\sessionhandling.php on line 19"

在使用 DB 进行会话处理时是否需要定义 $save_path?如果是这样,$save_path 应该是多少?

非常感谢任何关于如何让我的会话处理程序写入数据库的建议。

我通过将读取函数更改为此并确保字符串 returned:

使 ut 工作
public function read($id) {
    //$pdo = Connecting::get()->connect();
    $ipdo = self::get()->connect();
    $q_udata = "SELECT data FROM sessions WHERE id=:id";
    $stmt=$ipdo->prepare($q_udata);
    $stmt->bindvalue(':id', $id);
    $stmt->execute();

    if($stmt->execute()) {
        $row = $stmt->fetch(\PDO::FETCH_ASSOC);
        $ipdo = NULL;
        $data = $row['data'];
        return (string) $data;
    } else {
        $ipdo = NULL;
        return '';
    }

}

我知道其他帖子已经指出了这一点,但我认为我的 $data = $row['data'] 首先会 return 一个字符串。