mysqli_stmt_close() 期望参数 1 是 mysqli_stmt,布尔值

2021-12-25 00:00:00 php mysqli

这在大约 5 分钟前还在工作,但突然停止了.这是一个简单的登录表单,请看下面的代码

<!DOCTYPE html><html lang="zh-cn"><头><meta charset="UTF-8"><title>登录</title><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"><style type="text/css">正文{字体:14px sans-serif;}.wrapper{ 宽度:350px;填充:20px;}</风格><身体><div class="wrapper"><h2>登录</h2><p>请填写您的登录凭据.</p><form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"方法=发布"><div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>"><label>用户名</label><input type="text" name="username" class="form-control" value="<?php echo $username; ?>"><span class="help-block"><?php echo $username_err;?></span>

<div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>"><label>密码</label><input type="password" name="password" class="form-control"><span class="help-block"><?php echo $password_err;?></span>

<div class="form-group"><input type="submit" class="btn btn-primary" value="登录">

<p>还没有帐户?<a href="register.php">立即注册</a>.</p></表单>

我得到的错误是 Warning: mysqli_stmt_close() 期望参数 1 是 mysqli_stmt,布尔值在第 83 行的/opt/lampp/htdocs/magic/client/login.php 中给出

这在大约 5 分钟前还在工作,但突然停止了,不知道为什么.有什么想法吗?

当它工作时,它只是将用户重定向到welcome.php,现在它不是,并给我那个错误.代码取自 https://www.tutorialrepublic.com/php-tutorial/php-mysql-login-system.php

解决方案

看看你在问什么:

if($stmt = mysqli_prepare($link, $sql)){//[...]}mysqli_stmt_close($stmt);

您总是尝试关闭您的语句,即使它没有成功创建.您需要移动该关闭尝试:

if($stmt = mysqli_prepare($link, $sql)){//[...]mysqli_stmt_close($stmt);}

此外,您首先收到此错误的事实意味着您的 SQL 查询未能准备好,因此其中存在某种错误.您目前没有检查这一点,如果您想找出为什么您的代码不起作用,这可能会让您感到困难.我建议为此添加一个检查:

if($stmt = mysqli_prepare($link, $sql)){//[...]mysqli_stmt_close($stmt);} 别的 {回声查询有问题:".mysqli_error($link);}

请注意,在生产代码中,您不想直接输出 mysqli_error() ,因为它可能会显示有关您的数据库的信息,而这些信息不是任何人的业务而是您的业务,因此请仅在此期间执行此操作你正在调试.

this was working about 5 minutes ago and has suddently stopped. It is a simple login form, please see code below

<?php
// Initialize the session
session_start();

// Check if the user is already logged in, if yes then redirect him to welcome page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
    header("location: welcome.php");
    exit;
}

// Include config file
require_once "db/config.php";

// Define variables and initialize with empty values
$username = $password = "";
$username_err = $password_err = "";

// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){

    // Check if username is empty
    if(empty(trim($_POST["username"]))){
        $username_err = "Please enter username.";
    } else{
        $username = trim($_POST["username"]);
    }

    // Check if password is empty
    if(empty(trim($_POST["password"]))){
        $password_err = "Please enter your password.";
    } else{
        $password = trim($_POST["password"]);
    }

    // Validate credentials
    if(empty($username_err) && empty($password_err)){
        // Prepare a select statement
        $sql = "SELECT id, username, password FROM users WHERE username = ?";

        if($stmt = mysqli_prepare($link, $sql)){
            // Bind variables to the prepared statement as parameters
            mysqli_stmt_bind_param($stmt, "s", $param_username);

            // Set parameters
            $param_username = $username;

            // Attempt to execute the prepared statement
            if(mysqli_stmt_execute($stmt)){
                // Store result
                mysqli_stmt_store_result($stmt);

                // Check if username exists, if yes then verify password
                if(mysqli_stmt_num_rows($stmt) == 1){                    
                    // Bind result variables
                    mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
                    if(mysqli_stmt_fetch($stmt)){
                        if(password_verify($password, $hashed_password)){
                            // Password is correct, so start a new session
                            session_start();

                            // Store data in session variables
                            $_SESSION["loggedin"] = true;
                            $_SESSION["id"] = $id;
                            $_SESSION["username"] = $username;                            

                            // Redirect user to welcome page
                            header("location: welcome.php");
                        } else{
                            // Display an error message if password is not valid
                            $password_err = "The password you entered was not valid.";
                        }
                    }
                } else{
                    // Display an error message if username doesn't exist
                    $username_err = "No account found with that username.";
                }
            } else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }

        // Close statement
        mysqli_stmt_close($stmt);
    }

    // Close connection
    mysqli_close($link);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
    <style type="text/css">
        body{ font: 14px sans-serif; }
        .wrapper{ width: 350px; padding: 20px; }
    </style>
</head>
<body>
    <div class="wrapper">
        <h2>Login</h2>
        <p>Please fill in your credentials to login.</p>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
            <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
                <label>Username</label>
                <input type="text" name="username" class="form-control" value="<?php echo $username; ?>">
                <span class="help-block"><?php echo $username_err; ?></span>
            </div>    
            <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
                <label>Password</label>
                <input type="password" name="password" class="form-control">
                <span class="help-block"><?php echo $password_err; ?></span>
            </div>
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Login">
            </div>
            <p>Don't have an account? <a href="register.php">Sign up now</a>.</p>
        </form>
    </div>    
</body>
</html>

The error I get is Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in /opt/lampp/htdocs/magic/client/login.php on line 83

This was working about 5 minutes ago and has suddenly stopped and not sure why. Any ideas?

When it worked, it simply redirected the user to welcome.php and now it is not, and gives me that error. The code was taken of https://www.tutorialrepublic.com/php-tutorial/php-mysql-login-system.php

解决方案

Look at what you're asking:

if($stmt = mysqli_prepare($link, $sql)){
    // [...]
}

mysqli_stmt_close($stmt);

You always try to close your statement, even if it wasn't successfully created. You need to move that close attempt:

if($stmt = mysqli_prepare($link, $sql)){
    // [...]

    mysqli_stmt_close($stmt);
}

Additionally, the fact that you got this error in the first place means your SQL query failed to be prepared, so there's some kind of error in there. You are currently not checking for that, which can make life difficult for you if you want to figure out why your code isn't working. I recommend adding a check for that:

if($stmt = mysqli_prepare($link, $sql)){
    // [...]

    mysqli_stmt_close($stmt);
} else {
    echo "Something's wrong with the query: " . mysqli_error($link);
}

Note that in production code, you don't want to output the mysqli_error() directly since it may reveal information about your database that isn't anybody's business but yours, so only do this while you're debugging.

相关文章