我有这段代码
$con = new mysqli('####', '####', '####', '####');
if(mysqli_connect_errno()){
echo 'Connection Failed:' . mysqli_connect_errno();
exit();
}
//Variables
$user = $_POST['username'];
$zone = $_POST['password'];
$pass = strtoupper(hash("whirlpool", $zone));
//Prepare
if($stmt = $con -> prepare("SELECT * FROM `accounts` WHERE Username=? AND Key=?")){
$stmt -> bind_param("ss", $user, $pass);
$stmt -> execute();
$stmt -> bind_results($result);
$stmt -> fetch();
if($result) {
$_SESSION['username'] = $user;
$url = 'home.php';
echo '<META HTTP-EQUIV=Refresh CONTENT="1; URL='.$url.'">';
} else {
echo 'Login Failed';
}
}
?>
我是准备好的陈述的新手,我无法让它发挥作用。 在尝试登录时,我只得到一个没有错误的空白页面。我知道我已连接到数据库,因为如果我删除准备好的语句并以不安全的方式执行,所有内容都可以正常登录。
请注意。我刚刚查阅了有关预准备语句的教程,因此我可以学习更安全的代码。我绝不是这方面的专业人士。任何提示将不胜感激。
答案 0 :(得分:1)
警告:mysqli_stmt :: bind_result():绑定变量的数量不包含 匹配预备语句中的字段数 C:\ XAMPP \ htdocs中\ newsystem \ loginadd.php
这是因为您选择*
(所有字段)。您应该更加具体地了解您想要获得的字段(例如SELECT id FROM ...
)
查看examples on PHP doc:选择了2个字段,bind_result()
有2个参数。
答案 1 :(得分:0)
根据@AbrikChakraborty评论,您只需要在字段名称中添加反引号:
if($stmt = $con -> prepare("SELECT * FROM `accounts` WHERE Username=? AND `Key`=?")){
并根据@caCtus评论:
$stmt -> bind_result($result);
如果你真的想要绑定未知数量的字段,可以检查this answer或只使用PDO。
答案 2 :(得分:-1)
如果获取结果,请验证实际查询。我怀疑查询本身会返回空结果。
"SELECT * FROM `accounts` WHERE Username=$user AND Key=$pass"