PHP - bindParam con AES_ENCRYPT()

stuckED

Hola a todos. Tengo la mala suerte de tener un nefasto profesor de desarrollo backend que se ciñe a "su" código y no te permite nunca ir más allá o resolver dudas. La cuestión es la siguiente.

Estoy realizando un login muy básico, donde la contraseña está cifrada. Según tengo entendido, las consultas deben realizarse mejor con ->prepare que con -> query. Así pues, esta es mi consulta a la base de datos:

    $bindPass = '123';
    $bindId = 'admin';
    $consultaPass = $dbh->prepare("SELECT id from usuario where id = ? AND passwd = AES_ENCRYPT(passwd, ?)");
    $consultaPass->bindParam(1, $bindId);
    $consultaPass->bindParam(2, $bindPass);
    $consultaPass->execute();

Cabe decir que todo lo demás funciona correctamente: la base de datos es la correcta, he instanciado el PDO etc. Si hago la consulta sin utilizar bindParam también la realiza correctamente, pero no soy capaz de sacar esto adelante y no encuentro ningún sitio donde aparezca específicamente resuelto.

¿Alguien me echa un cable? Se lo agradecería mucho.

nFk13

Pero qué error te da?

1 respuesta
stuckED

#2 Cuando intento mostrar los resultados de la consulta está vacío. Para comprobar hago:

$result = $consultaPass->fetch(PDO::FETCH_ASSOC);
echo ($result[0]);

por ejemplo. Pero siempre me sale vacío. Cuando no utilizo bindParam para recoger el valor desde un formulario sí me devuelve los valores.

C

Pruebalo de ese modo.

   $consultaPass->bindParam(1, $bindId, PDO::PARAM_STR); 

y si no con bindValue, reemplazas el ? por :bindId en la sentencia

$consultaPass->bindValue(':bindId', $bindId, PDO::PARAM_STR);
_Rpv

Estás comparando el nombre de un usuario con el campo id de una tabla. Eso me extraña un poco. Es correcto?

1 respuesta
stuckED

#5 El nombre? Dónde?
Si te refieres al "id" a mí también me extrañó cuando vi el script SQL. Pero no, no es clave autoincremental (como hubiera sido lógico) es simplemente el nombre del usuario en minúsculas. Preguntas al profesor sobre eso xD.

_Rpv

Joder xD
Haz una consulta sin tener en cuenta la contraseña, a ver si te devuelve resultados

1 respuesta
stuckED

#7 Sí, de hecho cuando hago la consulta siguiente:

SELECT id,AES_DECRYPT(AES_ENCRYPT('123', passwd), passwd) FROM usuarios where id = 'admin';

Me devuelve tanto 'admin' como '123';
Creo que el problema lo estoy teniendo claramente en que no puedo cifrar la contraseña para la WHERE clause.

Usuarios habituales