会话类(存储在表中)未按预期更新

时间:2018-02-04 00:04:35

标签: php mysql class session pdo

好吧,我完全期待有人过来告诉我,我错过了一些明显的东西,但我花了好几天试图弄清楚什么是错的,而且我在这一点上,如果有人可以指出一个愚蠢的错误,我很乐意解决这个问题。我刚刚开始弄清楚PDO,所以我猜这个问题就在那里,但我真的不知道。

这主要是有效的。它打开,关闭,读取和执行垃圾收集。它会写,但只有id,而不是数据。毁灭也不起作用,这似乎是相关的。如果我将echo放入函数中,则传递变量。我直接尝试时查询有效。似乎正在发生的事情是绑定不起作用。我已经尝试过bindParam和bindValue。我已经尝试了很多其他的东西,我甚至都无法列出它们。所以无论如何,这是班级:

class Sessions {
    private $id;
    private $data;
    protected $pdo;
    private $maxTime;
public function __construct(PDO $pdo) {
    $this->pdo = $pdo;
    // Set handler to overide SESSION
    @session_set_save_handler(
            array($this, "openSession"),
            array($this, "closeSession"),
            array($this, "readSession"),
            array($this, "writeSession"),
            array($this, "destroySession"),
            array($this, "gcSession")
        );
    session_start();
}

public function openSession() 
{
  // If successful
  if ($this->pdo) {
     return true;
  } else {
     return false;
  }
}

public function closeSession() {
  // Close the database connection
  if ($pdo = NULL) {
     @session_write_close();
     return true;
  } else {
     return false;
   }
}

public function readSession($id) {
  if (isset($id)) {
     // Set query
     $q = 'SELECT data FROM sessions WHERE id = :id';
     $stmt = $this->pdo -> prepare($q);
     // Bind the Id
     $stmt -> bindValue(':id', $id);
     $stmt -> execute();
     $r = $stmt -> fetch();
     // Return the data
     if (!empty($r['data'])) {
        return $r['data'];
     } else {
        // Return an empty string
        return '';
     }
  } else {
     return '';
  }
}

// when session started and updated
public function writeSession($id, $data) {    
   // Set query
   $q = "INSERT INTO sessions 
                    (id, `data`, startTime) 
            VALUES (:id, :data, NOW()) 
            ON DUPLICATE KEY UPDATE 
                `data` = :data2, 
                startTime = NOW()";  
   $stmt = $this->pdo->prepare($q);            
   // Bind data
   $stmt->bindParam(':id', $id);
   $stmt->bindParam(':data', $data);
   $stmt->bindParam(':data2', $data);
   $stmt->execute();

   if ($stmt->rowCount()) {
      return TRUE;
   } else {
      return FALSE;
   }
 }// when session started and updated

public function writeSession($id, $data) {    
   // Set query
   $q = "INSERT INTO sessions (id, `data`, startTime) VALUES (:id, :data, NOW()) ON DUPLICATE KEY UPDATE `data` = :data2, startTime = NOW()";  
   $stmt = $this->pdo -> prepare($q);            
   // Bind data
   $stmt->bindParam(':id', $id);
   $stmt->bindParam(':data', $data);
   $stmt->bindParam(':data2', $data);
   $stmt->execute();
   if ($stmt->rowCount()) {
     return TRUE;
  } else {
     return FALSE;
  }
}

public function destroySession($id) {
    echo $id;
    $q = "DELETE FROM `sessions` WHERE `id`= :id";
    $stmt = $this->pdo -> prepare($q);
    $stmt->execute(array(':id' => $id));
    // Attempt execution
    if ($stmt === true) {
        echo " worked ";
        return TRUE;
    } else {
        echo " no ";
        return FALSE;
    }
}

public function gcSession($maxTime) {
   $q="DELETE FROM sessions WHERE (NOW()-startTime > $maxTime)";
   $stmt = $this->pdo -> prepare($q);
   if ($stmt->execute()) {
      return TRUE;
   } else {
      return FALSE;
   }
}
}

正在以这种方式调用该函数:

     // Store the user in the session and redirect:
     $startSessions = new Sessions($pdo);
     $_SESSION['data'] = 'IDnotOK';
     $startSessions -> writeSession(session_id(), 'IDallOK');
     $startSessions -> gcSession(1800);

'IDnotOK'被发送到数据库(它的类型是'data | s:7:“IDnotOK”;'),而不是'IDallOK'。如果$ _SESSION ['data']不存在,则根本不发送任何内容。 id传递得很好。时间戳也更新得很好。我打电话的时候:

$startSessions -> destroySession(session_id());      

我如何尝试传递id并不重要,它将从函数内部回显,但不会对数据库条目做任何事情。垃圾收集工作(可能因为它只依赖于时间而不关心id)。 我希望我能列出我尝试过的所有内容,但我已经失去了轨道。如果还有其他问题有助于追踪问题,请询问。谢谢!

0 个答案:

没有答案