2012-06-10 59 views
0

因爲我的過程幾乎完成,用PDO而不是mysql_*命令重寫Web,我現在正在測試我更改的功能。 ?返回true,這是什麼原因讓我們來看看原始的和改變的代碼:如何有效地取代(mysql_result(mysql_query())在PDO中?

if (mysql_result(mysql_query("SELECT COUNT(*) FROM account WHERE id='".$_SESSION["user_id"]."' AND online=1"), 0)>0) 
{ 
    return true; 
} 
else 
    return false; 

這裏改變代碼:

$stmt = $db_login->prepare("SELECT COUNT(*) FROM account WHERE id=:id AND online=1"); 
$stmt->bindValue(':id', $_SESSION["user_id"], PDO::PARAM_INT); 
$stmt->execute(); 
$results_login = $stmt->fetch(PDO::FETCH_ASSOC); 
$rows = count($results_login); 
if ($rows > 0) 
{ 
    return true; 
} 
else 
    return false; 

那麼,什麼是錯的,即使列有爲什麼它總是返回true在線= 0?謝謝

+5

'回聲count(array(0));' –

+0

@tereško所以在我的情況下它會是$ rows = count(array(0)); ? – Byakugan

+0

拜託,去學習php,而不是盲目地複製粘貼代碼 –

回答

1

$stmt->fetch從結果集中取一行。你擺脫它是一個包含所有選定列,看起來像這樣的數組:

array(
    'COUNT(*)' => 42 
) 

該陣列上的count()總是會導致1

您需要檢查取行的內容:

if ($result_login['COUNT(*)'] > 0) 

這是最好的別名此列一個更好的名字:

SELECT COUNT(*) AS `count` ... 

然後:

if ($result_login['count'] > 0) 
+0

好的謝謝你會試試:) – Byakugan

+0

當我想這是真正的行數應該使用什麼?例如,在每個帳戶中查找online = 1的次數並對它們進行比較,我應該使用什麼?對於實例,當我搜索網上是否有超過50個帳戶時,我應該使用什麼檢查函數而不是此mysql_result? – Byakugan

+0

您已經'選擇'COUNT()'。這總是會導致*一行*所需的數據。這意味着你讓數據庫進行計數。另一種方法是簡單地對所有行進行SELECT操作(不需要COUNT()),然後使用['rowCount'](http://php.net/manual/en/pdostatement.rowcount.php)檢查多少行你抓到了。儘管如此,這是相當浪費的操作。 – deceze