Foros del Web » Creando para Internet » Herramientas y Software »

Olvide contraseña con Dreamweaver

Estas en el tema de Olvide contraseña con Dreamweaver en el foro de Herramientas y Software en Foros del Web. ¿Se puede crear un sistema de recuperación de contraseña (Forgot password) en Dreamweaver? El sistema de login lo he creado utilizando el Email como usuario, ...
  #1 (permalink)  
Antiguo 01/08/2009, 12:08
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Olvide contraseña con Dreamweaver

¿Se puede crear un sistema de recuperación de contraseña (Forgot password) en Dreamweaver?

El sistema de login lo he creado utilizando el Email como usuario, y los usuarios inscritos quieren recuperar su contraseña, pero la que ellos enviaron, sin que se genere una nueva, como sucede en la mayoría de scripts que he encontrado en San Google. La contraseña de momento no está encriptada, más adelante mejoraré esa falla de seguridad.

Ojalá puedan ayuarme, por favor y gracias por sus respuestas.
  #2 (permalink)  
Antiguo 03/08/2009, 15:15
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Yo lo que hago en esos casos es crear un enlace que lleve a un campo para el email. cuando el usuario envía el email verifico que esté en la base de datos, y si está le envío un email con un enlace con código especial donde puede cambiar su password. Algo complicado para hacerlo solo con DW pero si quieres te ayudo.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #3 (permalink)  
Antiguo 03/08/2009, 19:05
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Hola Juaniquillo, gracias por responderme.

Te agradezco bastante si me ayudas, me gustaría implementar éste código en el sitio, pues es molesto estar buscando en la Base de Datos los datos para enviárselos a los usuarios, mejor que ellos mismos lo hagan de forma automática.

Espero tus instrucciones.
  #4 (permalink)  
Antiguo 14/08/2009, 08:11
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Saludos de nuevo. Perdón por la larga ausencia pero he tenido trabajo por un tubo. Bueno, lo primero es que necesitas un formulario donde la persona va a escribir su email o su usuario. Ese ejemplo lo voy a hacer con el email. Al textfield donde escribe el usuario le das el nombre de 'email' (sin comillas).




Ahora, lo mejor es verificar primero si el email existe. Para eso hacemos un recordset donde el email es igual al campo de email en tu base de datos:



Ahora vamos al código y arreglamos un poco el recordset. Encierras el recordset y el código que recibe la variable email dentro de una condicional para que sólo se ejecute cuando se envíe el formulario, osea, esto:


Código php:
Ver original
  1. $colname_Recordset1 = "-1";
  2. if (isset($_POST['email'])) {
  3.   $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['email'] : addslashes($_POST['email']);
  4. }
  5. mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  6. $query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString($colname_Recordset1, "text"));
  7. $Recordset1 = mysql_query($query_Recordset1, $conn_pruebas_local) or die(mysql_error());
  8. $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  9. $totalRows_Recordset1 = mysql_num_rows($Recordset1);


se convierte en esto:

Código php:
Ver original
  1. if(!empty($_POST['email'])){
  2.  
  3.     $colname_Recordset1 = "-1";
  4.     if (isset($_POST['email'])) {
  5.       $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['email'] : addslashes($_POST['email']);
  6.     }
  7.     mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  8.     $query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString($colname_Recordset1, "text"));
  9.     $Recordset1 = mysql_query($query_Recordset1, $conn_pruebas_local) or die(mysql_error());
  10.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  11.     $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  12.    
  13. }


Vamos a hacerlo por pasos, dime si hasta aquí todo está bien y luego seguimos.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #5 (permalink)  
Antiguo 15/08/2009, 23:09
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Excelente, voy entendiendo bien. Por favor sigamos. Gracias.
  #6 (permalink)  
Antiguo 16/08/2009, 10:34
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Seguimos entonces. he empezado a comentar el código que vamos trabajando para que se entienda mejor.

