如何在会话中存储用户id,以用于在网页中进行回显?PHP会话

如何在会话中存储用户id,以用于在网页中进行回显?PHP会话,php,html,mysql,session,userid,Php,Html,Mysql,Session,Userid,我有两个页面,分别是login.php和home.php。在这里login.php将设置用户ID和用户名会话。php将根据会话用户id呼出详细信息。我在存储用户id时遇到问题,它不会呼出详细信息。有什么解决办法吗 login.php session_start(); if(isset($_POST['loginbtn'])) { $username = preg_replace('#[^A-Za-z0-9]#i','',$_P

我有两个页面,分别是login.php和home.php。在这里login.php将设置用户ID和用户名会话。php将根据会话用户id呼出详细信息。我在存储用户id时遇到问题,它不会呼出详细信息。有什么解决办法吗

login.php

        session_start(); 
         if(isset($_POST['loginbtn']))
        {
         $username = preg_replace('#[^A-Za-z0-9]#i','',$_POST['username']); 
         $password =preg_replace('#[^A-Za-z0-9]#i','',$_POST['password']); 

    $pdo = new PDO('mysql:host=localhost;dbname=dbname','',''); 

    $sql = "SELECT teacher_id, username, password FROM teacher 
    WHERE username =:username and password =:password"; 

    $stmt = $pdo->prepare($sql); 

    $stmt->bindParam(":username", $_POST['username']); 
    $stmt->bindParam(":password", $_POST['password']); 
    $stmt->execute(); 

    if($result=$stmt->fetch(PDO::FETCH_OBJ))
    {
        $dbid = $row['teacher_id']; 
        $_SESSION['valid_teacherId'] = $dbid; 

        $dbuser = $row['username']; 
        $_SESSION['valid_username'] = $username; 

        $dbpass = $row['password']; 

        if ($password && $username)
        {
            header("location: home.php?teacher=" .$username);  
        } 
    else {
    echo "Please input username or password"; 
  }
        } 
    else{
        echo "Please insert a valid username or password"; 
    }
} else{
        header("location: index.php");  
}
 ?> 
home.php

 <?php
 error_reporting(E_ALL ^ E_NOTICE); 
 session_start();
 $userid = $_SESSION['valid_teacherId']; 
 $username = $_SESSION['valid_username']; 
 ?>

<?php
$con=mysqli_connect("localhost", "username", "", "dbname");
 if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

  $result = mysqli_query ($con,"SELECT * FROM classroom WHERE teacher_id = $userid");

 echo '<table class="table" border="2">
 <tr>
   <th>Year</th>
   <th>Class no</th>
   <th>Section</th>
    </tr>';

    while($row = mysqli_fetch_array($result))

     {
     echo "<tr>
       <td>" . $row['year'] . "</td>
      <td>" . $row['class_no'] . "</td>
     <td>" . $row['section'] . "</td>
      </tr>";
    }
      echo "</table>";
       ?>

这是您的问题-

if($result=$stmt->fetch(PDO::FETCH_OBJ)) // requesting $result
    {
        $dbid = $row['teacher_id'];  // using $row
        $_SESSION['valid_teacherId'] = $dbid; 

        $dbuser = $row['username']; // using $row
        $_SESSION['valid_username'] = $username; 

        $dbpass = $row['password']; // using $row
您需要将
$row
更改为
$result
,反之亦然,并且需要使用对象引用:

if($result=$stmt->fetch(PDO::FETCH_OBJ)) // requesting $result
        {
            $dbid = $row->teacher_id;  // using $row, note syntax change
            $_SESSION['valid_teacherId'] = $dbid; 

            $dbuser = $row->username; // using $row, note syntax change
            $_SESSION['valid_username'] = $username; 

            $dbpass = $row->password; // using $row, note syntax change

您正在将空值赋值给
$dbid
$dbuser
没有包含从数据库提取的数据的
$row
对象:

if($result=$stmt->fetch(PDO::FETCH_OBJ)){
    $dbid = $result->teacher_id; 
    $_SESSION['valid_teacherId'] = $dbid; 
    $dbuser = $result->username; 
    $_SESSION['valid_username'] = $username; 
    $dbpass = $result->password; 
    if (isset($password) && isset($username)) header("location: home.php?teacher=" .$username);  
}else
    echo "Please input username or password"; 
然后在
home.php
脚本中,您应该检查会话是否通过使用isset进行了实际设置

$userid = $_SESSION['valid_teacherId']; 
$username = $_SESSION['valid_username']; 

if (isset($userid) && isset($username)) {
    //continue
    //here
}else{
    //user is not logged in
    echo "Please login!";
}

$\u会话['username']
中存储
$\u POST['username']
?当然,您需要在希望使用会话数组的每个页面顶部使用
start\u session()
。@JayBlanchard,在主页还是登录页面?我在登录页面中使用了$\u SESSION['valid\u username']来设置会话。这是用户名,那么userid呢?
session\u start()
必须位于您希望能够识别会话的每个页面的顶部。您只是在删除用户名和密码中的无效字符?这真是个坏主意。为什么要将
我的密码
视为与
我的密码
相同?相反,你应该告诉用户他们的语法无效,这样他们就可以更正它,而不是依赖于他们一无所知的行为。@JayBlanchard,只是提醒你,我在所有页面中都有session_start(),但它仍然不起作用。我收到一个错误,说是致命错误:无法将stdClass类型的对象用作arrayUpdated,请立即检查,这是因为fetch()方法返回的是一个对象,而不是ArrayTanks Cristian。你真是太棒了。一句话,太棒了。