Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2015, 11:54
Avatar de NueveReinas
NueveReinas
 
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 11 años, 3 meses
Puntos: 145
Pregunta No me mantiene las sesiones

Hola de nuevo...

Esta vez estoy intentando que los usuarios que hayan perdido/olvidado la contraseña puedo recuperarla.

Para eso, se dirigen a esta página:

recuperar.php

Código HTML:
Ver original
  1. <?php
  2. //Esto destruye cualquier sesión anterior.
  3. session_start();
  4. session_destroy();
  5. session_start();
  6. ?>
  7. <div align="center">
  8.     <form method="POST" action="recuperacion.php" />
  9.    
  10.     <p>Si has perdido o no recuerdas tu contraseña, podrás establecer una nueva.</p>
  11.    
  12.             <label>Email asociado a la cuenta</label>
  13.             <input type="email" name="email" id="email" maxlength="50" size="30" required/>
  14.            
  15.             <input type="submit" name="submit" value="Siguiente" class="btn" >
  16.            
  17.     </form>
  18. <p><a href="http://www.ejemplo.com/BD/registro" target="_self">Registrarse</a> | <a href="http://www.ejemplo.com/BD/entrar" target="_self">Entrar</a></p>
  19. </body>

En ese formulario, escriben el mail asociado con la cuenta.

Cuando cliqueen en "Siguiente", los lleva a:

recuperacion.php

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Carga la configuración
  4. $config = parse_ini_file('config.ini');  
  5.  
  6. // Conexión con los datos del 'config.ini'
  7. $connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
  8.  
  9. // Si la conexión falla, aparece el error
  10. if($connection === false) {
  11.     return mysqli_connect_error();
  12. }
  13.  
  14. $email = $_POST['email'];
  15. $_SESSION['email'] = $email; //guarda el email en una variable de session para recuperarlo en el siguiente form
  16.  
  17. $noreg = "";
  18. $mensaje = "";
  19.  
  20. // Genera una clave aleatoria
  21.         function generate_random_key() {
  22.             $chars = "abcdefghijklmnopqrstuvwxyz123456789";
  23.             $new_key = "";
  24.             for ($i = 5; $i < 32; $i++) {
  25.                 $new_key .= $chars[rand(5,35)];
  26.             }
  27.             return $new_key;
  28.         };//Final de la funcion
  29.  
  30.         $random_key = generate_random_key();
  31.  
  32. if(isset($_POST['email']) ) {  //comprobamos que el campo email trae algun valor
  33.  
  34.     $query   = "SELECT * FROM usuarios WHERE email='$email'";  //seleccionamos la informacion de la BD correspondiente al email del user
  35.     $result = mysqli_query($connection , $query) or die ( mysql_error() );
  36.    
  37.     while ($row = mysqli_fetch_array($result)) {
  38.        
  39.     if (($row['password']) == TRUE) {  //compruebo que exista el password del email enviado
  40.         //$_SESSION['email'] = $row['email'];  //guardamos el usuario en una variable de sesion
  41.         $mensajehtml = "Se le ha enviado un e-mail con los datos necesarios para crear una nueva contraseña. ";
  42.        
  43.         //Si está correcto, entonces envía el mail
  44.        
  45.         // Datos del email
  46.  
  47. $nombre_origen    = "NueveReinas";
  48. $email_origen     = "[email protected]";
  49. $email_copia      = "[email protected]";
  50. $email_ocultos    = "[email protected]";
  51. $email_destino    = "".$email."";
  52.  
  53. $asunto = "Nueva contraseña";
  54.  
  55. $mensaje = '
  56. Hola, recientemente has pedido una nueva contraseña para XXX. <br>
  57. <br>
  58. Para poder crear una nueva contraseña entra en el siguiente enlace: <br>
  59. <br>
  60. <strong>http://www.ejemplo.com/BD/recuperar_2.php?activation='.$random_key.'</strong><br>
  61. <br>
  62. Si no podés entrar haciendo click, copialo y pegalo en la barra del navegador.<br>
  63. <br>
  64. Gracias.
  65. ';
  66.  
  67. $formato = "html";
  68.  
  69. //*****************************************************************//
  70. $headers  = "From: $nombre_origen <$email_origen> \r\n";
  71. $headers .= "X-Priority: 3 \r\n";
  72. $headers .= "MIME-Version: 1.0 \r\n";
  73. $headers .= "Content-Transfer-Encoding: 7bit \r\n";
  74. //*****************************************************************//
  75.  
  76. if($formato == "html")
  77.  { $headers .= "Content-Type: text/html; charset=iso-8859-1 \r\n";  }
  78.    else
  79.     { $headers .= "Content-Type: text/plain; charset=iso-8859-1 \r\n";  }
  80.  
  81. if (@mail($email_destino, $asunto, $mensaje, $headers))  
  82. { };
  83.        
  84.     }
  85.  
  86. };
  87.        
  88.     }
  89. else {
  90.         $mensajehtml = "El email no esta registrado en nuestra base de datos.";  //si no existe ese mail...
  91.         //session_destroy();
  92.         //$connection->close();
  93. };
  94.            
  95. ?>

Aquí genera una clave aleatoria que se comprueba después, revisa que el FORM anterior no esté vacío, y entonces envía un mail al $POST proporcionado del tipo

Código:
http://www.ejemplo.com/BD/recuperar_2.php?activation=tu8i59i5pxwn2d5figjhtso64m
Entonces, al hacer click, les lleva a:

recuperar_2.php

