【问题标题】:$_SESSION Variable Only Stores Some Values$_SESSION 变量只存储一些值
【发布时间】: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_hashpassword_verify

标签: php html session mysqli


【解决方案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 Bobbyyour script is at risk for SQL Injection Attacks. 了解 preparedMySQLi 的声明。即使escaping the string 也不安全!

【讨论】:

  • 嗨,它可以工作,但为什么它将“用户 ID”存储为字符串而不是整数,这是它在数据库中的定义方式,因为当我尝试输入数据时,我是收到此错误:'不正确的整数值:'Owner1' for column 'Topic_by' at row 1'。注意 Owner1 是用户名而不是用户 ID。
  • @electricslide58 只需使用(int)$user['Userid'];
猜你喜欢
  • 2016-07-23
  • 2014-08-12
  • 1970-01-01
  • 2010-10-02
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
相关资源
最近更新 更多