php - left - zend framework where in query
Zend Framework-conteo de filas en la cláusula de selección? (1)
Estoy investigando Zend Framework y actualmente tengo dificultades para contar las filas resultantes de la consulta sql ... Cada método que intento (a partir de la documentación y algunos blogposts y tutoriales) devuelve un error (como Call to undefined function
) o simplemente da el valor incorrecto.
He intentado esto:
$checkquery = $db->select()
->from(''users'', ''COUNT(*)'')
->where(''login = ?'', $login)
->where(''password = ?'', $password)
->query();
$checkrequest=fetchRow($checkquery)->num;
... entonces este:
$checkquery = $db->select()
->from(''users'', ''*'')
->where(''login = ?'', $login)
->where(''password = ?'', $password)
->query();
$checkrequest=count($checkquery->fetchAll());
e incluso:
$checkquery = $db->select()
->from(''users'', ''*'')
->where(''login = ?'', $login)
->where(''password = ?'', $password)
->query();
$checkrequest=$checkquery->fetchAll()->num;
También rowCount()
y count(fetchRow())
y count(fetchAll()->toArray())
. Pero siempre recibí un mensaje de error o insertos duplicados en db en la función de inserción adicional. Entonces, ¿cuál es la forma correcta de hacer el cálculo de filas resultante en la cláusula de selección en Zend Framework 1.9 (yo uso este)?
El uso que estás tratando de hacer es el siguiente:
$checkquery = $db->select()
->from("users", array("num"=>"COUNT(*)"))
->where("login = ?", $login)
->where("password = ?", $password);
$checkrequest = $db->fetchRow($checkquery);
echo $checkrequest["num"];
Tengo un par de otros consejos:
- Su consulta no distingue entre el inicio de sesión no encontrado y la contraseña incorrecta.
- Sus contraseñas pueden almacenarse en texto sin formato, que es un riesgo de seguridad . Debería usar una función hash unidireccional y salazón .
Me gustaría reestructurar la consulta de esta manera:
$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";
}
No tiene que informar los diferentes casos al usuario; de hecho, es la mejor práctica de seguridad no decirles cuál de los inicios de sesión o la contraseña es incorrecta. Pero es posible que desee saber en su propio código para poder bloquear una cuenta que recibe muchas contraseñas fallidas.
SHA1()
no es tan bueno como SHA2()
que está disponible en MySQL 5.5 y posterior.