PHP会话不承认用户ID

Posted

技术标签:

【中文标题】PHP会话不承认用户ID【英文标题】:PHP sessions not acknowledging userID 【发布时间】:2015-05-27 01:34:58 【问题描述】:

我正在尝试进行 SQL 查询,如果用户 ID 与会话的用户 ID 和表的用户 ID 匹配,它只会从表中选择数据。

我的问题是它不承认与会话关联的用户 ID 变量并返回一个空白字符串。它也对 fName、lName 和密码执行此操作,但对其他用户(包括用户名和级别)不执行此操作,它从数据库中获取这些值并显示与会话关联的正确值。为什么某些列名在我的代码中有效,而其他列名无效?

我已尝试将用户 ID 回显,但当我回显用户名时,它会显示它。

<?php
    session_start();
    include "connection.php";
    if(!isset($_SESSION["username"]))
        header("Location: login.php");
    
    $userID = $_SESSION["userID"];
    $sql = ("SELECT * FROM users WHERE userID = '$userID'");
    $result = mysqli_query($con, $sql);

    if (mysqli_num_rows($result) > 0) 
       while($row = mysqli_fetch_assoc($result)) 
          echo "ID: " . $row["userID"]. ";
         
    
    else
         echo "No records";
    
?>

这只是我代码的一部分,我只是借用 W3Schools 的 if 语句来检查它们是否可以工作

adminPage.php

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

    if(isset($_SESSION["username"]))
        if($_SESSION["level"] != "admin")
            header("Location: users.php");
        
        else
            header("Location: adminPage.php");
        
    
?>

登录.php

<?php
    if (!isset($_SESSION["username"]))
        echo"
        <p class = \"big\"> Login </p>
        <hr>
        <form action = \"loginInsert.php\" method = \"post\">
            Username: <input type = \"text\" name = \"username\"><p>
        Password: <input type = \"password\" name = \"password\"><p>
        <button type = \"submit\" value = \"Submit\"/> Sign in </button>
        <hr>
        Not a member? <a href = \"signUp.php\"><button type = \"button\"> Sign Up </button></a>
        </p>
        </form>";
    
    else
        header("Location: admin.php");
               
?>

loginInsert.php

<?php
    session_start();
    include "connection.php";
    if(isset($_POST["username"]))
        $username = $_POST["username"];
    
    if(isset($_POST["password"]))
        $password = $_POST["password"];
    

    $sql = "SELECT * FROM users WHERE username = '$username' and password = '$password'";
    $result = mysqli_query($con, $sql);

    $row = mysqli_fetch_assoc($result);

    if(mysqli_num_rows($result) == 1)
        $_SESSION["username"] = $username;
        $_SESSION["level"] = $row ["level"];
        if ($_SESSION["level"] == "admin")
            header("Location: admin.php");
        
        else
            header("Location: users.php");
        
    
    else
    header("Location: login.php");
    
?>

感谢您花时间阅读我的问题

【问题讨论】:

您在何时何地分配$_SESSION["username"] & $_SESSION["userID"] SQL 注入,ahoy!清理您的输入。 那个查询应该最多能返回一行——那你为什么要使用 loop 来输出呢? @JayBlanchard 我是 php 新手,我必须分配这些吗?对不起,如果这是一个愚蠢的问题 @CBroe 因为 userID 什么都不返回所以什么都没有输出?它转到循环中的 else 并显示“无记录” 【参考方案1】:

编辑 3:请包含您的所有文件。 LIKE USER.PHP

我正在尝试进行 SQL 查询,如果用户 ID 与会话的用户 ID 和表的用户 ID 匹配,它只会从表中选择数据。

根据您的问题,我想知道您是否初始化了会话变量?请发布您的 login.php 文件。

我之前遇到过类似的问题,我的会话变量神秘地下降了。我推荐的一件大事是在所有页面上执行 session_start()。我相信您的问题要么是 (A) 您没有分配它,要么 (B) 您没有真的回忆数据库中的值。更可能是后者。

使用对象获取值。有这样的登录方式吗

$user = new user();
$_SESSION['UserName']=$_POST['UserName'];
$_SESSION['UserMail']=$_POST['UserMail'];

对于创建帐户,您只插入了值?如果是这样,您可能希望将其添加到您的 insertUser.php 文件或类似文件中,以便对象 $user 具有正确的值。

$user->setUserName($_POST['UserName']);
$user->setUserMail($_POST['UserMail']);

关于 cmets:@esqew 我可能是错的,但我认为 mysqli 会自动清理查询。您还应该使用 ->fetchAll();如果您使用的是循环。

编辑:对不起,我不能发表评论,因为没有足够的街头信誉,但我想强调 - 请确保您确切知道超全局变量的作用。 $_SESSION 每次启动会话时都会创建,并在结束时销毁。假设您在 insertUser.php 中创建了一个用户并说

$_SESSION['UserName']=$_POST['UserName'];

如果您只将它放在 insertUser 中,则 $_SESSION 变量在您登录时将不存在,除非您也将它放在 login.php 文件中。 $_SESSION 非常通用且可消耗,但您必须始终记住直接与数据库对话而不是与 PHP 对话。例如,这是我为我的网站写的:

        require_once "conn.php";
        $req=$dbh->prepare("SELECT * FROM users WHERE UserMail=:UserMail AND UserPassword=:UserPassword");//:thepassword
        $req->execute(array(
            'UserMail'=>$this->getUserMail(),
            'UserPassword'=>$this->getUserPassword()
            ));
        if($req->rowCount()==0)//None matched, 0 selected
            //header("Location: ../index.php?error=1");
            //echo "<script type='text/javascript'>alert('Incorrect Email or Password.');</script>";
            header("Location: ../index.php?error=1");</script>";
            return false;
        
        else
            while($data=$req->fetch())//Fetches closest row from table
                //PERSON ASKING QUESTION MAKE SURE YOU HAVE SOMETHING LIKE THIS
                $this->setUserId($data['UserId']);
                $this->setUserName($data['UserName']);
                $this->setUserPassword($data['UserPassword']);
                $this->setAge($data['Age']);
                $this->setUserMail($data['UserMail']);
                $this->setUserLocation($data['UserLocation']);
                header("Location: Home.php");
                return true;
            
        
    

编辑 3:请包含您的所有文件。 LIKE USER.PHP

【讨论】:

【参考方案2】:

我发现它不能正常工作,因为我没有正确设置会话变量。谢谢你的帮助:)

【讨论】:

以上是关于PHP会话不承认用户ID的主要内容,如果未能解决你的问题,请参考以下文章

php在会话中存储用户ID?

我对 PHP 会话的理解正确吗?

我的会话 ID 是在登录前生成的吗?

PHP 会话超时

创建一个具有唯一 ID 1 小时的会话 - PHP

会话攻击