Registro de usuarios desde cero.

No hay problema por el enlace externo. En este mundillo no creo en las competencias. Quién sabe si algún día no hacemos algo conjunto con ellos! je je je. Gracias!
El final de nuestro archivo registro.php dice así:

...................
.....................
else
        {
        //introducimos el nuevo registro en la tabla users
        $hasheada= hash('sha256', $password) ;
        $salteada = saltear();
        $hasheada = hash('sha256', $salteada . $hasheada);
        mysql_query("INSERT INTO $tabla (nick,password,salteada,email) values ('$nick','$hasheada','$salteada','$email') ");  
        echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p>";
        // damos la opcion de logerase
        echo '<br /><a href="login.php">Quieres logearte?</a>';
        }
    mysql_free_result($cuantosnicks);  //liberamos memoria
    mysql_free_result($cuantosemails); //liberamos memoria
   }
?>

Pues, en lugar de añadir esos datos en la tabla, vamos a generar el código aleatorio que....mmmm... em.... debería crear otro campo para guardarlo y poder luego rescatarlo y comprobar si es igual al del email pero.. no se, quizás elimino al nuevo campo 'estado' lo de ENUM y así lo guardo en ese y ahorro campos. Guardaría en el campo 'estado' el código y luego si es válido le coloco allá el valor 'activo'. Así también puedo ver quienes estan inactivos por falta de verificación del código (todos los que tengan de valor un código) y quienes simplemente se han dado de baja o los he castigado ('inactivo')....

Lo pienso mientras bajo a comprar pan, je je je
Moderación escribió:No hay problema por el enlace externo. En este mundillo no creo en las competencias. Quién sabe si algún día no hacemos algo conjunto con ellos! je je je. Gracias!

Por ejemplo la conferencia jajaja
Sí, se podría hacer que al registrarte se guarde en el campo el código, y cuando entra en el enlace se activa y se sustituye el código por Activo.

Saludos!
Ah, por cierto, respecto a la opción de recuperar contraseña hay que tener cuidado.
Creo que se debería generar una nueva segura (Letras y números conjuntos) pero que para entrar a la cuenta para poder cambiarla valgan esa y la anterior porque... imagínate que acierto el email del usuario "Pepe"
Hago que le envíen una nueva contraseña y por tanto, la otra ya no le vale y como Pepe no revisa a menudo su correo no sabe por qué pasa.

No sé si me explico jeje
Bien bien, en lugar de recuperar la contraseña lo que haremos será generar una nueva aleatoria y darle la opción que desde su panel de control pueda cambiarla por la que desee (siempre introduciendo la antigua). Pero a esto de recuperar aún no hemos llegado.

Tú comentas que otro usuario pueda solicitarla y fastidiar la del usuario verdadero....mm.. ok, tienes toda la razón y lo tendré en cuenta. Lo mejor es que de nuevo, tenga que verificar la acción con otro mensaje de correo. Así no habrá problema, no?
Síp, también sirve como solución el email.
Si al final mira qué útil es esto de los correos jaja
[;)] Si, al final van a servir, je je je.

Bueno, pues sigo entonces basándome en lo dicho antes.

El campo 'estado' ya no va a ser tipo ENUM sino CHAR. Así puede contener además de los valores 'activo' e 'inactivo', el código aleatorio que se va a generar y que será enviado al usuario para que confirme su registro.

Para modificar ese campo, regreso al SQL del phpMyAdmin y escríbole esto:

ALTER TABLE 'usuarios' CHANGE 'estado' 'estado' CHAR( 12 ) NOT NULL

Es decir, modifico el campo 'estado' de la tabla 'usuarios', pasándola al tipo CHAR de 12 carácteres y continuando no pudiendo ser nulo su valor.

Ahora admite además de los valores 'activo' y 'inactivo' los valores como '123456789012' que serán los códigos aleatorios comentados.
Bueno, siguiendo estas ideas pasamos a reformar el código para incluir esta mejora.

El final del código del archivo registro.php era este:

