准备好的声明不起作用 - 空白页
Prepared Statement not working- Blank page
我有这个代码
$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';
}
}
?>
我是 Prepared statements 的新手,我无法让它工作。
尝试登录时,我只得到一个没有错误的空白页面。我知道我已连接到数据库,因为如果我删除准备好的语句并以不安全的方式执行它,一切都会正常登录。
请注意。我一直在查找有关准备好的语句的教程,以便我可以学习更安全地编码。我绝不是专业人士。任何提示将不胜感激。
根据@AbrikChakraborty 的评论,您只需在字段名称中添加反引号:
if($stmt = $con -> prepare("SELECT * FROM `accounts` WHERE Username=? AND `Key`=?")){
根据@caCtus 评论:
$stmt -> bind_result($result);
如果您真的想绑定未知数量的返回字段,您可以检查 this answer 或只使用 PDO。
验证实际查询是否获取结果。我怀疑查询本身 returns 空结果。
"SELECT * FROM `accounts` WHERE Username=$user AND Key=$pass"
Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't
match number of fields in prepared statement in
C:\xampp\htdocs\newsystem\loginadd.php
那是因为你 select *
(所有字段)。您应该更具体地说明要获取的字段(例如 SELECT id FROM ...
)。
看看 examples on PHP doc:select 编辑了 2 个字段,bind_result()
的 2 个参数。
我有这个代码
$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';
}
}
?>
我是 Prepared statements 的新手,我无法让它工作。 尝试登录时,我只得到一个没有错误的空白页面。我知道我已连接到数据库,因为如果我删除准备好的语句并以不安全的方式执行它,一切都会正常登录。
请注意。我一直在查找有关准备好的语句的教程,以便我可以学习更安全地编码。我绝不是专业人士。任何提示将不胜感激。
根据@AbrikChakraborty 的评论,您只需在字段名称中添加反引号:
if($stmt = $con -> prepare("SELECT * FROM `accounts` WHERE Username=? AND `Key`=?")){
根据@caCtus 评论:
$stmt -> bind_result($result);
如果您真的想绑定未知数量的返回字段,您可以检查 this answer 或只使用 PDO。
验证实际查询是否获取结果。我怀疑查询本身 returns 空结果。
"SELECT * FROM `accounts` WHERE Username=$user AND Key=$pass"
Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in C:\xampp\htdocs\newsystem\loginadd.php
那是因为你 select *
(所有字段)。您应该更具体地说明要获取的字段(例如 SELECT id FROM ...
)。
看看 examples on PHP doc:select 编辑了 2 个字段,bind_result()
的 2 个参数。