PHP $ _SESSION变量不跨页面保存

时间:2018-04-02 01:16:52

标签: php html api session-variables

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

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

我做了很多研究,似乎我的重定向网址导致了这个问题。它需要是一个不使用HTTP的实际URL,因为它不会带来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();

测试SESSION变量已设置PHP文件:

<?php

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

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

大爱。

2 个答案:

答案 0 :(得分:0)

我终于整理了它!

我需要先获取会话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对我的其他问题进行排序! :)

答案 1 :(得分:-1)

我尽力修复并清理代码。我不知道它是否会解决会话问题,但是你应该比你更早地调用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,但是可以写一篇关于密码学散列和比较的复杂性的完整帖子。

但我认为现在已经足够了。