.............................
    else
        {
        //introducimos el nuevo registro en la tabla users
        $hasheada= hash('sha256', $password) ;
        $salteada = saltear();
        $hasheada = hash('sha256', $salteada . $hasheada);
        mysql_query("INSERT INTO $tabla (nick,password,salteada,email) values ('$nick','$hasheada','$salteada','$email') ");  
        echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p>";
        // damos la opcion de logerase
        echo '<br /><a href="login.php">Quieres logearte?</a>';
        }
    mysql_free_result($cuantosnicks);  //liberamos memoria
    mysql_free_result($cuantosemails); //liberamos memoria
   }
?> 

Y lo vamos a cambiar. Para empezar añadiendo la variable $codigodevalidacion que será generado de forma aleatoria, por arte de magia, con esta línea:

 $codigodevalidacion = rand(000000000000,999999999999);

y reformamos qué valores de qué variables se van a incluir en la tabla, quedando el bloque anterior así:

.............................
    else
        {
        //introducimos el nuevo registro en la tabla users, pero inactivo hasta correo de verificación
        $hasheada= hash('sha256', $password) ;
        $salteada = saltear();
        $hasheada = hash('sha256', $salteada . $hasheada);
        $codigodevalidacion = rand(000000000000,999999999999);
        mysql_query("INSERT INTO $tabla (nick,password,salteada,email,estado) values ('$nick','$hasheada','$salteada','$email','$codigodevalidacion') "); 
        echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p><p>La cuenta aún no está activa hasta que se verifique mediante el correo que se ha enviado al Email con el que se ha registrado. Revise por tanto su correo por favor.</p>";
        // damos la opcion de logerase, por si ha respondido al correo de verificación y aún tiene esta página abierta.
        echo '<br /><a href="login.php">Quieres logearte?</a>';
        }
    mysql_free_result($cuantosnicks);  //liberamos memoria
    mysql_free_result($cuantosemails); //liberamos memoria
   }
?> 

Genial, perfecto. Pero no hemos conseguido capar la entrada de este usuario ni que se le envie el correo. Vamos ahora a modificar el archivo chequeo.php para que el usuario que aún no se ha verificado no consiga entrar en el sistema de registro, oki?
Lo dicho, vamos a por el archivo chequeo.php!

Tenemos que ver si el usuario que intenta logearse, está en estado activo, inactivo o esperando confirmación, es decir, si hay un código en el valor del campo 'estado', no? Esto lo haremos tras confirmar que el usuario existe, que la contraseña es correcta y antes de crear la sesión claro.

Ahora me alegro de haber puesto tantos comentarios dentro del código! ja ja ja ja

Bien, en ese lugar que digo, miraremos si el usuario está activo, inactivo o esperando verificación y en función de cada cosa pondremos lo que corresponda. Es una buena ocasión para aplicar un.... cómo se llamaba... ah, un CASE o SWITCH!

.................................
// login correcto, continuamos... 
$estado=$datosdelusuario["estado"];

switch ( $estado )
  {
     case 'activo':  // Activo, le damos paso al sistema de registro.
         session_register("usuario"); //registramos la variable usuario que contendrá el nick del user
         session_register("idusuario"); //registramos la variable idusuario que contendrá la id del user
         $_SESSION[usuario] = $datosdelusuario["nick"]; //damos el nick a la variable usuario
         $_SESSION[idusuario] = $datosdelusuario["id"]; //damos la id del user a la variable idusuario
         header("Refresh: 4; URL=login.php");
         echo '<br /><p>Logeado compañero'."$_SESSION[usuario]".'.</p>';
     break;
     case 'inactivo':  // Estado inactivo, informar al usuario.
         echo "<p>Su cuenta existe y los datos de acceso son correctos, pero por algún motivo su cuenta está desactivada</p><p>Contacte con el administrador de esta web para arreglar el problema. Gracias.</p>";
     break;
     default: // Registrado y validado, activar la cuenta.
         echo "<p>Su cuenta está pendiente de ser verificada a través del correo que se le ha enviado al correo con el que se registró. Chequee su email para activarla.</p>."      ;
  }

