为什么私有主页不是通过会话/登录变量私有的

用户4592091

用户输入有效的用户名/登录名后,我有一个登录页面可重定向到私人主页。我已通过会话变量将主页设置为私有-如果设置了会话变量(意味着用户已提交正确的登录信息),则该页面可见。如果未设置会话变量(!isset),则页面应为私有页面,并重定向回登录页面。但是,如果用户尚未登录,则主页不会显示为私有,而是直接进入登录页面。

登录页面PHP和HTML

<?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php"); 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$error_message= "";
$user_name = "";
$user_password= "";
$member_name="";
$member_id="";

if (isset($_POST['submit'])) {

    $user_name = $_POST['user'];
    $user_password= $_POST['pass'];



    // ADD QUERY TO CHECK IF USER/PASS COMBO IS CORRECT
    if(!empty($user_name) && !empty($user_password)) {

        $query = "SELECT * FROM employees WHERE username='$user_name' and password='$user_password'";

        $result = mysqli_query($dbc, $query)
            or die ('Error querying username/password request');

        if(mysqli_num_rows($result) == 1) {

            $_SESSION['member_name'] = $member_name;
            $_SESSION['member_id'] = $member_id;


            header("Location: /LESSON5/3%20-%20HOMEPAGE%20:%20WELCOME.php");
            exit;

        } // end if rows

        else {
            $error_message = "You were not able to log in";
        } // end else

        // Direct to other webpage

    } // end query

} // end isset
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
    <title>Login</title>
    <link type="text/css" rel="stylesheet" href="/LESSON5/5_Signup_CSS.css">

    </head>
    <body>
    <h1>Welcome to my website!</h1>
    <h2>Please login below.</h2>
    <h3>Don't have an account? <a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create one here.</a></h3>

    <div class="formFormat" >  
    <div  id="table1">
    <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
      <table id="cssTable">
        <tr>
            <td>Username:</td><td><input type="text" id="user" name="user" value="<?php echo $user_name;?>" /></td>
        </tr>
        <tr>
            <td>Password:</td><td><input type="text" id="pass" name="pass" value="<?php echo $user_password;?>"/></td>
        </tr>
          </table>

      </div>

      <div id="table2">

      <table> 
      <tr>
         <td><input type="submit" name="submit"/></td>
       </tr>
       <tr>
          <td id="createAccount"><a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create an account</a></td>
       </tr>
       <tr>
        <td><p><?php echo $error_message?></p></td>
       </tr>

      </table>
      </form>
      </div>
    </div> 

    <?php
      mysqli_close($dbc);
    if(isset($_SESSION['user']) && isset($_SESSION['pass'])) {

    echo "Sessions are set";

    }

    else { 
      echo "Not set.";
    }
    ?>

    </body>
    </html>

似乎会话变量$_SESSION['member_name'] = $member_name$_SESSION['member_id'] = $member_id在登录页面提交后未设置,我也不知道为什么。

在此,如果未设置会话变量(通过!isset),则主页应重定向到登录名,而不显示主页。在这里,这是不起作用的,这是因为未设置上述代码中的会话变量,并且主页未正确读取PHP脚本并使主页公开。

主页PHP

<?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php");

$member_name="";
$member_id="";

if(!isset($_SESSION['member_name']) && !isset($_SESSION['member_id'])) {

    header("Location: /LESSON5/1%20-%20LOGIN.php");
}

?>

我知道$_SESSION变量中有错误,但是我无法弄清楚差距在哪里。任何对此的投入将不胜感激。

韦德

您需要使用mysqli_fetch_assoc()从查询中获取结果

http://php.net/manual/en/mysqli-result.fetch-assoc.php

这是您的相同代码,只是添加了fetch_assoc()并将其分配给您的会话变量:

    <?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php"); 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$error_message= "";
$user_name = "";
$user_password= "";
$member_name="";
$member_id="";

