【问题标题】:PHP $_SESSION variable not saving across pagesPHP $_SESSION 变量不跨页面保存
【发布时间】:2018-04-02 01:16:52
【问题描述】:

一整天我都遇到了一些大问题。

我正在尝试保存一个 SESSION 变量,然后将其打印到另一个 PHP 文件中,但是该变量没有跨页面保存。我本质上是使用 SQL 制作登录系统,然后能够使用用户名作为 SESSION 变量查看用户详细信息。

我做了很多研究,似乎是我的重定向 URL 导致了这个问题。它必须是使用的真实 URL,而不是 HTTP,因为它不会传递 SESSION 变量。

我已经测试了该变量是通过直接打印到源 PHP 文件中来存储的,并且工作正常。它只是没有被转移,它返回一个空白数组。

我正在从 API 路由 PHP 文件调用我的方法。我不认为这会导致问题吗?

这是我的设置:

API PHP 文件:

app->post('/api/customer/login/{Username}/{PassW}', function(Request $request, Response $response){
    $Username = $request->getParam('Username');
    $PassW = $request->getParam('PassW');

    $PassW = md5($PassW);//FIND NEW WAY OF HASHING AS MD5 IS DEPRECIATED
    $sql = "SELECT * FROM login WHERE Username= '$Username' AND PassW='$PassW' LIMIT 1";

    try{
        $db = new db();
        $db = $db->connect();

        $stmt = $db->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if(count($result) == 1){
        session_start();      
        $_SESSION['Username'] = $Username;


       echo "<script type='text/javascript'>alert('Correct!');
       window.location.href='http://localhost/testing/yourprofile.php';
       </script>";
        exit();

测试会话变量已设置 PHP 文件:

<?php

session_start();
print_r($_SESSION); 
?>

我对这一切都很陌生,所以如果这对你们来说很简单,我很抱歉。

大爱。

【问题讨论】:

  • sesssion_start() 需要在文件的开头。也在 API PHP 文件中。或者至少在向浏览器输出任何内容之前。
  • 你用的是什么框架,我很好奇这个-&gt;post('/api/customer/login/{Username}/{PassW}
  • 它叫 Slim PHP 框架
  • 这就是我的想法,谢谢,我从未使用过它,但我以前见过它。这与我正在构建的框架相似。 AKA,它是事件驱动的。
  • 知道我的问题可能是什么吗?

标签: php html api session-variables


【解决方案1】:

我终于整理好了!

我需要先获取会话 ID。

希望这将有助于将来解决此问题的任何人

请看下面的解决方案:

PHP 第一页:

session_start();  
        $_SESSION['Username'] = $Username;
        header("Location: http://localhost/testing/yourprofile.php?PHPSESSID=".session_id());
        exit();

PHP 第二页(测试):

<?php
session_id($_GET['PHPSESSID']);
session_start();
print_r($_SESSION);
?>

感谢 Phoenix 整理我的其他问题! :)

【讨论】:

    【解决方案2】:

    我已尽我所能修复和清理您的代码。我不知道它是否能解决会话问题,但您应该早点调用 session_start。

    app->post('/api/customer/login/{Username}/{PassW}', function(Request $request, Response $response){
        session_start(); //<-- put this here or (just put in index.php)
        $Username = $request->getParam('Username');
        $PassW = $request->getParam('PassW');
    
        $sql = "SELECT * FROM login WHERE Username = :username";
    
        try{
            $db = new db();
            $db = $db->connect();
             ///prepare the query
            $stmt = $db->prepare($sql); 
             /// execute the query 
            $stmt->execute([':username'=>$Username]);   
            ///get the result, our usernames are unique in the DB
            //so there is no need to limit them or count
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            //result is an array or boolean false.
            if(!$result){
                //check the password
                if(password_verify($PassW, $result['PassW'])){ 
                    $_SESSION['Username'] = $Username;
                    //redirect, do not output ANYTHING before doing this
                    header('Location: http://localhost/testing/yourprofile.php');
                    exit();
    
                }
    

    注释/更新

    • 使用password_hash 对密码进行哈希处理(这几乎是当今的标准)

    • 使用准备好的语句,感谢您使用 PDO(这是我过去 4 年一直使用的)。我曾经使用 Mysqli,但我发现 PDO 更容易,并且具有更好的整体功能。所以你会看到我在哪里使用:username 作为命名占位符,而不是值,然后值进入具有相同键的数组中(我认为数据数组中的: 在某些设置打开的情况下是可选的,但我总是把它放进去),然后你执行它就可以了。

    • 数据库中的Username 字段应该是唯一索引。这样就不可能输入重复的用户名,数据库不会让你。这简化了我们需要在 PHP 中执行的操作,因为我们可以依赖它而无需检查太多东西。

    • 检查密码时,您可以使用password_verify。第一个参数是来自用户的传入密码。它不需要加密或任何东西。以这种方式设计的原因之一是您不应该将密码作为条件的一部分进行搜索。因为那时您依赖于数据库的不区分大小写的搜索来验证哈希值,而这并不是构建的目的。除此之外,使用 password_verify 的原因还有很多,但可以写一篇关于密码散列和比较的复杂性的完整文章。

    但我认为现在就足够了。

    【讨论】:

    • 非常感谢菲尼克斯,你不必为我做这件事。但谢谢你:')
    • 凤凰,我又来了。我已将代码更改为您的代码,并且现在在用户注册时对我的密码进行了哈希处理,但是 IF 语句没有触发。我的 else 声明说“登录不正确”...有什么想法吗?
    • 是的,我有$username,应该是$Username,抱歉,我会更新答案。变量区分大小写,就在这里$stmt-&gt;execute([':username'=&gt;$username]);
    猜你喜欢
    • 2021-11-07
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多