2010-06-01 3 views
6

J'étudie Zend Framework et actuellement coincé dans le comptage des lignes résultantes de requête sql ... Chaque méthode que j'essaie (de la documentation et certains blogposts et tutoriels) renvoie une erreur (comme Call to undefined function) ou donne simplement la valeur incorrecte.Zend Framework - compter les lignes dans la clause select?

J'ai essayé ceci:

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

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

... alors celui-ci:

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

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

et même:

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

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

également rowCount() et count(fetchRow()) et count(fetchAll()->toArray()). Mais toujours j'ai un message d'erreur ou des insertions en double dans db dans une autre fonction d'insertion. Alors, quelle est la bonne façon de faire le calcul de la ligne résultante dans la clause select dans Zend Framework 1.9 (j'utilise celui-ci)?

Répondre

15

L'utilisation que vous essayez de faire est la suivante:

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

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

J'ai deux ou trois autres conseils:

  • Votre requête ne fait pas la distinction entre connexion introuvable et mot de passe incorrect . Vos mots de passe peuvent être stockés en texte brut, c'est-à-dire security risk. Vous devez utiliser un one-way hash function and salting.

Je restructurer la requête comme ceci:

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

Vous ne devez pas déclarer les différents cas à l'utilisateur - en fait, il est les meilleures pratiques de sécurité pas pour leur dire quels le nom d'utilisateur ou le mot de passe est incorrect. Mais vous voudrez peut-être savoir dans votre propre code afin que vous puissiez verrouiller un compte qui reçoit beaucoup de mots de passe échoués.

SHA1() n'est pas aussi bon que SHA2() qui est available in MySQL 5.5 et plus tard.

+0

Merci! tho, $ variable de mot de passe est md5 haché avec du sel – moogeek