$_SESSION 变量只存储一些值

Posted

技术标签:

【中文标题】$_SESSION 变量只存储一些值【英文标题】:$_SESSION Variable Only Stores Some Values 【发布时间】:2018-03-31 05:44:15 【问题描述】:

我有一个名为 login.php 的登录页面,其中包含以下 php 代码:

  <?php
    session_start();
    include ('databaseconnect.php');

 if(isset($_POST['login']))
   $username = mysqli_real_escape_string($db, $_POST['username']);
   $password = mysqli_real_escape_string($db, $_POST['password']);

 $query = "select Username, Userid, user_type from Users
           where username = '$username'
           and password = '$password' LIMIT 1";
 $result = mysqli_query($db, $query);

 if (mysqli_num_rows($result) == 1) 
    $username = mysqli_fetch_assoc($result);
 if ($username ['user_type'] == 'owner') 
        $_SESSION['username'] = $username['Username'];    
        $_SESSION['userid'] = $userid['Userid'];          
        $_SESSION['user_type'] = $user_type['user_type']; 
        header('location:adminmain.php');
else
    $_SESSION['username'] = $username['Username'];       
    $_SESSION['userid'] = $userid['Userid'];             
    $_SESSION['user_type'] = $user_type['user_type'];    
    header('location:usermain.php');
      
     
    
   
  ?>

假设一个人的“用户名”、“用户名”和“用户类型”从他们登录时起就在 $_SESSION 中。当一个人登录时,会有一个名为 create_topic.php 的页面,其中包含以下代码:

    <?php
      include ('dataconnect.php');

      $sql1= "SELECT Categoryid, Categoryname, Categorydescription 
             FROM Categories"; 
      $result1 = mysqli_query($db,$sql1);

   if (!$result1)
      
     echo "No Category Found, Contact the administrator" </p>; 
      

   function getPosts()
   
    $posts = array();
    $posts[0] = $_POST['topic_subject'];
    $posts[1] = $_POST['topic_category'];
    $posts[2] = $_SESSION['username']; var_dump($_SESSION);
    return $posts;
    

   if (isset($_POST['createtopicbutton'])) 
      

   $data = getPosts();

   $sql2 = "INSERT INTO Topics(Topic_subject, Topic_category, Topic_by)          
              VALUES('$data[0]','$data[1]', '$data[2]')";

   $result2 = mysqli_query($db,$sql2);

   if ($result2)
    
       echo  "<p> Topic Successfully Created </p>";
  else
       echo "<p> Topic NOT! Successfully Created, Contact the administrator 
              </p>. mysqli_error($db); 
        
      
    ?>   

但是,当执行上述代码时,出现以下错误:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近第 1 行的“不正确的整数值:”列“Topic_by” VALUES('t' 在第 1 行。

所以我做了一个 var_dump 我发现了这个:

 array (size=3)
 'username' => string 'Owner1' (length=6)
 'userid' => null
 'user_type' => null. 

所以我特别要问的是如何存储“用户名”但“用户 ID”和“用户类型”在 login.php 页面上声明时为空。您的帮助和帮助将不胜感激。

【问题讨论】:

你的第一页有 session_start();而你的第二页没有。两者和所有使用 $_SESSION 的都需要 session_start(); 如果您使用 MySQLi,请使用prepared statements,因为您的查询容易受到 MySQL 注入的影响。此外,它可能会纠正您遇到的 SQL 错误。 请不要在数据库中以明文形式存储密码。请改用password_hash 和password_verify。 【参考方案1】:

你的变量不正确,试试:

 if (isset($_POST['login']))

    $username = mysqli_real_escape_string($db, $_POST['username']);
    $password = mysqli_real_escape_string($db, $_POST['password']);

    $query = "select Username, Userid, user_type from Users
           where username = '$username'
           and password = '$password' LIMIT 1";
    $result = mysqli_query($db, $query);

    if (mysqli_num_rows($result) == 1)
    
        $user = mysqli_fetch_assoc($result);
        if ($user ['user_type'] == 'owner')
        
            $_SESSION['username'] = $user['Username'];
            $_SESSION['userid'] = $user['Userid'];
            $_SESSION['user_type'] = $user['user_type'];
            header('location:adminmain.php');
         else
        
            $_SESSION['username'] = $user['Username'];
            $_SESSION['userid'] = $user['Userid'];
            $_SESSION['user_type'] = $user['user_type'];
            header('location:usermain.php');
        
    

仅定义了 $username$userid$user_type 未定义,user_typeuserid$username 的索引而不是单独的变量。所以,改用$user,这样会更易读。

警告!

Little Bobby 说 your script is at risk for SQL Injection Attacks. 了解 prepared 对 MySQLi 的声明。即使escaping the string 也不安全!

【讨论】:

嗨,它可以工作,但为什么它将“用户 ID”存储为字符串而不是整数,这是它在数据库中的定义方式,因为当我尝试输入数据时,我是收到此错误:'不正确的整数值:'Owner1' for column 'Topic_by' at row 1'。注意 Owner1 是用户名而不是用户 ID。 @electricslide58 只需使用(int)$user['Userid'];

以上是关于$_SESSION 变量只存储一些值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery AJAX $.post 存储 PHP $_SESSION 变量?

PHP SESSION 无法从 GET 表单变量中存储变量

PHP 在类函数中使用 $_SESSION 变量作为默认值

如何将会话值分配给变量

如果我在我的 PHP API 脚本中设置 $_SESSION 变量,它们是不是由 AFNetworking 2 自动存储

javascript中如何获取session里存储的list的值