小さな個人プロジェクトの場合、クラス インスタンスを PHP セッションにアタッチする必要があります。そのために、次のコードを書きましたが、期待どおりに動作しません。たとえば、メソッドを呼び出してlogin
ページを更新すると、クラスで何も変更されません。つまり、毎回リセットされたようなものです。
私の質問は、PHP セッションを使用してページ間で Core インスタンスを共有するにはどうすればよいですか?
<?php
class Core
{
/* Database */
private $db = null;
/* User activity */
private $loggedin = false;
private $userid = 0;
private $username = null;
private $password = null;
private $lastActivity = null;
/* Constructor */
public function __construct()
{
$this->connect();
}
/* Serialize */
public function __sleep()
{
return array('loggedin', 'userid', 'username', 'password', 'lastActivity');
}
/* Unserialize */
public function __wakeup()
{
$this->connect();
}
/* Connect to database */
private function connect()
{
global $DB_HOSTNAME, $DB_BASENAME, $DB_USERNAME, $DB_PASSWORD;
try
{
$this->db = $db = new PDO('mysql:host='.$DB_HOSTNAME.';dbname='.$DB_BASENAME.';charset=utf8', $DB_USERNAME, $DB_PASSWORD);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
}
/* Get database */
public function getDb()
{
return $this->db;
}
/* Create a new login session */
public function login($userid, $username, $password)
{
$this->loggedin = true;
$this->userid = intval($userid);
$this->username = $username;
$this->password = $password;
$this->lastActivity = time();
}
/* Close the login session */
public function logout()
{
$this->loggedin = false;
$this->userid = 0;
$this->username = null;
$this->password = null;
}
/* Check if the session is running or not */
public function isConnected()
{
if ($this->loggedin)
{
if ($this->lastActivity + 3600 < time())
{
$this->logout();
return false;
}
elseif (isset($this->password))
{
$db = $this->db;
$query = $db->prepare('SELECT id FROM ptc_users WHERE id=:userid AND password=:password LIMIT 1;');
$query->bindParam(':userid', $this->userid, PDO::PARAM_INT);
$query->bindParam(':password', $this->password, PDO::PARAM_STR);
$query->execute();
if ($query->rowCount() == 1)
{
$this->lastActivity = time();
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
return false;
}
/* Return the current user id */
public function getUid()
{
return $this->userid;
}
/* Return the current username */
public function getUsername()
{
return $this->username;
}
/* Return the hash signature of the password */
public function hash($input)
{
return sha1('minad8rBxu' .$input. 'MigdVKXUCf');
}
/* Return the user's ip */
public function getIp()
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
else return $_SERVER['REMOTE_ADDR'];
}
}
// Create a new core session if not started before
if (!isset($_SESSION)) session_start();
if (!isset($_SESSION['core']))
{
$core = new Core();
$_SESSION['core'] = serialize($core);
}
else
{
$core = unserialize($_SESSION['core']);
}
?>
私は魔法の方法を使用しており__sleep
、__wakeup
PDO インスタンスをシリアル化することを避けています。
ご協力いただきありがとうございます。