[Tutorial] Crear un sistema de registro bбsico.
#1

Bueno.. Debido a las demandas de crear registro de users vнa web.. Acб les tratare de ayudar con uno pequeсo.. Espero que les sirva de algo

Registro / Login de usuarios.

Comenzando...
Primero debemos saber quй datos necesitarб nuestro usuario para registrarse. Lo mбs usual es Nick, Contraseсa y Correo. Comenzaremos creando una base de datos MySQL (O usando una que tengamos creada ya, a gusto) y aсadiendo una nueva tabla, que llamaremos jugadores. La tabla tendrб 4 campos (pueden ser mбs dependiendo el caso): id, nick, contra, correo. Donde id serб int(32), y el resto tinytext. Puedes crearla manualmente у automбticamente ejecutando la siguiente sentencia sql:

Код:
CREATE TABLE `jugadores` ( `id` INT( 32 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `nick` TINYTEXT NOT NULL ,
 `contra` TINYTEXT NOT NULL ,
 `correo` TINYTEXT NOT NULL 
) ENGINE = MYISAM
Bien. Eso habrб creado una tabla con los 4 campos, asignando al campo id como campo primario y de auto-incremento (Es decir, no serб necesario especificar un valor para este campo por cada usuario, se asignarб solo).

El formulario
Ya teniendo la tabla en nuestra base de datos, es necesario hacer el formulario por el cual los usuarios ingresarбn sus datos para registrarse, para luego insertarlos. Esta es la parte mбs sencilla. Haremos un formulario que envнe los datos a registrar.php por medio del mйtodo POST, y que conste de 4 campos: Nick, Contraseсa, Confirmar contraseсa y Correo.

Код:
<form method="post" action="registrar.php">
 Usuario:<br />
 <input type="text" name="r_user" /><br />
 Contraseсa:<br />
 <input type="password" name="r_pass" /><br />
 Confirmar contraseсa:<br />
 <input type="password" name="r_pass_c" /><br />
 Correo:<br />
 <input type="text" name="r_mail" /><br />
 <br />
 <input type="submit" value="Registrarse" />
</form>
Hay que prestar atenciуn al nombre de cada campo (El atributo 'name'), porque ese serб el nombre del elemento cuando lo manipulemos con php. Bien, ahora pasamos al cуdigo php.

El archivo registrar.php
Este archivo, al que se le enviarбn las variables, constarб de 3 partes: Comprobaciуn, ejecuciуn y confirmaciуn (Que lindo ha quedado :P ). En la primera parte, nos aseguraremos de que se compruebe que los datos son correctos, en la segunda, aсadiremos los usuarios a la base de datos, y en la tercera mostraremos el mensaje de йxito.
Comenzamos con la comprobaciуn:

Код:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
 // Ahora comprobamos lo mismo para el mail
 if($r_mail != "") {
  // Para la contraseсa... {
  if($r_pass != "") {
   // Bien, ahora comprobaremos que las 2 contraseсas escritas sean iguales:
   if($r_pass === $r_pass_c) {
    /* Todo comprobado. Aquн irб el cуdigo de ejecuciуn.
    Pero antes, cerraremos los ifs con el mensaje de error */
   } else {
    echo 'Las contraseсas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrбs</a>';
   }
  } else {
   echo 'Debes ingresar una contraseсa.<br /><a href="history.back();return false;"<< Atrбs</a>';
  }
 } else {
  echo 'Debes ingresar una direcciуn de correo electrуnico.<br /><a href="history.back();return false;"<< Atrбs</a>';
 }
} else {
 echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrбs</a>';
}
?>
Ahora pasamos al centro de los ifs, donde ha quedado el espacio para la ejecuciуn. Simplemente habrб que ejecutar una sentencia sql y mostrar el mensaje de confirmaciуn. Veamos:

