2013-06-23 82 views
0

我已经查看了我的问题的现有答案。类不保留受保护的值

我的权利,通过过程中回显的价值和权利,直到在“标题(“位置”指令值保持不变。

我不认为这是一个序列化问题,建议类似问题...

下面是类的相关位:

class clsSetUser { 
    protected $UserID = 0; 

    public function initUser($id) { 
    // get user details from database 

    $this->setUserID($id); 
    // etc... 
    } 

    private function setUserID($value) { $this->UserID = $value; } 
    public function getUserID() { return $this->UserID; } 
} 

的common.php:

if(unset($clsUser)) $clsUser = new clsSetUser; 

登录-exec.php:

$clsUser->initUser($id); 

header("Location: somewhere.php"); 

somewhere.php:

echo $clsUser->getUserID(); 

// here it equals 0 

什么想法? “标题”序列化的一切?

回答

0

这是因为PHP实际上是从somewhere.php的干净石板开始的。

header("Location: somewhere.php");发送命令浏览器连接到不同的页面。在这个页面中,前一页的非变量在PHP中可用。

您需要设置$_SESSION中的userId,以便您可以在访问somewhere.php时从数据库中重新加载用户。

登录-exec.php

$clsUser->initUser($id); 
$_SESSION['user_id'] = $id; 
header("Location: somewhere.php"); 

somewhere.php

$clsUser->initUser($_SESSION['user_id']); 
+0

高炉 - 我曾希望避免使用$ _SESSION太多。每当我打开一个新页面时,不断点击数据库是不合逻辑的。感谢您的信息。 –

+0

为什么你想避免碰到用户对象的数据库? 如果用户/会话表得到正确索引,获取用户对象将不会花费任何时间。否则,您可以尝试将所需的用户信息存储在Cookie中,但随后将在每个请求中将数据传输到服务器。这可能会增加页面的加载时间。 – EWit

+0

这不仅仅是用户对象,它是数据库对象,以及不会改变和来自ini文件的各种值。这都是增加处理时间,应该只执行一次。我有一个非常大的应用程序,数百页。我曾希望构建一个完整的面向对象系统,但显然不是在PHP中,如果每次发出头文件指令时类都被破坏,我不能这样做...... –