2011-11-11 123 views
1

即使数据库表中没有给定的电子邮件地址,这段代码也会每次返回1。就像你我在bind_result之后立即放置($ count)一样。它每次返回1。你有没有注意到我的代码有错?MYSQL数据库返回错误计数

$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); 
+0

即时通讯不是PHP的家伙,但它似乎是你的查询返回1意味着执行没有错误的语句。也许有另一个PHP方法将返回行数或结果。使用$ count = $ stmt-> fetch()来代替 –

回答

2

您没有拨打$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。他们不返回查询的结果。这就是为什么你要绑定一个变量,所以抓取可以将结果存储在该变量中作为副作用 - 而不是作为返回值。你不应该分配$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); 
+0

。相同的结果 –

+0

哦,好的。尝试... –

+1

thx。它为我工作。在我的问题下看到90k用户的回答真棒。 –

1

bind_result结合变量的结果存储一份准备好的声明,并返回TRUE或FALSE的成功失败。

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