2010-06-01 57 views
6

我正在調查Zend框架,目前在計算結果行sql查詢...我嘗試(從文檔和一些blogposts和教程)返回一個錯誤(如Call to undefined function)或簡單地給出不正確的值。Zend Framework - 在select子句中計數行嗎?

我已經試過這樣:

$checkquery = $db->select() 
    ->from('users', 'COUNT(*)') 
    ->where('login = ?', $login) 
    ->where('password = ?', $password) 
    ->query(); 

$checkrequest=fetchRow($checkquery)->num; 

......那麼這一個:

$checkquery = $db->select() 
    ->from('users', '*') 
    ->where('login = ?', $login) 
    ->where('password = ?', $password) 
    ->query(); 

$checkrequest=count($checkquery->fetchAll()); 

,甚至:

$checkquery = $db->select() 
    ->from('users', '*') 
    ->where('login = ?', $login) 
    ->where('password = ?', $password) 
    ->query(); 

$checkrequest=$checkquery->fetchAll()->num; 

而且rowCount()count(fetchRow())count(fetchAll()->toArray())。但總是我收到一條錯誤消息或在進一步插入函數中重複插入數據庫。那麼在Zend Framework 1.9的select子句中做結果行計算的正確方法是什麼(我使用這個)?

回答

15

你正在試圖做的用法如下:

$checkquery = $db->select() 
    ->from("users", array("num"=>"COUNT(*)")) 
    ->where("login = ?", $login) 
    ->where("password = ?", $password); 

$checkrequest = $db->fetchRow($checkquery); 
echo $checkrequest["num"]; 

我有幾個其他提示:

我會重組這樣的查詢:

$checkquery = $db->select() 
    ->from("users", array("pwd_is_correct"=> 
    $db->quoteInto("(password = SHA1(CONCAT(salt, ?)))", $password))) 
    ->where("login = ?", $login); 

$checkrequest = $db->fetchRow($checkquery); 
if ($checkrequest === false) { 
    echo "no such login\n"; 
} else if ($checkrequest["pwd_is_correct"] > 0) { 
    echo "login and password are correct\n"; 
} else { 
    echo "login found but password is incorrect\n"; 
} 

您不必在不同的情況報告給用戶 - 事實上,它是最安全的做法告訴他們其中登錄名或密碼不正確。但是你可能想知道你自己的代碼,這樣你就可以鎖定一個接收很多失敗密碼的賬戶。

SHA1()不如SHA2()這是available in MySQL 5.5和更高版本。

+0

謝謝! tho,$密碼變量是用md5散列的鹽 – moogeek 2010-06-01 21:50:08