Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/03/2016, 07:37
Keysersozer
 
Fecha de Ingreso: febrero-2016
Mensajes: 17
Antigüedad: 8 años, 2 meses
Puntos: 0
Login con password_verify

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 original
  1. define("HASH_COST_FACTOR", "10");
  2. $hash_cost_factor = (defined('HASH_COST_FACTOR') ? HASH_COST_FACTOR : null);
  3. $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
  1. <?php
  2.  
  3. if($_POST){
  4. $nombre=$_POST['nombre']; //Campo del formulario verificado
  5. $contra=$_POST['contra']; //Campo del formulario verificado
  6. $base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
  7. $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8.  
  9. function verificar_login($user,$password,&$result)
  10.     {
  11.         try
  12.         {
  13.               $base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
  14.                   $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  15.           $base->exec("SET CHARACTER SET utf8");
  16.               $sql="SELECT * FROM usuarios WHERE (usuario = :usu OR mail = :usu)";
  17.               $resultado=$base->prepare($sql);
  18.               $resultado->execute(array(":usu"=>$user));
  19.                   $count = 0;
  20.                   while($registro=$resultado->fetch(PDO::FETCH_ASSOC)){
  21.                            $count++;
  22.                            $result = $registro;
  23.                    }
  24.                   if($count == 1 && password_verify($password,$result['password'])) {
  25.                             return 1;
  26.                    } else {
  27.                             return 0;
  28.                    }
  29.           $resultado->closeCursor();
  30.  
  31.                }catch(Exception $e) {
  32.               die("Error: " . $e->getMessage() . "<br>Código del error: " . $e->getCode() . "<br>Línea: " . $e->getLine());
  33.            }
  34.        
  35.     } // function verificar_login()
  36.  
  37.  
  38. /*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:*/
  39.  
  40. 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
  41. {
  42.     if(isset($_POST['login'])) //Si la primera condición no pasa, haremos otra preguntando si el boton de login fue presionado
  43.     {
  44.     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.
  45.         {    
  46.             $_SESSION['userid'] = $result->idusuario;
  47.         $_SESSION['name'] = $result->usuario;
  48.             header("location:login.php");
  49.  
  50.         } else { ?>
  51.                         <script>
  52.              $(".registro").hide().delay(1000);
  53.              $("#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);
  54.             window.location.href='login.php';
  55.                        </script>
  56.          <?php }
  57.     } //isset($_POST['login']
  58.  
  59. } else {
  60.       echo 'Su usuario ingreso correctamente.';
  61.       echo '<a href="logout.php">Logout</a>';
  62.       header("location:index.php");
  63.        }
  64. }  ?> //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.

Última edición por Keysersozer; 01/03/2016 a las 07:45