-3

Can Anyone help me? I'm trying to implement privileges in a PHP login script that I found. I'm getting the following error when trying to bind the new variable $param_user_privilege:

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

This is the script:

<?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);
}
?>

I will appreciate any help.

Oscar Otero
  • 325
  • 3
  • 11

1 Answers1

1

You have one question mark in your statement, but you're trying to bind 2 variables:

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

Your code:

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

You most likely want something like this for your query:

SELECT username, password, user_privilege
FROM users
WHERE username = ? AND user_privilege = ?
Blue
  • 22,608
  • 7
  • 62
  • 92