为什么是$ stmt - >登录存在时,num_rows返回0?

时间:2018-02-13 01:03:27

标签: php mysql prepared-statement mysql-num-rows

制作登录表单,这是我第一次使用预准备语句。我的问题是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";
        }
     }

希望我忘了什么,但无论哪种方式,我都难过。

提前致谢!

3 个答案:

答案 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;