【问题标题】:MYSQL db returns wrong countMYSQL db 返回错误的计数
【发布时间】:2011-11-11 01:44:24
【问题描述】:

即使 db 表中没有给定的电子邮件地址,这段代码每次都返回 1。当你我把 die($count) 放在 bind_result 之后。它每次返回 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);

【问题讨论】:

  • 我不是 php 人,但您的查询似乎返回 1,这意味着语句执行时没有错误。也许还有另一种 php 方法会返回行数或结果。

标签: php mysql count mysqli prepared-statement


【解决方案1】:

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

因此,$count 的值被设置为 $stmt->bind_result() 的返回值,它始终为真 (1) 或假 (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);

【讨论】:

  • 使用了 $count=$stmt->fetch() 代替。结果相同
  • 谢谢。它对我有用。在我的问题下看到 90k 用户的回答真是太棒了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2017-03-19
    • 2016-07-21
    相关资源
    最近更新 更多