【问题标题】:Mysqli prepared statement stmt_num_rows returns 0Mysqli 准备好的语句 stmt_num_rows 返回 0
【发布时间】:2016-02-18 00:46:01
【问题描述】:

由于某种原因,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发布的。首先有一个查询来检查表中是否有一个用户(行)与对应的Email和Word。如果是这样,则添加 ID。然后调用stmt_num_rows 来检查获取的行数,但获取的行数最终为0(我得到的响应为“false”)。但如果它是一个,那么将调用 UPDATE 查询,我会收到一个响应“true”。有谁知道我犯的错误?

谢谢!

【问题讨论】:

  • 'resp' 未定义,需要多调试,添加日志
  • 您甚至可能不需要使用mysqli_stmt_store_resultmysqli_stmt_bind_result。尝试删除/评论那些,然后再试一次。如果失败,那么您的 POST 可能会失败。检查这些和变量以及查询中的错误。
  • 还要确保没有引入空格,如果是这样,trim() 并执行 var_dump。请记住,POST 数组区分大小写。 Passwordpassword 等是两种不同的动物。其他 POST 数组也是如此。
  • 啊太棒了。很高兴听到它解决了@IvanJavorovic 干杯

标签: php mysql mysqli prepared-statement


【解决方案1】:

让我们的 cmets 回答以结束此问题:

我的:

“尝试删除/注释掉这些内容,然后再试一次。如果失败,那么您的 POST 可能会失败。检查这些和变量以及查询中的错误。”

和:

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

伊万的:

“Fred 你是对的,问题不在 php 中,实际上是发布的数据。由于我使用的是 Async Http 库,我忘记发布我想要发送的实际参数。我设置了参数为空"


密码

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

使用以下方法之一:

其他链接:

关于列长度的重要旁注:

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

您需要更改列的长度并使用新的哈希重新开始以使其生效。否则,MySQL 将静默失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2018-02-04
    • 1970-01-01
    • 2012-12-01
    • 2011-01-23
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多