2011-11-11 147 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.