Реализация привилегий в сценарии входа в PHP - ошибка при попытке привязать новую переменную

Может кто-нибудь мне помочь? Я пытаюсь реализовать привилегии в найденном мной сценарии входа в систему PHP. Я получаю следующую ошибку при попытке привязать новую переменную $ param_user_privilege:

Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement

Это сценарий:

<?php
// Include config file
require_once 'conf/config.php';

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

// 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 username, password, user_privilege FROM users WHERE username = ? ";

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

            // Set parameters
            $param_username = $username;
            $param_user_privilege = $user_privilege;
            //$param_user_status = $user_status;

            // 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, $username, $hashed_password);
                    if (mysqli_stmt_fetch($stmt)){
                        if (password_verify($password, $hashed_password)){
                            /* Password is correct, so start a new session and
                            save the username to the session */
                            session_start();
                            $_SESSION['username'] = $username;
                            $_SESSION['privilege'] = $user_privilege;

                            if ($user_privilege = 'Admin') {
                                header("location: dashboard.php");
                            } else {
                                header("location: home.php");
                            }

                            //header("location: home.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);
}
?>

Буду признателен за любую помощь.

WHERE username = ? У вас есть только один заполнитель, но вы пытаетесь связать 2 значения.
Patrick Q 30.07.2018 17:38

У вас есть один? в запросе, но bindдва с ss.

u_mulder 30.07.2018 17:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем заявлении есть один вопросительный знак, но вы пытаетесь связать две переменные:

SELECT username, password, user_privilege FROM users WHERE username = ?

Ваш код:

mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_user_privilege);

Скорее всего, вы захотите что-то вроде этого для своего запроса:

SELECT username, password, user_privilege
FROM users
WHERE username = ? AND user_privilege = ?

Другие вопросы по теме