0

小さな個人プロジェクトの場合、クラス インスタンスを 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__wakeupPDO インスタンスをシリアル化することを避けています。

ご協力いただきありがとうございます。

4

1 に答える 1

1

Core クラスをインスタンス化または自動ロードして、アプリケーション全体で使用できるようにします。セッションは必要ありません..または、クラス名をセッションに保存するだけです..

ユーザー名、タイムスタンプ、ユーザーID、パスワードをセッションに保存するだけです..

    $_SESSION['instance'] = json_encode(array('username', 'timestamp', 'userid','password'));

$object = json_decode($_SESSION['instance']);

echo var_dump($object);
于 2013-10-19T15:33:05.393 に答える