Php Mysqli准备的声明不是wokring

Php Mysqli准备的声明不是wokring,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个if语句,用于登录页面 我一直在尝试将其转换为mysqli编写的语句。它以前只是普通的mysqli 问题是,无论我输入什么id,它总是说无效id!而不是切换到正确的页面 if (isset($_POST['login'])) { require "connect.php"; session_start(); if (count($_POST) > 0) { if ($stmt = mysqli_prepare($conn, "SELECT id, Login_I

我有一个if语句,用于登录页面

我一直在尝试将其转换为mysqli编写的语句。它以前只是普通的mysqli

问题是,无论我输入什么id,它总是说无效id!而不是切换到正确的页面

if (isset($_POST['login']))
{
require "connect.php";

session_start();

if (count($_POST) > 0)
    {
    if ($stmt = mysqli_prepare($conn, "SELECT id, Login_ID, Name, User_Role_ID FROM user WHERE Login_ID = ?"));

    $lid = $_POST["id"];

    $stmt->bind_param("i", $lid);

    $stmt->execute();

    $stmt->bind_result($id, $Login_ID, $Name, $User_Role_ID);

        $_SESSION["Student_DB_ID"] = $id;
        $_SESSION["Login_ID"] = $Login_ID;
        $_SESSION["Name"] = $Name;
        $_SESSION["User_Role_ID"] = $User_Role_ID;

        switch ($User_Role_ID)
            {
        case "2":
            header("Location: ../views/student/");
            break; //Student
        case "1":
            header("Location: ../views/admin/");
            break; //Admin
        default:
                echo "Invalid ID!"; 
            } 

/* close statement */
$stmt->close();
$conn->close();

    }
}

您需要阅读mysqli_stmt_fetch()函数()的文档。该函数仅根据查询是否成功完成返回布尔值。您需要使用bind_result()返回值

编辑:

根据下面的注释,这段代码应该可以工作,您还删除了fetch()调用,这仍然是必需的:

if (isset($_POST['login'])) {
    require "connect.php";

    session_start();

    if (count($_POST) > 0) {
        if ($stmt = mysqli_prepare($conn, "SELECT id, Login_ID, Name, User_Role_ID FROM user WHERE Login_ID = ?")) {
            $lid = $_POST["id"];

            $stmt->bind_param("i", $lid);
            $stmt->execute();
            $stmt->bind_result($id, $Login_ID, $Name, $User_Role_ID);
            $stmt->fetch();

            $_SESSION["Student_DB_ID"] = $id;
            $_SESSION["Login_ID"] = $Login_ID;
            $_SESSION["Name"] = $Name;
            $_SESSION["User_Role_ID"] = $User_Role_ID;

            switch ($User_Role_ID) {
                case "2":
                    header("Location: ../views/student/");
                    break; //Student
                case "1":
                    header("Location: ../views/admin/");
                    break; //Admin
                default:
                    echo "Invalid ID!"; 
            }

            /* close statement */
            $stmt->close();
            $conn->close();
        }
    }
}

您需要阅读mysqli_stmt_fetch()函数()的文档。该函数仅根据查询是否成功完成返回布尔值。您需要使用bind_result()返回值

编辑:

根据下面的注释,这段代码应该可以工作,您还删除了fetch()调用,这仍然是必需的:

if (isset($_POST['login'])) {
    require "connect.php";

    session_start();

    if (count($_POST) > 0) {
        if ($stmt = mysqli_prepare($conn, "SELECT id, Login_ID, Name, User_Role_ID FROM user WHERE Login_ID = ?")) {
            $lid = $_POST["id"];

            $stmt->bind_param("i", $lid);
            $stmt->execute();
            $stmt->bind_result($id, $Login_ID, $Name, $User_Role_ID);
            $stmt->fetch();

            $_SESSION["Student_DB_ID"] = $id;
            $_SESSION["Login_ID"] = $Login_ID;
            $_SESSION["Name"] = $Name;
            $_SESSION["User_Role_ID"] = $User_Role_ID;

            switch ($User_Role_ID) {
                case "2":
                    header("Location: ../views/student/");
                    break; //Student
                case "1":
                    header("Location: ../views/admin/");
                    break; //Admin
                default:
                    echo "Invalid ID!"; 
            }

            /* close statement */
            $stmt->close();
            $conn->close();
        }
    }
}

因为您的stmt不是数组。您应该在变量中捕获结果集,然后检查if condition.com,因为stmt不是数组。您应该在变量中捕获结果集,然后检查if条件。抱歉,我的错误,那么$stmt将不是数组,它将是整数,因为您正在从数据库返回一个“id”列。Iv更新了我的代码。if语句已被删除,默认情况下替换为else。但它仍然只显示无效的id。编辑答案,现在应该适合您。您还删除了fetch()调用,这仍然是必需的。我还可以补充一点,那些会话值将很容易被任何有一点点网络知识的人编辑(取决于您存储会话的位置)。我建议建立一个这样的系统只是为了教育目的,而不是将它部署到一个实时网站上。这是为了教育目的。您建议如何存储会话值(当前仅存储在浏览器中)。很抱歉,我的错误是,$stmt将不是数组,它将是整数,因为您正在从数据库返回一个“id”列。Iv更新了我的代码。if语句已被删除,默认情况下替换为else。但它仍然只显示无效的id。编辑答案,现在应该适合您。您还删除了fetch()调用,这仍然是必需的。我还可以补充一点,那些会话值将很容易被任何有一点点网络知识的人编辑(取决于您存储会话的位置)。我建议建立一个这样的系统只是为了教育目的,而不是将它部署到一个实时网站上。这是为了教育目的。建议如何存储会话值(当前仅存储在浏览器中)。