Ahora, antes de seguir, la última parte del código te va a dar un warning porque no encontará el recordset para vaciarlo. Si envías el formulario se va el error porque el recordset sólo se ejecutará cuando se envía el formulario. Lo puedes dejar así por ahora pero ese código lo moveremos cuando acabemos.

Ahora, vamos a crear una nueva tabla para almacenar el código de seguridad que se le envía a la persona a su email. Si este código no se puede cambiar el email. Yo he hecho una tabla sencilla llamada "recordar_pass" para esto. Estos son los campos:

1- id_recordar_pass (int) - Id de la tabla, auto-incremental.
2- email_recordar_pass (varchar) - email.
3- codigo_recordar_pass (varchar) - código.
4- timestamp_recordar_pass (bigint) - Timestamp UNIX por si acaso necesitas que los códigos se venzan después de un tiempo.
5- fecha_recordar_pass (datetime) - Algo que no es necesario, pero a mí siempre me gusta almacenar la fecha cuando se almacena cualquier dato en la base de datos.

así se ve en PHPMyAdmin:



Una vez este lista la tabla podemos hacer el Insert y enviar el email. Podemos usar el insert de DW para que nos genere el código (siendo este el foro de editores web trato de usar el las funciones del editor lo más posible). Haces un Insert usando el mismo formulario que tienes en la página:



El único campo que tienes especificar es el de email. El ID se pondra automático porque es auto-incremental y los otros valores los crearemos manualmente.



Una vez creado el insert podemos borrar lo que no necesitamos. De esto:

Código php:
Ver original
  1. $editFormAction = $_SERVER['PHP_SELF'];
  2. if (isset($_SERVER['QUERY_STRING'])) {
  3.   $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
  4. }
  5.  
  6. if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  7.   $insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass) VALUES (%s)",
  8.                        GetSQLValueString($_POST['email'], "text"));
  9.  
  10.   mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  11.   $Result1 = mysql_query($insertSQL, $conn_pruebas_local) or die(mysql_error());
  12. }

solo necesitamos esto:

Código php:
Ver original
  1. $insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass) VALUES (%s)",
  2.                    GetSQLValueString($_POST['email'], "text"));
  3.  
  4. mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  5. $Result1 = mysql_query($insertSQL, $conn_pruebas_local) or die(mysql_error());

También puedes borrar el campo oculto 'MM_insert' ya que nao lo estaremos usando.



Ahora vamos a ver si hubo un resultado del recordset del email. DW siempre crea con todo recordset la variable $totalRows_(el nombre de tu recorset) la cual contiene el número de resultados del mismos. En mi caso, mi recordset es Recordset1, osea, la variable se llama '$totalRows_Recordset1'. Si esta variable es igual a 1 sabemos que el email está en la base de datos. Yo usualmente uso la expresión, "si es mayor que cero (0') en estos casos. Sabiendo esto hacemos una condicional según lo que muestre la variable después de nuestro recordset:

Código php:
Ver original
  1. //si se envia el formulario
  2. if(!empty($_POST['email'])){
  3.     //se regoge la variable POST
  4.     $colname_Recordset1 = "-1";
  5.     if (isset($_POST['email'])) {
  6.       $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['email'] : addslashes($_POST['email']);
  7.     }
  8.     //recorset
  9.     mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  10.     $query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString($colname_Recordset1, "text"));
  11.     $Recordset1 = mysql_query($query_Recordset1, $conn_pruebas_local) or die(mysql_error());
  12.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  13.     $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  14.    
  15.     //si el email existe en la base de datos
  16.     if($totalRows_Recordset1 > 0){
  17.        
  18.     }
  19.     //si no existe
  20.     else $error = 'Este email no existe en la base de datos';
  21. }

Aquí, si la variable es mayor que 0 ejecutaremos el codigo que queramos. Si no es así almacenamos el error en una variable para mostrarla después al usuario.

