AngularJS ngRoute 和 PHP $_SESSION 变量

Posted

技术标签:

【中文标题】AngularJS ngRoute 和 PHP $_SESSION 变量【英文标题】:AngularJS ngRoute and PHP $_SESSION variables 【发布时间】:2014-03-31 20:37:35 【问题描述】:

我有 3 页:

    index.php login.php display.php

index.php

使用 ngRoute 模块设置 AngularJS 来导航我的页面。

login.php

默认加载并设置 PHP $_SESSION 变量。

display.php

回显 $_SESSION 的内容。

我使用 ngRoute 的链接设置从 login.php 导航到 display.php。

问题

display.php 不显示 $_SESSION 变量,无论我导航多少次。只有当我手动导航到页面时才会显示它们,例如刷新页面或在浏览器中输入地址。

我知道 php 代码已执行,因为我可以将其他内容回显到屏幕上,它只是不访问 $_SESSION 变量。

这是为什么?

【问题讨论】:

我真的什么都不懂:(你为什么有3个php文件? AngularJS路由是单页链接,也就是说除了ajax调用外没有服务器交互。您需要进行 ajax 调用来请求 $_SESSION 变量 我会假设 ngRoute 确实会进行 ajax 调用,因为我在 display.php 中回显的任何其他内容都可以正常工作。所以一定是服务器交互。 基本上在任何 AngularJS 单页应用程序中,我无法让 PHP $_SESSION 变量工作,因为它们似乎需要您通过刷新加载页面以获取更新的变量值。在 AngularJS 中使用 $http 运行页面似乎与在浏览器中运行页面有所不同。 phpFiddle 目前处于关闭状态。我会在网站备份时添加一个 phpFiddle。 如果您确定发生了 ajax 调用,那么我建议您将其添加到请求中的 url:'path/to/display.php?'+Date.now();。可能是因为浏览器缓存而看不到会话。 【参考方案1】:

我想我可能会看到您的问题出在哪里。您尝试在单页 angularJS html 模板中访问 php 会话,对吗?喜欢:

<div ng-repeat="n in <?php $_SESSION['someSessionArray'] ?>">

这不是它的工作原理。您的 $_SESSION 将永远不会出现在您的模板中。 您可以做的是使用 ajax 请求进行登录身份验证,并让该请求为您提供会话 ID。 然后在进一步的 ajax 请求中启动会话时使用该会话 ID(如前所述)。

然后,当你想在 php 会话中存储一些东西时,通过 ajax 请求和 php 服务访问数据。

一个非常、非常、非常简单的例子: 在 getFromSession.php 中

session_start($_GET['session_id']);
$key = $_GET['key']
echo json_encode($_SESSION[$key]);

在 storeToSession.php 中

session_start($_GET['session_id']);
$key = $_GET['key'];
$value = $_GET['value'];
$_SESSION[$key] = $value;

在您的 login.php 中

$user = yourAuthMechanism($_GET['username'],$_GET['password']);
if($user) 
  session_start();
  echo json_decode(array('status' => 'success','sid' => session_id()));

else  ... error handling

在您需要访问会话数据的角度中的任何位置:

$promise = $http.get('pathtoyourphp/getFromSession.php?key=foo');
$http.set('pathtoyourphp/getFromSession.php?key=bar&value=4');
// now use promise to acces the data you got from your service

【讨论】:

谢谢,是的,模板似乎无法访问会话变量(但它们仍然执行 php?)。我现在运行 $http.get 来获取和设置我的会话变量,然后将它们分配给 $scope 以在我的应用程序中使用。我不必担心它总是使用同一个会话的会话 ID 内容。感谢您为我指明正确的方向。仍然不能 100% 确定为什么模板执行 php 文件与 ajax 调用不同。 @Craig 模板执行不同,因为它们是在您的第一次调用中呈现的。用户没有登录,会话刚刚创建(如果有的话),因此没有信息。通过 ajax 调用 login.php 后,您的模板不会再次在 php 中呈现,因为您没有重新加载页面。现在明白了吗?【参考方案2】:

一般来说,没有任何理由存在,为什么 AngularJS 应用程序要求 基于 PHP 的服务器端内容,将无法读取 $_SESSION。

也就是说,请至少提供您的 AngularJS 代码的核心概念,以便我们提供更多详细信息。

另外,将就这个放入display.php

<?

echo __FILE__
   . '<br />' . date( DATE_RFC822 )
   . '<br />' . var_dump( $_SESSION )
   ;

// intentionally skipped dangerous closing PHP-tag

现在运行您的 AngularJS 应用程序并告诉结果。

【讨论】:

【参考方案3】:

确保在读取 SESSION 变量之前启动会话。

<?php
    session_start();
    echo $_SESSION["user9"];
?>

【讨论】:

【参考方案4】:

我认为您不是在寻找 angularJS。 我认为您正在寻找类似的东西。

index.php:

<html>
    <header>
       <title>Login</title>
    </header>
    <body>
       <form method="POST" action="login.php">
           <input type="username" name="username" placeholder="username" />
           <input type="password" name="password" placeholder="password" />
           <input type="submit" value="Login" />
       </form>
    </body>
</html>

登录.php

<?php
   session_start();
   if(empty($_POST)) 
      die("You don't have permission to be here.");
    elseif(empty($_POST['username']) or empty($_POST['password'])) 
      die("All fields are required.");
   

   $username = "admin";
   $password = "password";

   if($_POST['password'] == $password && $_POST['username'] == $username) 
       $_SESSION['loggedIn'] == "true";
       header("Location: show.php");
    else 
       die("Invalid login");
   
?>

显示.php

 <?php
    if($_SESSION['loggedIn'] == "true") 
        echo "You are logged in";
     else 
        die("You don't have permission to be here.");
    
 ?>

【讨论】:

是的,当然可以,我正在尝试在使用 AngularJS 时使其正常工作。 AngularJS 允许你拥有一个单页应用程序。

以上是关于AngularJS ngRoute 和 PHP $_SESSION 变量的主要内容,如果未能解决你的问题,请参考以下文章

angularjs之插件ngRoute和ngAnimate

AngularJS:使用ngRoute路由时未加载组件控制器

摆脱 #!在 angularjs ngRoute [重复]

AngularJs练习Demo16 ngRoute

AngularJs练习Demo17 ngRoute

apache上带有html5mode(true)的angularjs ngroute失败