制作登录表单,这是我第一次使用预准备语句。我的问题是num_rows保持返回0,尽管输入了与我的表的电子邮件和密码匹配的正确电子邮件和密码。我测试了连接是否正常,SQL语句也可以工作,只是num_rows总是为0。
PHP(没有php标签和连接代码):
$email = $_POST['email'];
$password = md5($_POST['password']);
if(!($stmt = $con->prepare("SELECT `email`, `password` FROM users WHERE `email` = ? AND `password` = ?")))
{
echo "Prepare failed: (" . $con->errno . ")" . $con->error;
}
else
{
echo " Query read \n";
$stmt->bind_param('ss', $email, $password);
$stmt->execute();
$stmt->store_result();
$num_of_rows = $stmt->num_rows;
$stmt->bind_result($email, $password);
echo $num_of_rows;
if($num_of_rows == 1) //To check if the row exists
{
echo "Exists";
if($stmt->fetch()) //fetching the contents of the row
{
echo "Exists";
$_SESSION['loggedin'] = true;
$_SESSION['message'] = "logged in";
$_SESSION['email'] = $email;
echo "Success!";
exit();
}
}
else
{
echo "Error";
}
}
希望我忘了什么,但无论哪种方式,我都难过。
提前致谢!
答案 0 :(得分:3)
num_rows
返回的值可能不是在检索到所有行之前返回的有效行数。这是mysqli_result
的情况。该文档显示,num_rows
的{{1}}函数应该在mysqli_stmt
之后立即可用。
似乎对行为最合理的解释是查询没有返回一行。
文档:
http://php.net/manual/en/mysqli-result.num-rows.php
http://php.net/manual/en/mysqli-stmt.num-rows.php
为什么我们需要使用store_result
?这似乎是很多不必要的混乱。我们可以做抓取。如果它返回TRUE,我们知道至少有一行返回。如果为FALSE,则返回零行。无需使用num_rows
。
如果我们要使用num_rows
,那么一旦我们完成结果集,就可以使用store_result
来表示一个好的模式
另外,不要将MD5用于密码哈希。并且不需要从数据库返回密码哈希,我们可以从SELECT列表中省略它。
https://security.stackexchange.com/questions/19906/is-md5-considered-insecure
答案 1 :(得分:0)
您还想获取结果,如下所示:
$stmt->bind_param('ss', $email, $password);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();
$num_of_rows = $stmt->num_rows;
$stmt->bind_result($email, $password);
echo $num_of_rows;
答案 2 :(得分:0)
如下所述,下面的my_num_rows和store_result适用于我。
$email = $_POST['email'];
$password = $_POST['password'];
$arr = array();
$stmt = $db->prepare("SELECT email, password FROM users where email = :email
and password = :password");
$stmt->bindParam(":email", $password);
$stmt->bindParam(":password", $password);
$stmt->execute();
$arr = $stmt->fetchAll();
if(!$arr) exit('No rows');
print_r($arr);
$stmt = null;