Creo que hasta aquí tenemos bastante para el segundo paso. Puedes probar si todo funciona dando echo a las variables así:

Código php:
Ver original
  1. //si el email existe en la base de datos
  2. if($totalRows_Recordset1 > 0){
  3.     echo 'el email existe';
  4. }
  5. //si no existe
  6. else echo $error = 'Este email no existe en la base de datos';

si todo está bien, se mostrarán los mensajes correspondientes.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #7 (permalink)  
Antiguo 17/08/2009, 20:05
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Las dos bases de datos las tengo vacías, ingresé un email en el formulario y si aparece el mensaje: "Este email no existe en la base de datos" , y también vi en phpMyAdmin y si ingresó los datos a la tabla recordar_pass

Supongo que vamos bien.
  #8 (permalink)  
Antiguo 29/08/2009, 10:35
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Por fin volví. Seguimos con esto.

Ahora que está el esqueleto mas o menos de la aplicación movemos el insert dentro del 'if'

Código php:
Ver original
  1. //si el email existe en la base dedatos
  2. if($totalRows_Recordset1 > 0){
  3.    
  4.     $insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass) VALUES (%s)",
  5.         GetSQLValueString($_POST['email'], "text"));
  6.  
  7.     mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  8.     $Result1 = mysql_query($insertSQL, $conn_pruebas_local) or die(mysql_error());
  9. }
  10. //si no existe
  11. else echo $error = 'Este email no existe en la base de datos';


Ahora vamos a usar la función rand() para crear el número que vamos a asociar al usuario. rand() lo que hace es crear un número aleatorio. Lo vamos a crear de echo 10000 a 90000 para siempre tener 5 números. Este número lo guardamos en la variable $numero_secreto:

Código php:
Ver original
  1. $numero_secreto = rand(10000, 90000);

También usaremos la función time() la devuelve el 'timestamp unix'. Esto lo usaremos para darle un límite de tiempo a nuestro código secreto. Al time le sumaremos una semana. Esto se hace así:

Código php:
Ver original
  1. $timestamp = time() + (7 * 24 * 60 * 60);

Así el usuario tendrá una semana para poder cambiar su password. Lo otro que yo recomiendo guardar es la fecha en que se realizo el insert. Eso lo hacemos usando date() :

Código php:
Ver original
  1. $fecha = date('Y-m-d');


Ahora, añadimos las variables al insert. Usamos el sprintf() que ha sido creado por DW. También usaremos la variable $error para para mostrar un error diferente cuando no se haya escrito nada en el encanillado. Hasta Hasta ahora nuestro script se ve así:

Código php:
Ver original
  1. //si se envia el formulario
  2. if(!empty($_POST['email'])){
  3.     //se regoge la variable POST
  4.     $colname_Recordset1 = "-1";
  5.     if (isset($_POST['email'])) {
  6.       $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['email'] : addslashes($_POST['email']);
  7.     }
  8.     //recorset
  9.     mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  10.     $query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString($colname_Recordset1, "text"));
  11.     $Recordset1 = mysql_query($query_Recordset1, $conn_pruebas_local) or die(mysql_error());
  12.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  13.     $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  14.    
  15.     //si el email existe en la base dedatos
  16.     if($totalRows_Recordset1 > 0){
  17.         //numero secreto
  18.         $numero_secreto = rand(10000, 90000);
  19.         //timestamp
  20.         $timestamp = time() + (7 * 24 * 60 * 60);
  21.         //fecha
  22.         $fecha = date('Y-m-d');
  23.         //insert a la tabla del numero secreto
  24.         $insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass,codigo_recordar_pass,timestamp_recordar_pass,fecha_recordar_pass) VALUES (%s,%s,%s,%s)",
  25.             GetSQLValueString($_POST['email'], "text"),
  26.             GetSQLValueString($numero_secreto, "int"),
  27.             GetSQLValueString($timestamp, "int"),
  28.             GetSQLValueString($fecha, "date"));
  29.  
  30.         mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  31.         $Result1 = mysql_query($insertSQL, $conn_pruebas_local) or die(mysql_error());
  32.     }
  33.     //si no existe
  34.     else $error = 'Este email no existe en la base de datos';
  35. }
  36. //si el formulario esta vacio
  37. else $error = 'Por favor escriba su email';

