我对PHP很新。在整个PHP应用程序中控制对类的访问的最佳方法是什么?在整个应用程序中需要访问这些类的最佳位置在哪里?例;我有一个在登录过程中创建的用户类,但每次页面发布时都会显示该对象已重新初始化。
我尝试设置属性IsLoggedIn,然后每次再次创建对象之前检查该变量,但这似乎不起作用。我也尝试在PHP中使用isSet函数来查看类变量是否已经存在
答案 0 :(得分:6)
你是对的,你的申请状态不会从请求转到请求。
与桌面应用程序相反,Web应用程序不会保持初始化状态,因为服务器每次都可以成为另一个访问者时,需要完全不同的东西。您知道谁在使用桌面应用程序,但您不一定知道谁在请求该页面。想象一下,10个用户在您的Web应用程序上同时执行不同的操作?您不会为每个访问者保持整个应用程序的运行。想象一下有10,000名访客......
有一些方法可以将某些数据从请求保留到请求。每次都会重新初始化应用程序,是的,但是您可以重新加载您正在执行的操作的状态。它始终围绕着相同的一般方法:
缓存; Cookie是一个保存在客户端的小文件,每个请求都可以提供哪些内容。在PHP中,可以使用$_COOKIE variable。在所有情况下,您可以serialize您的类实例并在之后重新加载它们。问题是,您不希望将敏感数据放在那里,因为任何(恶意)机构都可以看到并修改它。
POST或GET;在每个请求中,您都会在$_GET request(http://localhost/myscript.php?iamatstep=4之类的网址中传递状态。或者通过$_POST传递状态,例如在表单中使用隐藏的输入字段。此数据可以加密并且只对你有意义,但是,你仍然把敏感的数据反馈给客户,任何人都可以操纵它。
数据库,磁盘;或者服务器上的任何其他内容。同样,您在文件中序列化数据,例如在请求结束时准备好再次用于下一个请求。它的主要优点是它可以保留在您的服务器上。缺点是,此时,您不知道要为哪个请求提取哪些数据,因为您的应用程序可能同时有多个用户...
这就是$_SESSION的概念发挥作用的地方。它只是一种同时使用所有这些的打包方式。这并不像初学者经常感觉到的那样神奇。当您使用会话时,放入$ _SESSION的数据存储在服务器上的某个位置(通常是临时目录中的文件,尽管可以将其更改为其他类似数据库),并且会将唯一ID归因于此会话并传递在cookie中,将跟随访问者请求请求。因此,客户端唯一的问题是cookie中的大数字。在下一个请求中,浏览器告诉服务器上的PHP它的会话号为12345,如果存在,则加载相应的文件,然后再次提供数据。如果没有启用cookie,它可以通过GET或POST传递,但通常最好不要去那里(参见session.use_trans_sid's note)。
在每个页面上看起来都需要进行身份验证。
<?php
// verify if we have a current session
if (isset($_SESSION['login'])) {
// get data in current session
$username = $_SESSION['login']['username'];
$isLoggedIn = $_SESSION['login']['isLoggedIn'];
} else {
$username = '';
$isLoggedIn = false;
}
// take care of the unauthorized users
if (!$isLoggedIn) {
// maybe a redirection here...
}
// do the things a logged in users has the permission to do
要设置会话,它可能看起来像那样:
<?php
// handle the form post of your login page for example
if (isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// verify the username and password against a database
if ($everythingIsOkay) {
// we can consider this user logged in and create a session
$_SESSION['login']['username'] = $username;
$_SESSION['login']['isLoggedIn'] = true;
// and now maybe redirect the user to the correct page
}
}
// raise an error about an invalid login
最后,也许是一个logout.php页面会做类似的事情:
<?php
unset($_SESSION['login']);
// redirect the user to the login page
答案 1 :(得分:2)
这种数据必须存储在一个会话中,页面之间唯一存在的是Session数据(sessions / cookies / ...),因此不会继承类初始化。< / p>
您可以使用以下内容向会话添加用户用户名等信息:
$username //username from db
$name //name from db
$_SESSION['username'] = $username;
$_SESSION['name'] = $name;
或者如果您只想轻松访问有关用户的所有信息,请执行以下操作:
$_SESSION['user'] = mysql_fetch_assoc($result); //where $result is the response from the db to your login query
执行此操作后,$ _SESSION ['user']将成为一个数组,其中包含您从数据库中选择的所有详细信息。