Код:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$r_user = htmlentities($_POST['r_user'], ENT_QUOTES);
$r_pass = htmlentities($_POST['r_pass'], ENT_QUOTES);
$r_pass_c = htmlentities($_POST['r_pass_c'], ENT_QUOTES);
$r_mail = htmlentities($_POST['r_mail'], ENT_QUOTES);

// Comprobamos que se haya escrito un nombre de usuario
if($r_user != "") {
 // Ahora comprobamos lo mismo para el mail
 if($r_mail != "") {
  // Para la contraseсa... {
  if($r_pass != "") {
   // Bien, ahora comprobaremos que las 2 contraseсas escritas sean iguales:
   if($r_pass === $r_pass_c) {
    // Todo comprobado.
    // Ejecutamos la sentencia
    mysql_query("INSERT INTO jugadores(nick, contra, correo) VALUES('{$r_user}','{$r_pass}','{$r_mail}')");
    // Ahora mostramos la confirmaciуn:
    echo 'Te has registrado con йxito. Ahora puedes iniciar sesiуn con tu usuario y contraseсa';
   } else {
    echo 'Las contraseсas ingresadas no coinciden.<br /><a href="history.back();return false;"<< Atrбs</a>';
   }
  } else {
   echo 'Debes ingresar una contraseсa.<br /><a href="history.back();return false;"<< Atrбs</a>';
  }
 } else {
  echo 'Debes ingresar una direcciуn de correo electrуnico.<br /><a href="history.back();return false;"<< Atrбs</a>';
 }
} else {
 echo 'Debes ingresar un nombre de usuario.<br /><a href="history.back();return false;"<< Atrбs</a>';
}
?>
Y asн es como hemos logrado un sistema simple de usuarios. Claro que se pueden agregar muchas mбs comprobaciones avanzadas, como comprobar la sintaxis del mail (Que contenga @ y punto, etc), que el usuario/contraseсa sea de mбs de 3 caracteres, que el usuario no exista antes, envнo de correo de activaciуn de cuenta y demбs. Pero eso serб para otro dнa :P

Ahora viene la parte mбs interesante. Iniciar sesiуn y proteger pбginas...
Inicio de sesiуn
Comenzaremos creando un formulario mбs simple que el de registro, usuario y contraseсa. Que envнe los datos a login.php.

Код:
<form method="post" action="login.php">
 Usuario:<br />
 <input type="text" name="l_user" /><br />
 Contraseсa:<br />
 <input type="password" name="l_pass" /><br />
 <br />
 <input type="submit" value="Iniciar sesiуn" />
</form>
Fбcil, їNo? Bien, ahora el archivo login.php:

Код:
<?php
// Primero, transformamos los datos recibidos en entidades html para evitar inyecciones sql
$l_user = htmlentities($_POST['l_user'], ENT_QUOTES);
$l_pass = htmlentities($_POST['l_pass'], ENT_QUOTES);
// Ahora creamos una sentencia sql en busca del usuario ingresado:
$select = mysql_query("SELECT * FROM jugadores WHERE nick='{$l_user}'");
// Ahora comprobamos que el usuario exista.
if(mysql_num_rows($select) != 0) {
 // Bien, ahora que sabemos que existe, creamos un bucle para obtener los datos...
 while($row = mysql_fetch_array($select)) {
  /* Ahora con los datos obtenidos, comprobamos que la contraseсa sea correcta. */
  if($l_pass) {
   // En caso de que estй correcto, establecemos la sesiуn como iniciada. Para ello, usamos cookies.
   setcookie('session', md5($row['user'] . $row['pass']), time()+3600);
   // Tambiйn creamos una cookie con la id del usuario...
   setcookie('session_id', $row['id'], time()+3600);
   // El contenido de la cookie es usuario+contraseсa encriptados, y durarб una hora.
   // Ahora cerramos los ifs, con sus respectivos mensajes opuestos.
  } else {
   echo 'Usuario encontrado, pero la contraseсa es incorrecta.<br /><a href="history.back();return false;"<< Atrбs</a>';
  }
  // La siguiente llave cierra el bucle while, no necesita else.
 }
} else {
 echo 'El usuario no existe.<br /><a href="history.back();return false;"<< Atrбs</a>';
}
?>
Ya tenemos nuestro login. їQuй mбs? Listo, esto estб terminado...
No molesten...
Dije que no...
Ok, hagamos el logout para completar esto.

