MySQLi Форма входа с PHP - Неустранимая ошибка: Uncaught Ошибка: вызов функции-члена close () на логическом - PullRequest
0 голосов
/ 25 ноября 2018

Это мой код, и я думаю, что проблема с $ stmt-> close (); , как говорится в ошибке.Но я не знаю, как это исправить.Я искал другие вопросы, но не могу найти ответ (по крайней мере, это не помогает мне, ответы все сбивают с толку :)) Не могли бы вы, ребята, помочь мне?

<?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: dash.php");
exit;
}

// Include config file
require_once "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 employees WHERE username = 
 ?";

    if($stmt = $mysqli->prepare($sql)){
        // Bind variables to the prepared statement as parameters
        $stmt->bind_param("s", $param_username);

        // Set parameters
        $param_username = $username;

        // Attempt to execute the prepared statement
        if($stmt->execute()){
            // Store result
            $stmt->store_result();

            // Check if username exists, if yes then verify password
            if($stmt->num_rows == 1){
                // Bind result variables
                $stmt->bind_result($id, $username, $hashed_password);
                if($stmt->fetch()){
                    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: dash.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
     $stmt->close();
   }

   // Close connection
    $mysqli->close();
}
 ?>

Вот что я получаю - img

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

$stmt->close() должно быть внутри if($stmt = $mysqli->prepare($sql)).Если это не удается, $stmt устанавливается на false, поэтому вы пытаетесь вызвать file->close(), что не имеет смысла.У вас также должен быть блок else, чтобы отобразить причину сбоя.

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

    if($stmt = $mysqli->prepare($sql)){
        // Bind variables to the prepared statement as parameters
        $stmt->bind_param("s", $param_username);

        // Set parameters
        $param_username = $username;

        // Attempt to execute the prepared statement
        if($stmt->execute()){
            // Store result
            $stmt->store_result();

            // Check if username exists, if yes then verify password
            if($stmt->num_rows == 1){
                // Bind result variables
                $stmt->bind_result($id, $username, $hashed_password);
                if($stmt->fetch()){
                    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: dash.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
        $stmt->close();
    } else {
        die($mysqli->error);
    }
}
0 голосов
/ 25 ноября 2018

Предполагая, что скобки выровнены ... Если это та строка, $stmt = $mysqli->prepare($sql) привела к тому, что $stmt будет ложным.Метод close не существует для логического значения.Ваш код ожидал объект оператора.

Итак, подготовка заявления пошла не так.Проверьте оператор на наличие синтаксических ошибок или неверных имен столбцов и таблиц и т. Д.

Следующие строки также должны быть соединены вместе:

// Bind variables to the prepared statement as parameters
$stmt->bind_param("s" $param_username); // Set parameters
$param_username = $username;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...