Comunidad PHPeros

Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: Joel en 27 de Diciembre de 2011, 01:15:09 am

Título: [PHP-Snippet] Sistema de Usuarios y Restricciones [+CSS][NUEVA VERSIÓN]
Publicado por: Joel en 27 de Diciembre de 2011, 01:15:09 am
(http://creative-geeks.com/blog/wp-content/themes/arras-theme/library/timthumb.php?src=http://creative-geeks.com/blog/wp-content/uploads/2012/06/phpthumb.jpg&w=630&h=225&zc=1)

¡Hola amigos y amigas de Phperos.net! Les traigo un snippet (?) (http://es.wikipedia.org/wiki/Snippet) de un Sistema de Usuarios, tiene inicio de sesión, registro y restricción de página. Cabe aclarar que hice lo posible para que este código se fusionara y funcione perfectamente en sus webs, hay le agregue unas cuantas cosas mas, agradezco el código a http://phpsnips.com/ (http://phpsnips.com/).

Funciona perfectamente, cualquier error reportenlo.  :D

NOTA: Agregue la función "recordarme" para que se conecten automáticamente al entrar a la página  :P



1.- Nos bajamos el archivo CSS para darle estilo a nuestro Sistema de Usuarios (OPCIONAL)

Citar
http://www.sendspace.com/file/iccjsq (http://www.sendspace.com/file/iccjsq)

2.- Insertamos nuestra tabla de datos en PHPMyAdmin

CREATE TABLE IF NOT EXISTS `members` (
  `id` int(50) NOT NULL AUTO_INCREMENT,
  `username` varchar(500) NOT NULL DEFAULT '',
  `password` varchar(500) NOT NULL DEFAULT '',
  `email` varchar(500) NOT NULL DEFAULT '',
  `reg_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

3.- Creamos el archivo de conexión a la Base de Datos.

Connect.php
Citar

<?php
#ACCOUNT DATA MYSQL
define('DB_SERVER','el server');
define('DB_NAME','nombre de la db');
define('DB_USER','usuario de la db');
define('DB_PASS','contraseña');

#CONNECT TO THE DATABASE
$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
mysql_select_db(DB_NAME,$connection);

#SET CHARSET
mysql_query("SET names UTF8");
 ?>

4.- Hacemos nuestro lugar de inicio de sesión, para que puedan entrar los usuarios.

Login_Page.php
Citar

<link rel="stylesheet" href="css/d13.css">
<div class="fnews">
<form action="Verify.php" method="POST" enctype="multipart/form-data">
   Por favor, escriba los datos necesarios para iniciar sesi&oacute;n:
<br>
<br>

Nombre de Usuario:
<input type="text" value="<?php
echo $_COOKIE['remember_me']; ?>" name="username" placeholder="Nombre de usuario" />
Contraseña:
<input type="password" name="password" placeholder="Contraseña" />
<div align="right" style="padding-top:5px; padding-bottom:5px;">¿Recordarme? <input type="checkbox" name="remember" <?php if(isset($_COOKIE['remember_me'])) {
echo 'checked="checked"';
}
else {
echo '';
}
?> ></div>
<input name="login" type="submit" class="m" value="Iniciar sesión">
</form><br><br>
<strong>¿No tienes una cuenta? Registrate gratis</strong> <a class="sm" href="Register.php"><strong>aquí</strong></a></div>

5.- Creamos el registro para los nuevos miembros que se unan a la página.

Register.php
Citar

<?php
session_start();
include("Connect.php");
?>
<link rel="stylesheet" href="css/d13.css">
<H1>Crear una nueva cuenta</H1><br>
<?php
    if(isset($_POST['register'])) { // Check that the data sent from the form
    # search the database to see if the user name has been taken or not
    $query = sprintf("SELECT * FROM members WHERE username='%s' LIMIT 1",mysql_real_escape_string($_POST['username']));
    $sql = mysql_query($query);
    $row = mysql_fetch_array($sql);
    #check too see what fields have been left empty, and if the passwords match
$not_blank = count_chars($_POST['username'], 1);
        if(!empty($not_blank[32])) {
$error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">El nombre de usuario no puede tener espacios en blancos. Por favor, inténtalo de nuevo.</font></b></div></p>';
}
    if($row||empty($_POST['username'])|| empty($_POST['email'])||empty($_POST['password'])|| empty($_POST['re_password'])||$_POST['password']!=$_POST['re_password']){
        # if a field is empty, or the passwords don't match make a message
$error = 'Revisa los siguientes errores:';
        if(empty($_POST['username'])){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">El nombre de usuario no puede estar vacío.</font></b></div></p>';
        }
        if(empty($_POST['password'])){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">La contraseña no puede estar vacía.</font></b></div></p>';
        }
        if(empty($_POST['re_password'])){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">Debes repetir tu contraseña.</font></b></div></p>';
        }
        if($_POST['password']!=$_POST['re_password']){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">Al parecer, las contraseñas no coinciden.</font></b></div></p>';
        }
if(empty($_POST['email'])){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">Es necesario que nos proporciones un e-mail.</font></b></div></p>';
        }
        if($row){
            $error .= '<p><div style="background-color:#FFBABA; border-radius: 4px; padding: 10px;"><b><font color="#D8000C">El nombre de usuario que has escogido ya existe en nuestro sistema.</font></b></div></p>';
        }
    }else{
        # If all fields are not empty, and the passwords match,
        # create a session, and session variables,
$password = mysql_real_escape_string($_POST['password']);
$password_md5 = md5($password); // encrypt the entered password with md5
$query_register = "INSERT INTO members (username,email,password,reg_date) VALUES ('".mysql_real_escape_string($_POST['username'])."', '".mysql_real_escape_string($_POST['email'])."', '".$password_md5."', NOW())";
if (mysql_query($query_register) or die (mysql_error())) {

# Redirect the user to a login page
        echo "<p><div style=\"background-color:#DFF2BF; border-radius: 4px; padding: 10px;\"><b><font color=\"#4F8A10\">¡Tu cuenta ha sido creada con éxito! Por favor, espera mientras lo redireccionamos a la página principal (3 seg).</font></b></div><meta http-equiv=\"refresh\" content=\"3;URL=Login_Page.php\"></p>";

} else {
        echo "<p><div style=\"background-color:#FFBABA; border-radius: 4px; padding: 10px;\"><b><font color=\"#D8000C\">¡Oops! Ha ocurrido un error inesperado, inténtalo de nuevo.</font></b></div></p>";

}
    }
# echo out each variable that was set from above,
# then destroy the variable.
if(isset($error)){
    echo $error;
    unset($error);
}
    }else {
?>
        ¡Bienvenid@ al registro! Por favor, para que tengas acceso a mas privilegios, es necesario que crees una cuenta. No te tomará mucho tiempo.
        <?php
    }
?> 
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="POST" enctype="multipart/form-data">
<div align=center>
  <h3>Datos principales: </h3>
<TABLE class="gp">

<TR>
  <TD CLASS="slim">Usuario:</TD>
  <TD colspan=2><input name="username" type="text" title="Solo esta permitido caracteres alfanuméricos" maxlength="15" pattern="[a-zA-Z0-9]+" /></TD></TR>
<TR>
  <TD CLASS="slim">Correo electrónico:</TD>
  <TD><input type="text" name="email" pattern="[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+" title="El e-mail tiene que tener el siguiente formato: user@site.com" /></td><td>
</TD></TR>
<TR>
  <TD CLASS="slim">Contraseña:</TD>
  <TD><input type="password" name="password" pattern="[a-zA-Z0-9]+" title="Solo esta permitido caracteres alfanuméricos" /></TD></TR>
<TR>
  <TD CLASS="slim">Repite contraseña:</TD>
  <TD><input type="password"  name="re_password" /></TD></TR>
</TABLE><br>
  PHP Snippets - Sistema de Usuarios<br>
  <br>
  </p>


  <input name="register" type="submit" class="sum" VALUE="¡Registrar cuenta!">

</div>
</form>

6.- Ahora que tenemos todo lo esencial, creamos el archivo de verificación al iniciar sesión.

Verify.php
Citar

<?php
session_start();
include("Connect.php");
// Login Function
    if(isset($_POST['login'])) { // Check that the data sent from the form
        if(empty($_POST['Username']) || empty($_POST['Password'])) {
            echo "<div style=\"background-color:#FFBABA; border-radius: 4px; padding: 10px;\"><font color=\"#D8000C\"><strong>¡Oops! Parece que has dejado algún campo vacío.</strong></font></div>";
        }else {
            $username = mysql_real_escape_string($_POST['Username']);
            $password = hash('md5', mysql_real_escape_string($_POST['Password']));
            $sql = mysql_query("SELECT * FROM members WHERE username='".$username."' AND password='".$password."' LIMIT 1");
            if(mysql_num_rows($sql) == 1){
                $row = mysql_fetch_array($sql);
                $_SESSION['id'] = $row['id'];
                $_SESSION['username'] = $row["username"];
$_SESSION['logged'] = TRUE;
if($_POST['remember']) {
$year = time() + 31536000;
setcookie('remember_me', $_POST['Username'], $year);
}
elseif(!$_POST['remember']) {
if(isset($_COOKIE['remember_me'])) {
$past = time() - 100;
setcookie(remember_me, gone, $past);
}
}
            echo "<div style=\"background-color:#DFF2BF; border-radius: 4px; padding: 10px;\"><font color=\"#4F8A10\"><strong>Ingresando al sistema... por favor, espera mientras es redireccionado al panel de usuario (3 seg)</strong></font></div><meta http-equiv=\"refresh\" content=\"3;URL=Main.php\">";
            }else {

                echo "<div style=\"background-color:#FFBABA; border-radius: 4px; padding: 10px;\"><font color=\"#D8000C\"><strong>Has ingresado datos erróneos, ¿seguro que no has olvidado tu contraseña o el nombre de usuario?</strong></font></div>";

            }
        }
    }else {
header("Location: Login_Page.php");     
exit;
    }
?>

7.- Por ultimo, para concretar este tutorial, haremos la página privada que solo el usuario registrado puede ver:

Main.php
Citar

<?php
session_start();
include("Connect.php");
?>
<link rel="stylesheet" href="css/d13.css">
<?php
    if($_SESSION['logged']==TRUE) {
?>

<H1>Página privada de usuarios</H1><br>
<div class="fnews">
   ¡Hola, <? echo("$_SESSION[username]");?>! Eres un usuario registrado, por lo tanto, puedes ver esta página.
</div>

<?php
    }else {
?>
No tienes permisos para ver esta página... ¡Inicia sesión!
<?php
    }
?>

Si quieres agregar páginas privadas, lo unico que tienes que hacer es esto...

Citar

<?php
session_start();
include("Connect.php");
if(!$_SESSION['logged']){
    header("Location: Login_Page.php");
    exit;
} // Si el usuario no esta conectado, no podrá ver esta página y sera redirigido a la página de inicio de sesión
?>

Holaaaaaaaaaaaaaaaaaaaaaaaaaa. Solo usuarios registrados pueden verme jijijij

Eso es todo.  :-[
Espero que les haya gustado.  :P  :P
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: SoyJoaquin. en 27 de Diciembre de 2011, 02:00:45 am

Saludos.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Joel en 27 de Diciembre de 2011, 02:06:21 am
  • Lo que es el área de los errores se puede optimizar muchísimo mas que eso, aunque si deseas dejarlo así, podrías eliminar las llaves para ahórrate algo de espacio. Es a tu criterio, cada quien tiene la manera de hacer las cosas.
  • Cuando compruebas si el usuario existe, no recomendaría poner el " if($row) " si no ponerlo como es " if($row>0)".
  • Al momento de registrarse, seria bueno que iniciaras de une vez la session para no tener que introducir datos nuevamente.
  • En la base de datos, veo un poco innecesario poner el ancho de caracteres a 999 ya que de igual forma "20" seria el ancho de caracteres máximo que le das a los usuarios.
  • Creo que pudiste liarte menos si crearas alguna que otra función, podrías incluso crearte un foreach para recorrer todos los datos enviados por post.
  • En el users_Verify.php colocaste 2 veces el session_start();
  • En el "Page Protection" no puedes dejarle el NOT ya que tu estas creando una session cuyo valor booleano es true al momento del Log In. si lo dejas así estarías mostrando el contenido a los no logeados y ocultándolo a los logueados.

Saludos.

Ok entiendo, tratare de optimizarlo mas y arreglar algunos errores. Gracias por tu punto de vista Joaquin.  :D
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: SoyJoaquin. en 27 de Diciembre de 2011, 02:09:17 am
Ok entiendo, tratare de optimizarlo mas y arreglar algunos errores. Gracias por tu punto de vista Joaquin.  :D

Descuida, son cosas que pasan xD
Gracias por el aporte, de hecho, ya con esto le llegas a solucionar dudas a muchos.

PD: Desconocia eso del snippet.

Saludos.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Joel en 27 de Diciembre de 2011, 02:36:35 am
Descuida, son cosas que pasan xD
Gracias por el aporte, de hecho, ya con esto le llegas a solucionar dudas a muchos.

PD: Desconocia eso del snippet.

Saludos.

Listo creo que ya lo mejore, ahora funciona la protección de pagina, solo usuarios logeados lo pueden ver.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Nasty35 en 05 de Enero de 2012, 16:36:32 pm
Muchísimas gracias, lo necesitaba.
Viendo toda la fuente, aprenderé mucho más. Estupendo Tutorial.
Te felicito ;)
Saludos :star:
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: interix en 16 de Enero de 2012, 02:16:13 am
hice todo tal cual lo planteaste, pero cuando voy a registrarme me tira este error

Parse error: syntax error, unexpected '}' in /home/a8947490/public_html/users_Register.php on line 40
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: jimmy28 en 12 de Febrero de 2012, 02:16:33 am
donde esta las img q usa el ccs ???
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: jimmy28 en 12 de Febrero de 2012, 03:06:29 am
hice todo tal cual lo planteaste, pero cuando voy a registrarme me tira este error

Parse error: syntax error, unexpected '}' in /home/a8947490/public_html/users_Register.php on line 40

mira ese se aregla muy facil en esa linea esta esto

Código: [Seleccionar]
        $error .= '</p>'
 } else {
  lo que tienes q hacer es poner una ; quedaria asi
Código: [Seleccionar]
        $error .= '</p>';
 } else {

Listo creo que ya lo mejore, ahora funciona la protección de pagina, solo usuarios logeados lo pueden ver.

hay un problema en el verify nunca lo logea
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Nasty35 en 12 de Febrero de 2012, 12:42:52 pm
Tengo el mismo problema, el verify no me loguea, y el registrer tiene errores.
Porfavor corriganlo, me ayudará mucho :)
Lo ando buscando.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: DJ-Iachi960 en 12 de Febrero de 2012, 16:56:46 pm
Olé Olé y Olé el archivo CSS Me sirvio muchisimo ya que odio el dibujo/diseño Aunque Oí de un gran amigo que las session son hackeables Solo te lo digo yo no tneog ni idea de como se hackean  y ahora enserio me gusto muchisimo se podria decir que tiene futuro.

PD: Lo de "Oí" No lo esribí bien porque no tegno ni santa idea de como se escribe.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Joel en 25 de Febrero de 2012, 04:49:47 am
Tengo el mismo problema, el verify no me loguea, y el registrer tiene errores.
Porfavor corriganlo, me ayudará mucho :)
Lo ando buscando.

IMPOSIBLE! Yo lo probe en mi web y me andaba a la perfeccion... :l

aver.. vere qe onda entonces :S...

--------

Y lo del registro, vuelve a copiar el codigo de este post... ya no tira errores, le falto cerrar con un ";" como dijo el usuario de arriba.
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: GamezTiki en 09 de Octubre de 2012, 00:49:17 am
Perdon por revivir, pero no loguea el usuario!!! alguien tiene alguna solucion :(
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: alevazke en 05 de Agosto de 2013, 13:51:36 pm
Me tira este error:
En: http://localhost/%3C?%20echo%20$_SERVER['PHP_SELF'];%20?%3E
Código: [Seleccionar]
Acceso prohibido!

Usted no tiene permiso de accesar al objeto solicitado. El objeto está protegido contra lectura, o no puede ser leido por el servidor.

Si usted cree que esto es un error del servidor, por favor comuníqueselo al administrador del portal.

Error 403

localhost
Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
Título: Re:[PHP-Snippet] Sistema de Usuarios [+CSS][+Page Protection]
Publicado por: Joel en 22 de Septiembre de 2013, 22:57:43 pm
Me tira este error:
En: http://localhost/%3C?%20echo%20$_SERVER['PHP_SELF'];%20?%3E
Código: [Seleccionar]
Acceso prohibido!

Usted no tiene permiso de accesar al objeto solicitado. El objeto está protegido contra lectura, o no puede ser leido por el servidor.

Si usted cree que esto es un error del servidor, por favor comuníqueselo al administrador del portal.

Error 403

localhost
Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7

Estoy ocupando este código con algunas modificaciones y funciona perfectamente. Dejare el código en el tema, funciona 100%

:)
Título: Re:[PHP-Snippet] Sistema de Usuarios y Restricciones [+CSS][NUEVA VERSIÓN]
Publicado por: Joel en 22 de Septiembre de 2013, 23:29:01 pm
Listo, todos los codigos fueron modificados.

Prueben si funciona ahora.  :D
Título: Re:[PHP-Snippet] Sistema de Usuarios y Restricciones [+CSS][NUEVA VERSIÓN]
Publicado por: MaNuX en 23 de Septiembre de 2013, 21:58:33 pm
Esta muy bién Joel, yo te recomiendo usar elseif en vez de ir añadiendo if cada rato, no es que no sea correcto si no que es algo mas comodo de leer, mi opinión.

Saludos.