繁体   English   中英

PHP会话未确认用户ID

[英]PHP sessions not acknowledging userID

我正在尝试做一个SQL查询,其中它仅在userID与会话和表的ID匹配时才从表中选择数据。

我的问题是,它不确认与会话相关联的userID变量,并返回空字符串。 它还对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");
        }
    }
?>

login.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");
    }
?>

在此处输入图片说明 感谢您抽出时间阅读我的问题

编辑3:请包括所有文件。 像USER.PHP

我正在尝试做一个SQL查询,其中它仅在userID与会话和表的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']);

关于评论:@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:请包括所有文件。 像USER.PHP

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM