2010-06-01 18 views
6

Ich untersuche das Zend Framework und stehe fest im Zählen der resultierenden Reihen von SQL Abfragen ... Jede Methode, die ich versuche (aus Dokumentation und einigen Blogposts und Tutorials) gibt einen Fehler zurück (wie Call to undefined function) oder gibt einfach den falschen Wert.Zend Framework - Zeilen in Select-Klausel zählen?

Ich habe dies versucht:

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

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

... dann dieses:

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

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

und sogar:

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

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

Auch rowCount() und count(fetchRow()) und count(fetchAll()->toArray()). Aber immer habe ich eine Fehlermeldung oder dupliziere Inserts in db in der weiteren Einfügefunktion. Also, was ist der richtige Weg, um die resultierende Zeilenberechnung in SELECT-Klausel in Zend Framework 1.9 (ich benutze diese) zu tun?

Antwort

15

Die Verwendung Sie versuchen zu tun ist, wie folgt:

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

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

ich ein paar andere Tipps haben:

  • Ihre Anfrage zwischen Login nicht unterscheiden nicht und falsches Passwort gefunden .
  • Ihre Passwörter können im Klartext gespeichert werden. Dies ist ein security risk. Sie sollten eine one-way hash function and salting verwenden.

Ich würde die Abfrage wie folgt neu strukturieren:

$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"; 
} 

Sie haben nicht die verschiedenen Fällen für den Benutzer zu berichten - in der Tat ist es am besten Sicherheitspraxis nicht ihnen zu sagen, was von Der Benutzername oder das Passwort ist falsch. Aber Sie möchten vielleicht in Ihrem eigenen Code wissen, dass Sie ein Konto sperren können, das viele fehlgeschlagene Kennwörter empfängt.

SHA1() ist nicht so gut wie die available in MySQL 5.5 und später ist.

+0

Danke! tho, $ Passwort-Variable ist md5 Hash mit Salz – moogeek