MYSQL db返回错误的计数

时间:2011-11-11 01:44:24

标签: php mysql count mysqli prepared-statement

即使db表中没有给定的电子邮件地址,这段代码也会每次返回1。当你在bind_result之后立刻放置die($ count)。每次返回1。您是否注意到我的代码中有任何错误?

    $stmt = $db->prepare("SELECT COUNT(id) FROM `users` WHERE `email`=? LIMIT 1") or die($db->error);
    $stmt->bind_param("s", $email) or die ($stmt->error);
    $stmt->execute() or die ($stmt->error);
    $count=$stmt->bind_result($count) or die ($stmt->error);
            die($count);
            $stmt->close();
    return ($count > 0 ? true : false);

2 个答案:

答案 0 :(得分:2)

您没有调用$stmt->fetch()将查询结果放入绑定变量$ count。

因此,$ count的值设置为$stmt->bind_result()的返回值,该值始终为true(1)或false(0)。

请参阅http://php.net/manual/en/mysqli-stmt.bind-result.php上的示例,使用bind_result()告诉语句要存储的PHP变量结果,但是您必须将查询结果作为对fetch()的单独调用获取


重新评论:这些函数都不会返回您的计数结果。

函数在成功时返回TRUE,在失败时返回FALSE。它们不返回查询结果。这就是绑定变量的原因,因此fetch可以将结果存储在该变量中作为副作用 - 而不是作为返回值。您不应该指定$count=*anything*

以下是您的代码的外观:

$stmt = $db->prepare("SELECT COUNT(id) FROM `users` WHERE `email`=? LIMIT 1") 
    or die($db->error);
$stmt->bind_param("s", $email) 
    or die ($stmt->error);
$stmt->execute() 
    or die ($stmt->error);
$stmt->bind_result($count)  // do not use return value
    or die ($stmt->error);
$stmt->fetch() // do not use return value
    or die ($stmt->error);
print ($count);
$stmt->close()
    or die ($stmt->error);
return ($count > 0 ? true : false);

答案 1 :(得分:1)

bind_result将变量绑定到结果存储的预准备语句,成功时返回TRUE,失败时返回FALSE。

$stmt->bind_result($count);
$stmt->fetch();
$stmt->close();
return ($count > 0 ? true : false); // return $count > 0; would be ok.