El error se muestra encima del formulario:

Código php:
Ver original
  1. <?php
  2. //si hay error se muestra
  3. if(!empty($error)) echo $error;
  4. ?>
  5. <form id="form1" name="form1" method="POST" action="<?php echo $editFormAction; ?>">
  6.   <table border="0" cellpadding="5" cellspacing="1" bgcolor="#999999">
  7.     <tr>
  8.       <td bgcolor="#CCCCCC">email</td>
  9.       <td bgcolor="#FFFFFF"><input type="text" name="email" id="email" /></td>
  10.     </tr>
  11.     <tr>
  12.       <td colspan="2" bgcolor="#FFFFFF"><div align="center">
  13.         <input type="submit" name="button" id="button" value="enviar" />
  14.       </div></td>
  15.     </tr>
  16.   </table>
  17.   </form>

Lo próximo es enviar el email, pero primero verifica que todo esté funcionando hasta aquí.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #9 (permalink)  
Antiguo 01/09/2009, 19:57
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

He revisado el código línea a línea y me parece tenerlo igual que vos, y al ejecutarlo me aparece en el navegador:

Column 'email_recordar_pass' cannot be null
  #10 (permalink)  
Antiguo 02/09/2009, 09:34
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

eso pasa porque la columa de 'email_recordar_pass' de la tabla 'recordar_pass' la tienes como 'NOT NULL'. En la imagen que te puse de MySQL puedes ver que estoy usando 'NULL'.


By juaniquillo
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #11 (permalink)  
Antiguo 02/09/2009, 18:46
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Muy bien, lo he cambiado igual a la foto, ahora me sale el formulario y una advertencia



La línea 118 es la que marco a continuación en negro, esto está al final de todo lo que tengo en HTML:

</form>
</body>
</html>
<?php
mysql_free_result($Recordset1);
?>

Te agradezco el tiempo que te tomás en ésto Juaniquillo.
  #12 (permalink)  
Antiguo 03/09/2009, 14:24
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

puedes borrar la linea:

Código php:
Ver original
  1. <?php
  2. mysql_free_result($Recordset1);
  3. ?>

La podremos al final en su lugar cuando terminemos con esa página.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #13 (permalink)  
Antiguo 03/09/2009, 19:06
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Ok, se lo quité y funciona bien. Aquí vamos.
  #14 (permalink)  
Antiguo 04/09/2009, 14:18
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

perfecto, cuando llegue a casa terminamos el tuto.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #15 (permalink)  
Antiguo 05/09/2009, 11:00
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Primero que nada, lo mejor es hacer unos cambios al sistema de error. En vez de:


lo mejor es poner:

Código php:
Ver original
  1. if(isset($_POST['email']) && !empty($_POST['email']))

Igual abajo.

Código php:
Ver original
  1. elseif(isset($_POST['email']) && empty($_POST['email'])) $error = 'Por favor escriba su email';

Así php primero vera si la variable está seteada y luego si está vacía. Tambié creo que el número secreto debería ser mas seguro, así que ambien le agregué el timestamp a la variable:

Código php:
Ver original
  1. //timestamp
  2. $timestamp = time() + (7 * 24 * 60 * 60);
  3. //numero secreto
  4. $numero_secreto = $timestamp.'-'.rand(10000, 90000);
  5. //fecha
  6. $fecha = date('Y-m-d');

Ahora si, seguimos. Yo siempre uso la librería phpMailer para el envío de emails, pero como eso ya es mas complicado usaremos la funcion mail() de php.