if (isset($_POST['submit'])) {

    $user_name = $_POST['user'];
    $user_password= $_POST['pass'];



    // ADD QUERY TO CHECK IF USER/PASS COMBO IS CORRECT
    if(!empty($user_name) && !empty($user_password)) {

        $query = "SELECT * FROM employees WHERE username='$user_name' and password='$user_password'";

        $result = mysqli_query($dbc, $query)
            or die ('Error querying username/password request');

        if(mysqli_num_rows($result) == 1) {

            while ($row = mysqli_fetch_assoc($result)) {
                $_SESSION['member_name'] = $row['member_name'];
                $_SESSION['member_id'] = $row['member_id'];
            }

            header("Location: /LESSON5/3%20-%20HOMEPAGE%20:%20WELCOME.php");
            exit;

        } // end if rows

        else {
            $error_message = "You were not able to log in";
        } // end else

        // Direct to other webpage

    } // end query

} // end isset
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
    <title>Login</title>
    <link type="text/css" rel="stylesheet" href="/LESSON5/5_Signup_CSS.css">

    </head>
    <body>
    <h1>Welcome to my website!</h1>
    <h2>Please login below.</h2>
    <h3>Don't have an account? <a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create one here.</a></h3>

    <div class="formFormat" >  
    <div  id="table1">
    <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
      <table id="cssTable">
        <tr>
            <td>Username:</td><td><input type="text" id="user" name="user" value="<?php echo $user_name;?>" /></td>
        </tr>
        <tr>
            <td>Password:</td><td><input type="text" id="pass" name="pass" value="<?php echo $user_password;?>"/></td>
        </tr>
          </table>

      </div>

      <div id="table2">

      <table> 
      <tr>
         <td><input type="submit" name="submit"/></td>
       </tr>
       <tr>
          <td id="createAccount"><a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create an account</a></td>
       </tr>
       <tr>
        <td><p><?php echo $error_message?></p></td>
       </tr>

      </table>
      </form>
      </div>
    </div> 

    <?php
      mysqli_close($dbc);
    if(isset($_SESSION['user']) && isset($_SESSION['pass'])) {

    echo "Sessions are set";

    }

    else { 
      echo "Not set.";
    }
    ?>

    </body>
    </html>

您说没有设置member_name和member_id,这是因为运行查询时从未从数据库中获取它们的数据。您需要获取查询的assoc数组,并将其分配给会话。由于您没有执行此操作,因此使用了您在顶部定义的值为空的值:

$member_name="";
$member_id="";

这就是为什么它们为空的原因,因为它们为空。

我在您的工作中看到了其他事情。文件名中有空格(即%20),应将其替换为下划线。虽然它会起作用,但您自己却会引起将来的头痛。您的密码似乎是纯文本的。您应该使用20年前的加密密码(例如:bCrypt)。您确实不需要在代码中设置error_reporting或ini_set,应在您的服务器配置(即php.ini)中根据您的环境进行配置。您不应该使用通配符(即SELECT *),而是声明需要使用的列。

我还将在查询中添加一个LIMIT 1。如果您的帐户注册/注册代码存在缺陷,那么您将获得不止一个匹配用户的唯一方法。

可能会将恶意代码添加到页面,因为您是在不对用户名/密码进行回显的情况下将其回显到页面上。

您正在使用mysqli,这是一个很好的开始,但是您在查询中使用的是未经消毒的。使用来自用户的数据时,应首先使用准备好的语句或首先使用mysqli_real_escape_string()。仅使用mysqli并不能保护您。

总而言之,如果您使用Yii之类的框架,将为您省去很多麻烦-开箱即用密码完成登录和注册,同时使用bcrypt密码,以及使用该框架的其他数百种理由: )Yii只是我的最爱,但是任何框架都可以帮助任何程序员。我已经很久没有处理会话或登录/注册代码了...

添加表中的更多值以存储在会话中:

while ($row = mysqli_fetch_assoc($result)) {
    $_SESSION['member_name'] = $row['member_name'];
    $_SESSION['member_id'] = $row['member_id'];
    // add everything you want from your table
    $_SESSION['employeeId'] = $row['employeeId'];
    $_SESSION['anotherColumn'] = $row['anotherColumn'];
}

最终思想

看来您有点混乱。我认为您需要从头开始使用此php代码。查看数据库中的表,确保其尽可能整洁。列名是有意义的,等等。然后重新制作此php文件以进行登录。

您需要做的就是对用户进行身份验证。您无需在会话中存储有关用户的所有信息。PHP本身将在会话终止时终止会话(它们将关闭其浏览器,或者通过PHP的默认会话时间限制)。正确配置的服务器可以自行处理会话。因此,您要做的就是对它们进行身份验证,并将基本数据存储在会话中。

确认用户和密码后,只需将其用户ID存储在会话中即可。然后在每个页面的顶部具有一个函数,以获取其用户数据以在页面上使用:

function getUserData($id) {
    $query = "SELECT * FROM users WHERE id = $id LIMIT 1";
    $result = mysqli_query($dbc, $query);
    if ( $result ) {
        if(mysqli_num_rows($result) == 1) {
            $row = mysqli_fetch_assoc($result);
            return $row;
        }
    }
    return false;
}

$userData = getUserData($_SESSION['user_id']);
if ( ! $userData ) {
    die('Error: User data not found!');
}

// we have the user data for the rest of the page
echo "ID: $userData['id']";
echo "Username: $userData['username']";