?> 
Y ahora? Nos falta hacer que el correo salga hacia el usuario y... la página a la que se envía tras pulsar el enlace del correo para activar la cuenta.

Vamos primero a la página a la que se manda a l usuario cuando hace click en el link del correo de verificación. Sería un archivo nuevo en el que, para empezar se recoge el valor GET que viene en la URL, el código aleatorio.

Nombre del archivo: verificar_cuenta.php
<?php
$codigo = $_GET['codigo'];
include_once('configuracion.php');
$consulta = mysql_query(" SELECT * FROM ".$tabla." WHERE estado='".$codigo."' ");
$datosdelusuario = mysql_fetch_array($consulta, MYSQL_ASSOC);
if ($datosdelusuario[estado] == $codigo)
     {
     mysql_query(" UPDATE $tabla SET estado='activo' WHERE estado='$codigo' ");
     echo "<p>Cuenta verificada, gracias y bienvenido <b>$datosdelusuario[nick]</b>.</p>";
     echo "<p>Quiere <a href=\"login.php\">logearse ahora</a>?</p>";
     }
else // Si no existe ese codigo en la tabla....
     {
     echo "<p>El código de verificación no es valido.</p>";
     }
;?>

Pero para llegar a esta página, necesitamos una url, del tipo http : //www .dominio/verificar_cuenta.php?codigo=123456789012 o similar. Es la que hemos de enviar al usuario a su correo electronico. Vamos a ver cómo se lo enviamos....
No la había usado antes. La función para enviar mails mediante php es mail(). Qué originales, no?

mail($destino, $asunto, $mensaje, $encabezados);

De modo que, en el archivo registro.php que teníamos, cuyo código terminaba así:

...................
..................
       //introducimos el nuevo registro en la tabla users, pero inactivo hasta correo de verificación
        $hasheada= hash('sha256', $password) ;
        $salteada = saltear();
        $hasheada = hash('sha256', $salteada . $hasheada);
        $codigodevalidacion = rand(000000000000,999999999999);
        mysql_query("INSERT INTO $tabla (nick,password,salteada,email,estado) values ('$nick','$hasheada','$salteada','$email','$codigodevalidacion') ");
        echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p><p>La cuenta aún no está activa hasta que se verifique mediante el correo que se ha enviado al Email con el que se ha registrado. Revise por tanto su correo por favor.</p>";
        // damos la opcion de logerase, por si ha respondido al correo de verificación y aún tiene esta página abierta.
        echo '<br /><a href="login.php">Quieres logearte?</a>';
        }
    mysql_free_result($cuantosnicks);  //liberamos memoria
    mysql_free_result($cuantosemails); //liberamos memoria
   }
?> 

Añadimos algunas líneas para dejarlo así:

..................
......................
       //introducimos el nuevo registro en la tabla users, pero inactivo hasta correo de verificación
        $hasheada= hash('sha256', $password) ;
        $salteada = saltear();
        $hasheada = hash('sha256', $salteada . $hasheada);
        $codigodevalidacion = rand(000000000000,999999999999);
        mysql_query("INSERT INTO $tabla (nick,password,salteada,email,estado) values ('$nick','$hasheada','$salteada','$email','$codigodevalidacion') ");
        $mensaje="Hola $nick. Acabas de registrarte en $midominio pero has de activar la cuenta haciendo clic en el siguiente enlace: Enlace de activación: http://$midominio/verificar_cuenta.php?codigo=$codigodevalidacion";
        // Enviando el correo...
        mail($email, "Validación de su nueva cuenta en $midominio", $mensaje, "From: $miemail");
        // Aviso para el usuario.
        echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p><p>La cuenta aún no está activa hasta que se verifique mediante el correo que se ha enviado al Email con el que se ha registrado. Revise por tanto su correo por favor.</p>";
        // damos la opcion de logerase, por si ha respondido al correo de verificación y aún tiene esta página abierta.
        echo '<br /><a href="login.php">Quieres logearte?</a>';
        }
    mysql_free_result($cuantosnicks);  //liberamos memoria
    mysql_free_result($cuantosemails); //liberamos memoria
   }