Debo recordarte que necesitas un servidor SMTP para poder enviar emails desde tu servidor, osea, que si no tienes instalado uno en tu servidor local no podrás probar este sistema. Si has contratado un servidor remoto lo más seguro tiene un servidor SMTP. Si es así mejor has las pruebas en ese servidor.

Ahora, Necesitaremos las siguientes variables:

Código php:
Ver original
  1. ////// se envia el email
  2. //email donde se enviara el mensaje
  3. $hacia_email = $_POST['email'];
  4. //email de donde sale el mensaje
  5. $email_desde = "[email protected]";
  6. //titulo del mensaje
  7. $titulo_mensaje = 'Mensaje enviado desde mipagina.com';
  8. //mensaje
  9. $mensaje = "Para cambiar su password haga click aqu&iacute;:<br />
  10. <a href=\"http://mipagina.com/nuevo_pass.php?id=$numero_secreto\">http://mipagina.com/nuevo_pass.php?id=$numero_secreto</a><br />
  11. ";
  12. $headers  = 'MIME-Version: 1.0' . "\r\n";
  13. $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
  14. $headers .= 'From: '.$email_desde."\r\n";
  15. $headers .= 'Reply-To: '.$email_desde."\r\n";

En la variable '$email_desde' necesitas poner el email de donde quieres que salga el mensaje, el cual será el mismo al que se le podrá dar reply. También puedes cambiar el título del mensaje como el mensaje, pero necesitas enviar la dirección donde la persona cambiará su password. Entonces al final se envía el email. Si no se pudo enviar se muestra un error y si se pudo enviar le damos a la variable '$enviado' el valor de TRUE para no mostrar el formulario:

Código php:
Ver original
  1. //enviar email
  2. if(mail($hacia_email, $titulo_mensaje, $mensaje, $headers)) $enviado = TRUE;
  3. else $error = 'Hubo un erro al enviar el mensaje.';

De nuevo, vas a recibir este error si no tienes un servidor SMTP instalado:

Código HTML:
Warning: mail() [function.mail]: Failed to connect to mailserve...
Ahora te dejo el código completo:

Código php:
Ver original
  1. //si se envia el formulario
  2. if(isset($_POST['email']) && !empty($_POST['email'])){
  3.     //se regoge la variable POST
  4.     $colname_Recordset1 = "-1";
  5.     if (isset($_POST['email'])) {
  6.       $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['email'] : addslashes($_POST['email']);
  7.     }
  8.     //recorset
  9.     mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  10.     $query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString($colname_Recordset1, "text"));
  11.     $Recordset1 = mysql_query($query_Recordset1, $conn_pruebas_local) or die(mysql_error());
  12.     $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  13.     $totalRows_Recordset1 = mysql_num_rows($Recordset1);
  14.    
  15.     //si el email existe en la base dedatos
  16.     if($totalRows_Recordset1 > 0){
  17.         //timestamp
  18.         $timestamp = time() + (7 * 24 * 60 * 60);
  19.         //numero secreto
  20.         $numero_secreto = $timestamp.'-'.rand(10000, 90000);
  21.         //fecha
  22.         $fecha = date('Y-m-d');
  23.         //insert a la tabla del numero secreto
  24.         $insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass,codigo_recordar_pass,timestamp_recordar_pass,fecha_recordar_pass) VALUES (%s,%s,%s,%s)",
  25.             GetSQLValueString($_POST['email'], "text"),
  26.             GetSQLValueString($numero_secreto, "int"),
  27.             GetSQLValueString($timestamp, "int"),
  28.             GetSQLValueString($fecha, "date"));
  29.  
  30.         mysql_select_db($database_conn_pruebas_local, $conn_pruebas_local);
  31.         $Result1 = mysql_query($insertSQL, $conn_pruebas_local) or die(mysql_error());
  32.        
  33.         ////// se envia el email
  34.         //email donde se enviara el mensaje
  35.         $hacia_email = $_POST['email'];
  36.         //email de donde sale el mensaje
  37.         $email_desde = "[email protected]";
  38.         //titulo del mensaje
  39.         $titulo_mensaje = 'Mensaje enviado desde mipagina.com';
  40.         //mensaje
  41.         $mensaje = "Para cambiar su password haga click aqu&iacute;:<br />
  42.         <a href=\"http://mipagina.com/nuevo_pass.php?id=$numero_secreto\">http://mipagina.com/nuevo_pass.php?id=$numero_secreto</a><br />
  43.         ";
  44.         $headers  = 'MIME-Version: 1.0' . "\r\n";
  45.         $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
  46.         $headers .= 'From: '.$email_desde."\r\n";
  47.         $headers .= 'Reply-To: '.$email_desde."\r\n";
  48.        
  49. //enviar email
  50. if(mail($hacia_email, $titulo_mensaje, $mensaje, $headers)) $enviado = TRUE;
  51. else $error = 'Hubo un erro al enviar el mensaje.';
  52.        
  53.     }
  54.     //si no existe
  55.     else $error = 'Este email no existe en la base de datos';
  56. }
  57. //si el formulario esta vacio
  58. elseif(isset($_POST['email']) && empty($_POST['email'])) $error = 'Por favor escriba su email';