Código HTML:
Ver original
  1. <?php
  2. session_start();
  3. $email = $_SESSION['email'];
  4. ?>
  5. <div align="center">
  6. <form method="POST" action="recuperacion-segura" />
  7.             <label>Nueva contraseña</label>
  8.             <input type="password" name="password" id="password" minlength="6" required />
  9.             <label>Confirmar nueva contraseña</label>
  10.             <input type="password" name="password2" id="password2" minlength="6" required />
  11.             <input type="submit" name="btn" class="btn" value="Enviar"/>
  12.     </form>
  13.     <p>EMAIL: <?php echo $email ?></p>
  14. </div>
  15. </body>

Y acá empiezan los problemas. No me toma la sesión de la variable $email.

Por último, ese formulario lleva al usuario a:

recuperacion-segura

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Carga la configuración
  4. $config = parse_ini_file('config.ini');  
  5.  
  6. // Conexión con los datos del 'config.ini'
  7. $connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
  8.  
  9. // Si la conexión falla, aparece el error
  10. if($connection === false) {
  11.     return mysqli_connect_error();
  12. }
  13.  
  14. $_SESSION['email'] = $email; //Obtenemos la variable se sesion
  15.  
  16. $activation_key = $_GET["activation"]; //Obtenemos la clave del email
  17.  
  18. //$noreg = "";
  19. $titulo = "";
  20.  
  21. $dbh = $connection;
  22. // Busca la entrada en la tabla de usuarios para la clave de activación recibida
  23. $stm = $dbh->prepare("SELECT count(1) FROM usuarios WHERE activation_key=?"); //=?
  24. /*$stm->bind_param("s",$activation_key);*/
  25. $stm->bind_result($total);
  26. $stm->execute();
  27. $stm->fetch();
  28. $stm->close();
  29.  
  30. if ($total == 1) { // Si se ha encontrado...
  31.    $password = $_POST["password"]; //variable que viene del campo del form pasword
  32.    $password2 = $_POST["password2"];//variable que viene del campo del form pasword2
  33.  
  34. if (isset($_POST["password"])) {
  35.      
  36.     $password = $_POST["password"]; //variable que viene del campo del form pasword
  37.     $password2 = $_POST["password2"];//variable que viene del campo del form pasword2
  38.  
  39.     /*$password = md5($password); // codificamos los password con md5
  40.     $password2 = md5($password2); */
  41.     //$email = $_SESSION['email']; // recogemos la variable email y username que guardamos en la sesion en el script anterior
  42.  
  43. // Hay campos en blanco
  44. if($password==NULL|$password2==NULL) {
  45.     $error = "Un campo o ambos campos están vacíos.";
  46.     $titulo = "Error";
  47. }
  48. else {  
  49.     // ¿Coinciden las contraseñas?
  50.     if($password!=$password2) {
  51.         $error = "Las contraseñas no coinciden. Por favor, inténtelo de nuevo. <br>";
  52.         $titulo = "Error";
  53. }
  54. else {
  55.  
  56. $password_cifrada = crypt($password);
  57. $query = "UPDATE usuarios SET password='$password_cifrada' WHERE email='$email' ";
  58. mysqli_query($connection, $query) or die(mysql_error());    
  59.  
  60. /*                
  61. //obtengo los datos del usuario para mandar el email    
  62. $result = "SELECT * FROM usuarios WHERE password='$password' ";
  63. $result = mysqli_query($connection,$result) or die ( mysql_error() );        
  64. $row = mysqli_fetch_array($result);  
  65. */
  66.  
  67. $titulo = "Nueva contraseña asignada";      
  68. $hecho = 'Nueva contraseña asignada a '.$email.'<br><br>
  69. Ya puedes <a href="http://www.ejemplo.com/BD/entrar" target="_self">entrar</a>.';
  70.  
  71. //session_destroy();
  72.  
  73. /////////////////////////////////////////////////
  74.  
  75. // Datos del email
  76.  
  77. $nombre_origen    = "NueveReinas";
  78. $email_origen     = "[email protected]";
  79. $email_copia      = "[email protected]";
  80. $email_ocultos    = "[email protected]";
  81. $email_destino    = "".$email."";
  82.  
  83. $asunto = "Tu nueva contraseña";
  84.  
  85. $mensaje = '
  86. Hola, recientemente has creado una nueva contraseña para XXX. <br>
  87. <br>
  88. Esa contraseña es: <strong>'.$password.'</strong>';
  89.  
  90. $formato = "html";
  91.  
  92. //*****************************************************************//
  93. $headers  = "From: $nombre_origen <$email_origen> \r\n";
  94. $headers .= "X-Priority: 3 \r\n";
  95. $headers .= "MIME-Version: 1.0 \r\n";
  96. $headers .= "Content-Transfer-Encoding: 7bit \r\n";
  97. //*****************************************************************//
  98.  
  99. if($formato == "html")
  100.  { $headers .= "Content-Type: text/html; charset=iso-8859-1 \r\n";  }
  101.    else
  102.     { $headers .= "Content-Type: text/plain; charset=iso-8859-1 \r\n";  }
  103.  
  104. if (@mail($email_destino, $asunto, $mensaje, $headers))  
  105. { };
  106.        
  107.     }
  108.  
  109. };
  110.  
  111. /////////////////////////////////////////////////
  112.  
  113. }
  114. };
  115.            
  116. ?>

<body>
<div align="center">

<div class="cuadro">
<p><?php echo $noreg ?></p>
<p><?php echo $error ?></p>
<p><?php echo $hecho ?></p>
<p>EMAIL: <?php echo $email ?></p>
</div>

</div>
</body>

Bien, se que es complicado, pero no termina de agarrar la sesión. En ningún momento, más allá de en el inicio, destruyo ninguna sesión.

Se pierde la variable entre el link del mail y recuperar_2.php.

__________________
¿Te sirvió la respuesta? Deja un +1