Cerrar sesiуn
Para cerrar la sesiуn, simplemente nos aseguramos de que las cookies que hemos insertado hayan caducado. Para esto, las "sobrescribimos" y modificamos su fecha lнmite a una fecha pasada. Bastarб con un enlace al archivo logout.php para esto.
logout.php:

Код:
<?php
// Comprobamos que haya alguna sesiуn iniciada.
if($_COOKIE['session']) {
 // Ahora sobreescribimos las cookies.
 setcookie('session', 'dada', time()-3600);
 setcookie('session_id', 'dada', time()-3600);
 // Mensaje de confirmaciуn.
 echo 'Sesiуn cerrada exitosamente.';
}?>
El contenido de las cookies modificada no importa, pues se eliminarбn instantбneamente.

Bien... Ahora terminamos esto al fin con la funciуn para proteger pбginas. La siguiente funciуn php debe ser incluida por las pбginas protegidas.

Код:
<?php
function isonline() {
 // Comprobamos que existan las cookies..
 if($_COOKIE['session'] && $_COOKIE['session_id']) {
  // Transformamos las cookies en entidades html para evitar inyecciones sql
  $session = htmlentities($_COOKIE['session'], ENT_QUOTES);
  $session_id = htmlentities($_COOKIE['session_id'], ENT_QUOTES);
  // Armamos con la id guardada la sentencia sql para buscar el usuario.
  $find = mysql_query("SELECT * FROM jugadores WHERE id='{$session_id}'");
  // Comprobamos que el usuario exista.
  if($mysql_num_rows($find) != 0) {
   // Armamos el bucle para obtener la informaciуn del usuario..
   while($row = mysql_fetch_array($find)) {
    // Comprobamos que la cookie 'session' coincida con los datos guardados..
    if(md5($row['user'] . $row['pass']) == $_COOKIE['session']) {
     // Devolvemos true.
     return 1;
    }
   }
  }
 }
}
?>
Ok. Ahora, para proteger una pбgina, debemos llamar la funciуn dentro de una comprobaciуn. Antes de mostrar el contenido oculto, escribimos esto:

Код:
<?php
if(isonline()) {
?>
Escribimos todo el contenido privado, y finalmente cerramos el if:


Код:
<?php
}
?>
Tambiйn podemos agregar un else con un cartel que diga que es necesario iniciar sesiуn.

Eso es todo, amigos. No he probado nada del tutorial, lo he escrito asн simplemente. Si encuentran algъn error, agradecerнa que me lo dijeran
Que quede claro que esto es algo bбsico y quizб algo inseguro, pero es solamente para que se den una idea, mejorarlo queda en ustedes :P

Saludos.
Reply
#2

Bien colorido :P
Reply
#3

Perfecto TUT elvago! sige asi!!
Reply
#4

alto tutorial, muy util, por lo menos para mi
Reply
#5

Quote:
Originally Posted by the_chaoz
alto tutorial, muy util, por lo menos para mi
+1
Reply
#6

Muy bueno, no sabнa usar cookies :P
Reply
#7

Bien.
Reply
#8

elvago tu eres genial!

gracias por el tuto

pero me lo podrias dar hecho y con register con dialogs ?

solo si tienes tiempo
Reply
#9

Lo siento Karkanos.. Te soy sincero en Pawn soy algo bruto los Dialogs.. Todavнa no los estudio a fondo
Reply
#10

am bueno pero si entenderia un poco mas el php y como usarlo seria genial para aprender a aserlo
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)