y el formulario con los cambios:

Código php:
Ver original
  1. <?php
  2. //si se ha enviado el email
  3. if($enviado != TRUE){
  4. //si hay error se muestra
  5. if(!empty($error)) echo $error;
  6. ?>
  7. <form id="form1" name="form1" method="POST" action="">
  8.   <table border="0" cellpadding="5" cellspacing="1" bgcolor="#999999">
  9.     <tr>
  10.       <td bgcolor="#CCCCCC">email</td>
  11.       <td bgcolor="#FFFFFF"><input name="email" type="text" id="email" value="<?php echo((isset($_POST["email"]))?$_POST["email"]:"") ?>" /></td>
  12.     </tr>
  13.     <tr>
  14.       <td colspan="2" bgcolor="#FFFFFF"><div align="center">
  15.         <input type="submit" name="button" id="button" value="enviar" />
  16.       </div></td>
  17.     </tr>
  18.   </table>
  19.   </form>
  20. <?php
  21. }else{?>
  22. <p>El mensaje ha sido enviado correctamente</p>
  23. <?php } ?>

Lo que queda es hacer la página que recibe al usuario y donde puede cambiar su password. Te sugiero que si vas a enviar emails los envíes desde el domain que usas en el email de salida o habrá la posibilidad de que tu IP se incluido en alguna lista de spam.

Bueno, espero que puedas probar el código. Me dices si tienes algún problema
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #16 (permalink)  
Antiguo 08/09/2009, 21:18
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Me va funcionando Juaniquillo, no tengo ningún problema. Continuemos, por favor.
  #17 (permalink)  
Antiguo 09/09/2009, 12:30
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Bien. Cuando llegue a casa seguimos.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #18 (permalink)  
Antiguo 14/09/2009, 18:35
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Hola Juaniquillo, ¿aún no llegas? :)
Espero la continuación, gracias.
  #19 (permalink)  
Antiguo 14/09/2009, 21:33
 
Fecha de Ingreso: septiembre-2009
Mensajes: 86
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Olvide contraseña con Dreamweaver

YO igual, justo lo que necesitaba..!!! todo bien hasta ahora.. gracias juan..
  #20 (permalink)  
Antiguo 19/09/2009, 13:06
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: Olvide contraseña con Dreamweaver

Lo siento chicos. Como siempre, la cantidad exorbitante de trabajo que tengo no me había dejado entrar al foro.

Antes de empezar, me di cuenta que el número secreto no se estaba almacenando correctamente en la base de datos. Debería ser el Timestamp, guión y el número. El problema está que el campo esta siendo validado como integer, no como text. En la página que hicimos hagan un cambio en el insert, en la parte que dice:

Código php:
Ver original
  1. GetSQLValueString($numero_secreto, "int"),

cámbienla por:

Código php:
Ver original
  1. GetSQLValueString($numero_secreto, "text"),

El campo 'codigo_recordar_pass' en la base de datos también tiene que ser 'varchar', aunque yo ya lo tenía así.

Lo que nos queda es crear la página 'nuevo_pass.php'. En mi ejemplo yo la cree en la raiz de mi website ya que ahí estoy enviando al usuario (mipagina.com/nuevo_pass.php). Ahora tenemos que recibir la variable enviada desde el email y verificar si existe. Para eso las funciones de DW nos sirven. Creamos un recordset para recibir la variable id:



Después hacemos un formulario donde el usuario pueda poner su nueva contraseña si el id es correcto:



y lo mostramos si el recordset no está vacío. Para esto escogemos el formulario. yo uso el 'code inspector' para tener más precisión:



Una ves escogido el formulario vamos al tab de 'Data' y escogemos 'show if recordset not empty':



Solo tenemos un recordset en la página así que escogemos ese y le damos ok. Ahora podemos mostrar un mensaje cuando el recorset esté vacío. Para eso escribimos el mensaje, lo escogemos y hacemos lo que hicimos arriba, pero esta vez escogemos 'show if recordset empty'. En mi caso se ve así:



Ahora pueden probar lo que tenemos. Si ven la página sola saldrá el mensaje. Si le agregan '?id=codigosecreto' (sustituyan 'numero secreto' por uno de la base de datos. Un ejemplo:

Código:
nuevo_pass.php?id=1253988188-59617
Así se mostrará el formulario.

Ahora, podemos hacer el update fácilmente con este formulario pero creo que debemos hacerlo mas seguro para que nadie haga un update directo (llámenme paranoico). Creamos algunos campos ocultos con información del recordset. son estos: email y número secreto:

Código html:
Ver original
  1. <input type="hidden" name="timestamp" id="timestamp" />
  2. <input type="hidden" name="email" id="email" />
  3. <input type="hidden" name="numerosecreto" id="numerosecreto" />



Ahora arrastramos los valores del recordset a su respectivos respectivos campos:





También, al campo de donde el usuario escribirá la contraseña yo la llamo 'password'. Entonces hacemos el update a la tabla de usuario para después alterarlo un poco:



Ponen al campo pass de la base de datos igual al campo password del formulario y al campo email de la base de datos igual al campo email del formulario. También escojan email como' primary key'. También envíen al usuario a otra pagina cuando se haga el update, En esa página se puede poner un mensaje de confirmación:



Ya con esto sólo el sistema funciona. Lo próximo es hacer unas modificaciones al update para hacerlo un poco mas seguro.

------------------------------------------------


(El próximo cambio es por si acaso están encryptando la contraseña usando md5. NO LO HAGAN SI NO ESTAN USANDO MD5 AL MOMENTO DE ALMACENAR LA CONTRASEÑA POR PRIMERA VEZ!!!)

No se si están usando md5 para encryptar sus contraseñas (algo bastante recomendable), pero por si acaso les digo donde hacerlo. Cambien:

Código php:
Ver original
  1. GetSQLValueString($_POST['password'], "text"),

por:

Código php:
Ver original
  1. GetSQLValueString(md5($_POST['password']), "text"),


------------------------------------------------

En el próximo y último mensaje haré unos cambios al update para hacerlo más seguro. Me dicen si tienen algún problema hasta ahora.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #21 (permalink)  
Antiguo 21/09/2009, 13:17
 
Fecha de Ingreso: octubre-2008
Mensajes: 165
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Olvide contraseña con Dreamweaver

Vamos bien amigo, ciertamente tus explicaciones son bien claras, se te agradece sobremanera.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:36.