;?>

Eso si, la función mail() de php requiere que tu servidor te la permita usar. Nos dejará?
Habrás visto que he añadido un par de variables. $miemail y $midominio

He pensado que para no tener que ir cambiando esos datos en sabe Dios qué archivos, va a bastar con rellenar su valor con los vuestros definiendo estas variables en el archivo configuración, al igual que los de acceso a la base de datos. De este modo, ese será el único archivo a retocar una vez se termine este sistema de registro de usuarios, oki?

De modo que añadimos esas definiciones en el archivo configuracion.php:

<?php

$dbhost="localhost"; //Host del mysql
$dbuser="xxxx_xxxx"; //Usuario del mysql
$dbpass="xxxxxxxxxxxxxx"; //Password del mysql
$db="xxxx_xxxxxxx"; //db donde se creará la tabla users
$tabla="usuarios"; //nombre de la tabla de usuarios

//conectamos y seleccionamos db
mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$db");

//Datos mios
$miemail="[correo eliminado]";  // Lo usa el archivo registro.php
$midominio="midominio.com";  // Lo usa el archivo registro.php

//Comenzamos la sesión
session_start();

;?>
Me apunto por acá que con $_SERVER[REMOTE_ADDR]; puedo captar la IP de un usuario. Quizás sea bueno para guardarla y detectar usuarios con dos cuentas, o para banear a usuarios tras x intentos de acceso en un corto periodo de tiempo, verdad? Ya lo usaremos, seguro ;=)
Woap, recién veo este post, tiene 8 páginas, luego me lo leo y updateo para expresar seguramente mi agradecimiento (?)

Saludos!!
Genial, que necesito vuestro punto de vista antes de pasar esto a lecciones de CCTW! je je je.

Un abrazo, yo me voy a la cama que ya es hora, ja ja ja
Te lo estás currando mucho Jorge! Gracias!!

Lo que me pregunto es cómo es posible banear a un usuario durante X tiempo y que automáticamente se desbanee cuando pase ese tiempo :confused:
Pillar la ip.de.un indeseable ya has visto que es facil. habra que vuarsar la ip en una tabla. luego crear una tarea que se ejecute cada cierto tiempo de forma automatica para comprobar esos usuarios baneados y el tiempo que ha pasado. en servidores estos autoejecutables se llaman algo asi como cron. hay que investigar, peri somos expertos en eso. je je je. ups que complicao escribir con el movil jajaja
Jajaja, ya pensé que era Carlitos :rolleyes:
Sí, me suena algo así... Cron Jobs puede ser?
Pues no creas, que ya usa el movil mejor que yo este Carlitos, je je je.

Si, podría ser eso de los cron jobs, me suena, pero aun no he profundizado mucho en ellos.
Sí, acabo de mirarlo, cron jobs jejeje

Buenísimo el tema Kaiser! Si puedo ahora me lo leo a fondo!
Hola a todos los crack que están ayudando a crear este sistema yo tengo el Mio pero e copiado algunas mejoras que se le están poniendo a este y las e implementado en mi pagina la pregunta seria la siguiente ¿Si a alguien le a pasado que cuando un usuario se registra se produce un doble registro? Esta accion no es siempre me aparece a mi que esto se produce por algún refrech de la pagina o la otra opcion es que alguien este molestado, la segunda es poco probable pero posible. No coló que el código pues no tiene sentido pues mi consulta es si a alguien le a pasado, cabe resaltar que el formulario berifica si el nick ya existe pero aun asi el
Doble registro ocurre y no logro dar en que circunstancias ocurre.
Agradeceré cualquier luz
Tal vez tengas doble insert into , de mysql query o no compruebas bien los datos es decir que verifique si el usuario existe este correcto, lo mejor seria crear un nuevo tema con tu duda y pongas el codigo y enseguida le hecho un vistazo

Saludos!