Mysqli预处理语句stmt_num_rows返回0

时间:2016-02-18 00:46:01

标签: php mysql mysqli prepared-statement

由于某种原因,stmt_num_rows总是最终为0.无论我使用正确的电子邮件和单词执行查询还是错误的查询。 这是代码:

    include_once './Connect.php';

$db = new DB_Connect(); 
$con = $db->connect();

$password = $_POST["Password"]; 
$email = $_POST["Email"];  
$word = $_POST["Word"]; 
$true = 'true';  
$false = 'false';
$response = array();


$selectquery = mysqli_prepare($con, "SELECT ID FROM users WHERE Email = ? AND Word = ?");  
    mysqli_stmt_bind_param($selectquery , "ss" , $email , $word); 
    mysqli_stmt_execute($selectquery); 
    mysqli_stmt_store_result($selectquery); 
    mysqli_stmt_bind_result($selectquery, $ID);


    if (mysqli_stmt_num_rows($selectquery) > 0){ 
        $response[resp] = $true; 
        $updatequery = mysqli_prepare($con , "UPDATE users SET Password = ? WHERE Email = ? AND Word = ?"); 
        mysqli_stmt_bind_param($updatequery ,"sss", $password, $email, $word); 
        mysqli_stmt_execute($updatequery); 
        mysqli_stmt_close($updatequery);
    }else{
        $response[resp] = $false; 
    }


echo json_encode($response); 
mysqli_stmt_close($selectquery); 
mysqli_close($con); 

运行代码:密码电子邮件 Word 从Android发布。首先,有一个查询来检查表中是否有用户(行)以及相应的电子邮件和Word。如果是,则添加ID。然后调用stmt_num_rows来检查所获取的行数,但是获取的行数最终为0(我得到响应为" false")。但如果它是一个,则会调用UPDATE查询,我会收到响应" true"。有谁知道我犯的错误?

谢谢!

1 个答案:

答案 0 :(得分:1)

将我们的评论用以解决此问题:

矿:

  

"尝试删除/评论这些并重新尝试。如果失败,那么您的POST可能会失败。检查这些和变量以及查询中的错误。"

  

"还要确保没有引入空格,如果是,trim()并执行var_dump。请记住POST阵列区分大小写。 Passwordpassword等是两种不同的动物。其他POST阵列"

也是如此

伊万' S:

  

"弗雷德你说得对,问题不在于它实际上是发布的数据。由于我使用Async Http库,我忘了发布我想发送的实际参数。我将params设置为null"

<强>密码

我注意到您可能以纯文本格式存储密码。不建议这样做。

使用以下其中一项:

其他链接:

关于列长的重要说明:

如果您决定使用password_hash()或隐藏,请务必注意,如果您当前的密码列长度低于60,则需要将其更改为(或更高)。手册建议长度为255。

您需要更改列的长度并重新开始使用新哈希才能使其生效。否则,MySQL将无声地失败。