Buenas,
Resulta que estoy intentando implementar la función password_verify() en un login, he realizado ya varias pruebas con resultado negativo y no sé que es lo que puedo estar haciendo mal. En todos los intentos me entra en el mensaje "No existe este usuario o la contraseña es incorrecta.", saliendo un error estilo "Trying to get property of non-object in C:\wamp\www\Pelipedia\login.php on line 205" Ya me he cerciorado de que los campos de la tabla sean los correctos, y no sé porque no captura los datos para iniciar las sesiones. ($_SESSION['userid'] = $result->idusuario; y $_SESSION['name'] = $result->usuario;)
La contraseña la he codificado en la parte del registro tal que así:
Código PHP:
Ver originaldefine("HASH_COST_FACTOR", "10"); $hash_cost_factor = (defined('HASH_COST_FACTOR') ? HASH_COST_FACTOR
: null); $user_password_hash = password_hash
($contra, PASSWORD_DEFAULT
, array('cost' => $hash_cost_factor));
Ingresando el $user_password_hash en la BBDD.
Este es el código del login:
Código PHP:
Ver original<?php
if($_POST){
$nombre=$_POST['nombre']; //Campo del formulario verificado
$contra=$_POST['contra']; //Campo del formulario verificado
$base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
$base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
function verificar_login($user,$password,&$result)
{
try
{
$base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
$base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$base->exec("SET CHARACTER SET utf8"); $sql="SELECT * FROM usuarios WHERE (usuario = :usu OR mail = :usu)";
$resultado=$base->prepare($sql);
$resultado->execute(array(":usu"=>$user)); $count = 0;
while($registro=$resultado->fetch(PDO::FETCH_ASSOC)){
$count++;
$result = $registro;
}
if($count == 1 && password_verify($password,$result['password'])) {
return 1;
} else {
return 0;
}
$resultado->closeCursor();
}catch(Exception $e) {
die("Error: " . $e->getMessage() . "<br>Código del error: " . $e->getCode() . "<br>Línea: " . $e->getLine()); }
} // function verificar_login()
/*Luego haremos una serie de condicionales que identificaran el momento en el boton de login es presionado y cuando este sea presionado llamaremos a la función verificar_login() pasandole los parámetros ingresados:*/
if(!isset($_SESSION['userid'])) //para saber si existe o no ya la variable de sesión que se va a crear cuando el usuario se logee {
if(isset($_POST['login'])) //Si la primera condición no pasa, haremos otra preguntando si el boton de login fue presionado {
if(verificar_login($nombre,$contra,$result) == 1) //Si el boton fue presionado llamamos a la función verificar_login() dentro de otra condición preguntando si resulta verdadero y le pasamos los valores ingresados como parámetros.
{
$_SESSION['userid'] = $result->idusuario;
$_SESSION['name'] = $result->usuario;
} else { ?>
<script>
$(".registro").hide().delay(1000);
$("#alert").show("slide", { direction: "left" }, 1000).html("<div class='hay'><p>No existe este usuario o la contraseña es incorrecta.</p></div>").delay(3000);
window.location.href='login.php';
</script>
<?php }
} //isset($_POST['login']
} else {
echo 'Su usuario ingreso correctamente.';
echo '<a href="logout.php">Logout</a>';
}
} ?> //If ($_POST)
A ver si me podéis ayudar, muchas gracias de antemano. Tambíén serán bienvenidas formas más fáciles de hacer login, la base la cogí de un ejemplo (venía con la función validar_login incluída) y la he ido adaptando a mis necesidades.