MySQL's session handler difficulties


MySQL's session handler difficulties

观看MYSQL会话处理程序的在线教程,对这部分内容感到非常困惑:

table_XXX ==表XXX;col_XXX ==列XXX;sid ==会话id

阅读方法:

public function read($session_id)
    {
        $this->db->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
        $this->db->beginTransaction();
        /**
         * the data is selected and no other ppl can interfere
         * the writing process until COMMIT is reached
         */
        $sql = "SELECT $this->col_expiry, $this->col_data
                FROM $this->table_sess
                WHERE $this->col_sid = :sid FOR UPDATE";
        $selectStmt = $this->db->prepare($sql);
        $selectStmt->bindParam(':sid', $session_id);
        $selectStmt->execute();
        $results = $selectStmt->fetch('PDO::FETCH_ASSOC);
        if ($results) {
            if ($results[$this->col_expiry] < time()) {
                // return empty if data out of date
                return '';
            }
            return $results[$this->col_data];
        }
        return $this->initializeRecord($selectStmt);
    }
保护方法:

protected function initializeRecord('PDOStatement $selectStmt)
    {
        try {
            $sql = "INSERT INTO $this->table_sess 
                    ($this->col_sid, $this->col_expiry, $this->col_data)
                    VALUES (:sid, :expiry, :data)";
            $insertStmt = $this->db->prepare($sql);
            $insertStmt->bindParam(':sid', $session_id);
            $insertStmt->bindParam(':expiry', $this->expiry); // expiry is defined
            $insertStmt->bindValue(':data', '');
            $insertStmt->execute();
            return '';
        } catch('PDOException $e) {
            $this->db->rollBack();
            throw $e;
        }
    }

写方法:

public function write($session_id, $data)
    {
        try {
            $sql = "INSERT INTO $this->table_sess ($this->col_sid,
                    $this->col_expiry, $this->col_data)
                    VALUES (:sid, :expiry, :data)
                    ON DUPLICATE KEY UPDATE
                    $this->col_expiry = :expiry,
                    $this->col_data = :data";
            $stmt = $this->db->prepare($sql);
            $stmt->bindParam(':expiry', $this->expiry, 'PDO::PARAM_INT);
            $stmt->bindParam(':data', $data);
            $stmt->bindParam(':sid', $session_id);
            $stmt->execute();
            return true;
        } catch ('PDOException $e) {
            if ($this->db->inTransaction()) {
                $this->db->rollback();
            }
            throw $e;
        }
    }

在"受保护的方法",第8行,有一个$session_id,显然没有$session_id被传递到受保护的方法,所以bindParam()为该行简单地绑定什么?所以initializeRecord()只是初始化了一个行,有到期时间,但没有其他吗?然后sid和数据是在写入方法被调用后插入的?

这在WHERE $this->col_sid = :sid中做了很多字符串构造技巧,等等,因为它创建了SQL语句。

在执行->execute()之前,您可以尝试回显或转储这些SQL语句,以查看它们包含的内容。这将帮助你排除故障。

很明显你的保护方法缺少$session_id。有没有可能有一个$this->sid的值你可以在那里使用?