仅举一个例子,我的代码中可能存在缺陷。.但是,我希望您明白这一点。在我的示例中,即时消息仅将用户的ID存储在会话中。然后,我的函数(在代码中的其他任何函数之前使用)将用户信息返回到数组中。然后,您可以在页面中的任何位置使用$ userData数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的IP地址是公开的而不是私有的?

来自分类Dev

为什么有些方法既不是私有的也不是公共的?

来自分类Dev

同步:为什么更希望锁定私有的最终静态对象而不是类的类对象?

来自分类Dev

为什么Power BI视觉效果的转换器方法是公开的而不是私有的?

来自分类Dev

为什么strong_parameters方法是私有的?

来自分类Dev

为什么可以通过这种方式访问私有变量时无法访问基类的私有字段

来自分类Dev

实例内的 Arraylist 不是私有的

来自分类Dev

为什么我不能在类/静态方法中使用私有的、内部的、文件私有的方法?

来自分类Dev

TS:类私有属性未定义但私有静态不是。为什么?

来自分类Dev

为什么可以通过引用从外部类访问私有变量?

来自分类Dev

为什么实例变量总是私有的,但是auto属性将它们设置为public?还是一样?

来自分类Dev

扩展类时为什么公开私有PHP变量

来自分类Dev

为什么可以导出私有类型的变量

来自分类Dev

JS模块模式-为什么不删除私有变量

来自分类Dev

为什么要在模型中使用私有变量?

来自分类Dev

为什么我的构造函数的“this”变量保持私有?

来自分类Dev

通过类级别访问私有变量。

来自分类Dev

Scala案例类的私有构造函数不是私有的

来自分类Dev

在PHP的派生类中,为什么分配给在基类上声明的私有变量不是错误?

来自分类Dev

在PHP的派生类中,为什么分配给在基类上声明的私有变量不是错误?

来自分类Dev

QJsonValue是私有的吗?

来自分类Dev

getExternalFilesDir()是私有的吗?

来自分类Dev

Heroku:显示隐私错误“您的连接不是私有的”

来自分类Dev

硒相互作用:您的连接不是私有的

来自分类Dev

Chrome显示错误“您的连接不是私有的”

来自分类Dev

HTML链接无效。输出“您的连接不是私有的”

来自分类Dev

如何解决“您的连接不是私有的”?

来自分类Dev

为什么不使用私有的无参数构造函数?

来自分类Dev

为什么LinkedList中的writeObject方法是私有的却从未被调用过?

Related 相关文章

  1. 1

    为什么我的IP地址是公开的而不是私有的?

  2. 2

    为什么有些方法既不是私有的也不是公共的?

  3. 3

    同步:为什么更希望锁定私有的最终静态对象而不是类的类对象?

  4. 4

    为什么Power BI视觉效果的转换器方法是公开的而不是私有的?

  5. 5

    为什么strong_parameters方法是私有的?

  6. 6

    为什么可以通过这种方式访问私有变量时无法访问基类的私有字段

  7. 7

    实例内的 Arraylist 不是私有的

  8. 8

    为什么我不能在类/静态方法中使用私有的、内部的、文件私有的方法?

  9. 9

    TS:类私有属性未定义但私有静态不是。为什么?

  10. 10

    为什么可以通过引用从外部类访问私有变量?

  11. 11

    为什么实例变量总是私有的,但是auto属性将它们设置为public?还是一样?

  12. 12

    扩展类时为什么公开私有PHP变量

  13. 13

    为什么可以导出私有类型的变量

  14. 14

    JS模块模式-为什么不删除私有变量

  15. 15

    为什么要在模型中使用私有变量?

  16. 16

    为什么我的构造函数的“this”变量保持私有?

  17. 17

    通过类级别访问私有变量。

  18. 18

    Scala案例类的私有构造函数不是私有的

  19. 19

    在PHP的派生类中,为什么分配给在基类上声明的私有变量不是错误?

  20. 20

    在PHP的派生类中,为什么分配给在基类上声明的私有变量不是错误?

  21. 21

    QJsonValue是私有的吗?

  22. 22

    getExternalFilesDir()是私有的吗?

  23. 23

    Heroku:显示隐私错误“您的连接不是私有的”

  24. 24

    硒相互作用:您的连接不是私有的

  25. 25

    Chrome显示错误“您的连接不是私有的”

  26. 26

    HTML链接无效。输出“您的连接不是私有的”

  27. 27

    如何解决“您的连接不是私有的”?

  28. 28

    为什么不使用私有的无参数构造函数?

  29. 29

    为什么LinkedList中的writeObject方法是私有的却从未被调用过?

热门标签

归档