【问题标题】:Global access to variable全局访问变量
【发布时间】:2012-10-11 16:39:38
【问题描述】:

用户登录后,我希望能够保存 userId 以供以后在应用程序中使用。我在应用程序中检索用户名的唯一位置是通过登录控制器从登录表单中。但是,我的应用程序中的结构是,从登录控制器传递给我的主控制器的唯一内容是 HTML。

当然,我可以将 userId 包含在传回主控制器的 HTML 内的隐藏字段中,但这似乎太老套了。

那么,有没有一种方法可以保存一个值(在这种情况下是用户名),以便可以从其他类/命名空间/函数访问它?我已经阅读了一些关于“全局”的信息,但还没有设法让它在我的应用程序中工作。

来自 LoginController.php:

if ($loginView->TriedToLogin()){
    $loginUsername = $loginView->GetUserName();   //Retrieved from form
    $loginPassword = $loginView->GetPassword();
}

【问题讨论】:

  • 尤其是在使用框架时,您的问题听起来像是您正在尝试做一些您根本不应该做的讨厌的事情。
  • 你用的是什么框架?这样您就可以访问这些信息了。
  • 自制MVC,所以根本没有框架。

标签: php global-variables


【解决方案1】:

如果只是您要存储的用户名,我会选择$_SESSION[]

它在(共享)托管环境中不是最安全的,但在使用存储数据的页面上调用session_start(); 非常容易。

【讨论】:

  • 您能否详细说明在使用会话时托管环境如何影响安全性?
  • @nickb 当然。会话通常保存到所有托管帐户的公共文件夹中 - 每个人都可以访问它,授予他们“猜测” session_id。因此,请确保您从不存储密码、个人信息等。用户名或电子邮件、头发颜色等都可以。(为什么不只是 id 并在需要时检索所需的内容?):)
  • 如果是这种情况,那么你有一个糟糕的系统管理员,他不知道他们在做什么——在我自己的服务器上,在我的共享托管环境中,以及在我使用过的每个共享托管环境中,我的会话存储在我的域文件系统的根目录中(当然,在公共根目录之外),只有我(和管理员)可以访问。它不会在所有用户之间共享。
  • 现在你让我比较了我的不同主机......从关于该主题的搜索结果来看,这似乎是一个较老的问题。无论如何,共享廉价主机的客户大多从不关心安全性。谢谢你让我把事情弄清楚!
【解决方案2】:

登录后,您需要将用户令牌存储在会话中。

见:http://au1.php.net/manual/en/features.sessions.php

登录时存储用户:

$_SESSION['user_id'] = 32; // fetch from your user provider

然后您可以编写一个类/函数,利用会话检查他们的登录状态并在需要时获取他们的详细信息。

像这样:

function getUserId()
{
    return isset($_SESSION['user_id']) ? $_SESSION['user_id'] : false;
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']);
}

然后在您的应用程序中的任何位置使用:

echo isLoggedIn() ? getUserId() : 'Anonymous';

此外,有关如何构建 MVC 框架的详细信息,请查看“Create your own framework... on top of the Symfony2 Components”。

【讨论】:

    【解决方案3】:

    会话怎么样?

    PHP 中的会话支持包括一种保存某些数据的方法 跨越后续访问。

    http://de2.php.net/manual/en/features.sessions.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多