Foros del Web » Programando para Internet » PHP »

Sistema de login en PDO

Estas en el tema de Sistema de login en PDO en el foro de PHP en Foros del Web. Estoy aprendiendo PDO y he realizado este sistema de login y quiero compartirlo con vosotros. Acepto criticas. Base de dato: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver ...
  #1 (permalink)  
Antiguo 12/09/2013, 08:22
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Sistema de login en PDO

Estoy aprendiendo PDO y he realizado este sistema de login y quiero compartirlo con vosotros. Acepto criticas.

Base de dato:
Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `user` (
  2.   `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  3.   `username` VARCHAR(20) NOT NULL,
  4.   `password` VARCHAR(60) NOT NULL,
  5.   `date` VARCHAR(19) NOT NULL,
  6.   `ip` VARCHAR(10) NOT NULL,
  7.   PRIMARY KEY (`id`)
  8. )

/config/index.php
Código PHP:
<?php
    $connection 
= new PDO("mysql:host=hosting;dbname=base de dato","usuario","contraseña");
    
$connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
?>
Index.php
Código PHP:
<?php
session_start
();
include(
'/config/index.php');

if(isset(
$_SESSION['username'])):
    echo 
'Estas logeado <a href="/logout.php">Logout</a>';
else:
    if(isset(
$_POST['login'])):
        if(empty(
$_POST['username']) || empty($_POST['password'])):
            echo 
'No dejes campos en blanco';
        elseif(
strlen($_POST['username']) > 20):
            echo 
'El usuario no puede tener mas de 20 caracteres';
        elseif(
strlen($_POST['password']) > 20):
            echo 
'La contraseña no puede tener mas de 20 caracteres';
        else:
            
$login $connection->prepare("SELECT username FROM user WHERE username = :username AND password = :password");
            
$login->bindParam(':username',$_POST['username']);
            
$login->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
            
$login->execute();
            if(
$login $login->fetch(PDO::FETCH_ASSOC)):
                
$_SESSION['username'] = $_POST['username'];
                
header('Location: /');
            else:
                echo 
'Datos incorrectos';
            endif;
        endif;
    endif;
    echo 
'<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="login" type="submit">
    </form>
    
    <a href="/register.php">Registrate</a>'
;
endif;
?>
Register.php
Código PHP:
<?php
session_start
();
include(
'/config/index.php');

if(isset(
$_SESSION['username'])):
    
header('Location: /');
else:
    if(isset(
$_POST['register'])):
        if(empty(
$_POST['username']) || empty($_POST['password'])):
            echo 
'No dejes campos en blanco';
        elseif(
strlen($_POST['username']) > 20):
            echo 
'El usuario no puede tener mas de 20 caracteres';
        else:
            
$user $connection->prepare("SELECT username FROM user WHERE username = :username");
            
$user->bindParam(':username',$_POST['username']);
            
$user->execute();
            if(
$user->fetch(PDO::FETCH_ASSOC)):
                echo 
'El usuario ya existe';
            elseif(
strlen($_POST['password']) > 20):
                echo 
'La contraseña no puede tener mas de 20 caracteres';
            elseif(
$_POST['password'] <> $_POST['password2']):
                echo 
'Las contraseñas no coinciden';
            else:
                
$register $connection->prepare("INSERT INTO user(id,username,password,date,ip) VALUES ('',:username,:password,'".date('H:i:s d/m/Y')."','".$_SERVER['REMOTE_ADDR']."')");
                
$register->bindParam(':username',$_POST['username']);
                
$register->bindParam(':password',crypt($_POST['password'], '$2a$07$rieh3693fjarjeuf38cw27fg2$'));
                
$register->execute();
                if(
$register->rowCount() > 0):
                    
$_SESSION['username'] = $_POST['username'];
                    
header('Location: /');
                else:
                    echo 
'Ha ocurrido un error';
                endif;
            endif;
        endif;
    endif;
    echo 
'<form action="" method="post">
        <input name="username" placeholder="Username"><br>
        <input name="password" placeholder="Password"><br>
        <input name="password2" placeholder="Vuelve a ingresar la contraseña"><br>
        <input name="register" type="submit">
    </form>'
;
endif;
?>
Logout.php
Código PHP:
<?php
    session_start
();
    
session_destroy();
    
header('Location: /');
?>
Prefiero que me digais en que puedo mejorar
  #2 (permalink)  
Antiguo 12/09/2013, 08:24
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Sistema de login en PDO

Hola, acostumbrate despues de un header colocar exit() de esa manera evitas que se siga ejecutando codigo.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 12/09/2013, 08:25
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de login en PDO

Muchisimas gracias, lo tendre en cuenta.
  #4 (permalink)  
Antiguo 12/09/2013, 08:30
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Sistema de login en PDO

Gracias por compartirlo con nosotros... solo una cosa.. Edita el post y cambia el tipo de campo que recibe la fecha llamado date al tipo date y no como varchar... saludos
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #5 (permalink)  
Antiguo 12/09/2013, 08:31
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de login en PDO

No me sale la opcion de editar el tema principal, yo utilizo varchar(19) porque cuando utilizo date se guarda como 000-000-000
  #6 (permalink)  
Antiguo 12/09/2013, 08:43
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Sistema de login en PDO

Podrías dejarlo en DATE y cuando haces el insert lo haces con NOW() en vez de date('H:i:s d/m/Y') ...

en realidad da igual, pero es lo que se acostumbra ya que no es tan estricto el tema de la fecha en que se logueo y luego será más facil de formatear.

Saludos
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #7 (permalink)  
Antiguo 12/09/2013, 08:45
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de login en PDO

Lo probare, haber si me funciona y comento.

Me sigue saliendo 000-000-000
  #8 (permalink)  
Antiguo 12/09/2013, 12:32
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de login en PDO

¿Podria mejorar el codigo de alguna manera?
  #9 (permalink)  
Antiguo 12/09/2013, 12:42
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Sistema de login en PDO

En el registro.

Creo que si tu intención es saber si ya existe un usuario logueado y evitar duplicaciones deberías usar la funcion exec de PDO que te permite saber la cantidad de registros que devuelve una consulta SQL.. en vez de:

Código PHP:

$user 
$connection->prepare("SELECT username FROM user WHERE username = :username"); 
            
$user->bindParam(':username',$_POST['username']); 
            
$user->execute(); 
            if(
$user->fetch(PDO::FETCH_ASSOC)): 
                echo 
'El usuario ya existe'
podrías intentar algo como:

Código PHP:
$count $connection->exec("SELECT username FROM user WHERE username = ' ".$_POST['username']." ' "); 

/* Devuelve el número de filas existentes */
if($count 0)
echo 
'El usuario ya existe'
y si no existe, recien lo insertas con el PREPARE...
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #10 (permalink)  
Antiguo 12/09/2013, 12:58
 
Fecha de Ingreso: septiembre-2013
Mensajes: 125
Antigüedad: 10 años, 7 meses
Puntos: 3
Respuesta: Sistema de login en PDO

Si eso lo pense, pero entonces, como filtro las variables?

Etiquetas: login, pdo, select, sistema, sql
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 15:06.