0

我正在尝试使用 PHPMyAdmin 创建一个登录系统,但我似乎遇到了绑定函数的问题。它应该打印存储在我登录帐户的数据库中的记录,但我从 uwamp 收到此错误;警告:mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in Prepared statement in C:\UwAmp\www\Test\M2\Authentication.php on line 22 供参考,这是我的代码;

<?php
//Perameters needed to login to the database
$serverName= "localhost";
$DBUsername= "root";
$DBPassword= "root";
$DatabaseName="database 1";

//Connect to the database using the parameters
$conn = new mysqli($serverName, $DBUsername, $DBPassword, $DatabaseName);

//If there is a connection error, kill the connection and show said error.
if ($conn -> connect_error)
{
    die("Connection fail: " . $conn -> connect_error);
}

//Query the table
$paramUsername = $_POST['InputUsername'];
$paramPassword = $_POST['InputPassword'];

$Statement= $conn-> prepare("SELECT UserID, Name, Username, Password, PrivilegeLevel FROM users WHERE Username AND Password= ?");
$Statement -> bind_param('ss', $paramUsername, $paramPassword);
$Statement -> execute();
$Statement -> store_result();
$Statement -> bind_result($UserId, $UtBLName, $UtBLUsername, $UtBLPassword, $PrivLevel);
$Statement -> fetch();
$Statement -> close();


?>

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <div>
        Your user ID is: <?php echo $UserId; ?> <br>
        Your name is: <?php echo $UtBLName; ?> <br>
        Your username is: <?php echo $UtBLUsername; ?> <br>
        Your password is: <?php echo $UtBLPassword; ?> <br>
        Your privilege level is: <?php echo $PrivLevel; ?> <br>

    </div>
</body>
</html>

现在我在这个网站上环顾四周,发现一个线程说我应该更改绑定 bind_param 中的 S-es 的数量,所以我将它从 1 更改为 2,但它仍然给出相同的错误。有什么建议么?

4

1 回答 1

0

你的 SQL

Username AND Password= ?

语法不好。当您提供两个值时,它应该是:

Username = ? AND Password = ?

bind_param调用将X个变量放入SQL 中的 X 个变量中,因此变量的数量必须始终与查询中的数量匹配。??

所以:

$Statement= $conn-> prepare("SELECT UserID, Name, Username, Password, PrivilegeLevel FROM users WHERE Username = ? AND Password= ?");
// Two ? in the SQL mean two variables are required.
$Statement -> bind_param('ss', $paramUsername, $paramPassword);

安全

密码绝不应以明文形式存储在任何介质中。您可以使用高度鼓励的PHP 密码哈希机制轻松解决此问题。

$paramPassword = password_hash($_POST['InputPassword'],PASSWORD_DEFAULT);
于 2021-03-10T14:34:08.960 回答