Foros del Web » Programando para Internet » PHP »

Problema: PHP PDO y $_SESSIONS

Estas en el tema de Problema: PHP PDO y $_SESSIONS en el foro de PHP en Foros del Web. index.php Código PHP: <?php      session_start ();     include( 'Core/book.php' ); ?> <?php  if (!isset( $_SESSION [ 'username' ])):  header ( "Location: login.php" );  ?> <?php  else:  ?> <!DOCTYPE html> ...
  #1 (permalink)  
Antiguo 03/11/2012, 14:31
Avatar de necoide  
Fecha de Ingreso: diciembre-2011
Mensajes: 9
Antigüedad: 12 años, 3 meses
Puntos: 1
Problema: PHP PDO y $_SESSIONS

index.php
Código PHP:
<?php 
    session_start
();
    include(
'Core/book.php');
?>
<?php 
if (!isset($_SESSION['username'])): header("Location: login.php"); ?>

<?php else: ?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
        <link rel="StyleSheet" href="Styles/styles.css" type="text/css">
    </head>
    <body>

        <h2> <?php echo $_SESSION['username']; ?> </h2>
        <?php
            $topic 
= new Topics();
            
$topic->GetTopics();
        
?>

        <a href="newtopic.php">Create Topic<a/><br />
        <a href="logout.php">Logout</a>
    
    </body>
</html>    
<?php endif; ?>
user.php
Código PHP:
<?php
class User
{
    private 
$conex;
    private 
$Name;
    private 
$Password;
    private 
$Id;
    
    public function 
__construct($username$password)
    {
        
$this->Name $username;
        
$this->Password $password;
        
$this->Connect();
    }
    
    public function 
__wakeup()
    {
        
$this->Connect();
    }
    
    private function 
Connect()
    {
        
$servername $_SERVER['SERVER_NAME'];
        if (
$servername "Localhost")
        {
            
$this->conex = new PDO('mysql:host=localhost;dbname=SistemaDeUsuarios''root''');
            
//$this->conex = new mysqli('localhost','root','','SistemaDeUsuarios');
        
}
        
    }
    
    public function 
Name() {
        return 
$this->Name;
    }
    public function 
Id() {
        return 
$this->Id;
    }
    
    public function 
Register()
    {
        
$ok $this->conex->query("INSERT INTO users(username,password) VALUES('$this->Name','$this->Password')"
                or die(
$this->conex->error);
        if (
$ok) return 1;
        return 
0;
    }
    public function 
Exist()
    {
        
$sql "SELECT username,userid FROM users WHERE username=:username and password=:password LIMIT 0,1";
        
$stmt $this->conex->prepare($sql);
        
$stmt->execute(array(':username' => $this->Name':password' => $this->Password));
        
        
$result $stmt->fetch();
        
        if (
$result)
        {
            
$this->Id $result['userid'];
            return 
1;
        }
        return 
0;
        
//        $result = $this->conex->query(" SELECT username,userid FROM users WHERE username='$this->Name' and password='$this->Password' LIMIT 0,1 ");
//        if ($result) 
//        {
//            if ($result->num_rows > 0)
//            {
//                $r = $result->fetch_assoc();
//                $this->Id = $r['userid'];
//                return 1;
//            }
//        }
//        return 0;
    
}
    public function 
NewComment($comment$topicid)
    {
        
$ok $this->conex->query("INSERT INTO comments(comment,topicid,userid,date) VALUES('$comment','$topicid','$this->Id',NOW())"
                or die(
$this->conex->error);
        if (
$ok) return 1;
        return 
0
    }
}
?>
login.php

Código PHP:
<?php
    
require('Core/user.php');
    if (isset(
$_REQUEST['user']) && isset($_REQUEST['password']))
    {
        
$user = new User($_REQUEST['user'], $_REQUEST['password']);
        if (
$user->Exist())
        {
            
session_start();
            
$_SESSION['username'] = $user->Name();
            
$_SESSION['userid'] = $user->Id();
            
$_SESSION['user'] = $user;
            
header("Location: index.php");
        } else {
            
$error "Login Error";
        }
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
        <link rel="StyleSheet" href="Styles/styles.css" type="text/css">
        <script type="text/javascript">
            function SetFocus() {
                document.getElementById('userinput').focus();
            }
        </script>
    </head>
    <body onload="SetFocus()" style="font-family: Consolas;">
        <div id="form">
            <p>You must be logged in</p>
            <form method="post" action="">
                <div id="labels">
                    <label>User:</label>
                    <label>Password:</label>
                </div>
                <div id="inputs">
                    <input name="user" type="text" id="userinput">
                    <input name="password" type="password">
                    <input type="submit" value="Send">
                </div>
                <?php if (isset($error)) echo $error?>
            </form>
        </div>    
        <a href="register.php">Register</a>
    </body>
</html>

PROBLEMA: se pierden los datos de $_SESSION.

En login.php si el user existe ($user->Exist()) cargo en $_SESSION el name y el id y me redirige a index.php
El problema es que cuando en index.php verifica si esta seteado $_SESSION['username'] el array $_SESSION esta en 0, sin valor (eso que tendria que estar cargado por el login). Y como la condicion es falsa vuelvo a login.php y asi infinitamente.
Esto me pasa solamente como uso PDO en Exist() si uso mysqli funciona bien!
No se que es lo que estoy haciendo mal.
  #2 (permalink)  
Antiguo 03/11/2012, 20:56
Avatar de necoide  
Fecha de Ingreso: diciembre-2011
Mensajes: 9
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Problema: PHP PDO y $_SESSIONS

Parece ser que no se guarda bien el objeto $user en $_SESSION. Por que si comento la linea $_SESSION['user] = $user; funciona bien. Parece que no le gusta si el objeto maneja pdo, nose...
  #3 (permalink)  
Antiguo 03/11/2012, 21:10
 
Fecha de Ingreso: noviembre-2010
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 11
Respuesta: Problema: PHP PDO y $_SESSIONS

te pasa eso porque al cargar index.php creas una nueva sesion, por eso $_SESSION['username'] siempre va a estar en 0. la sesion la tenes que crear cuando se loguea el usuario.
  #4 (permalink)  
Antiguo 04/11/2012, 04:22
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema: PHP PDO y $_SESSIONS

Un par de comentarios, un objeto PDO no se puede guardar en session(o al menos no de forma segura) por lo tanto tienes que implementar en tu clase __sleep

Código PHP:
Ver original
  1. public function __sleep()
  2. {
  3.     $this->conn = null;
  4.     ...
  5. }

al utilizar __sleep recuerda retornan las propiedades que quieras persistir

Código PHP:
Ver original
  1. public function __sleep()
  2. {
  3.     $this->conn = null;
  4.     return array('Id', 'Name');
  5. }

y por último ten en cuenta que para hacer uso de un objeto que esta en session debes incluir antes de la llamada a session_start la clase.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 04/11/2012 a las 04:37 Razón: rebuild :P
  #5 (permalink)  
Antiguo 04/11/2012, 09:53
Avatar de necoide  
Fecha de Ingreso: diciembre-2011
Mensajes: 9
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Problema: PHP PDO y $_SESSIONS

Cita:
Iniciado por grassofabian Ver Mensaje
te pasa eso porque al cargar index.php creas una nueva sesion, por eso $_SESSION['username'] siempre va a estar en 0. la sesion la tenes que crear cuando se loguea el usuario.
tengo entendido que tenes que usar session_start cuando queres acceder al array $_SESSION.

Cita:
Iniciado por masterpuppet Ver Mensaje
Un par de comentarios, un objeto PDO [URL="http://php.net/manual/en/function.serialize.php"]no se puede guardar en session[/URL](o al menos no de forma segura) por lo tanto tienes que implementar en tu clase __sleep

Código PHP:
Ver original
  1. public function __sleep()
  2. {
  3.     $this->conn = null;
  4.     ...
  5. }

al utilizar __sleep recuerda retornan las propiedades que quieras persistir

Código PHP:
Ver original
  1. public function __sleep()
  2. {
  3.     $this->conn = null;
  4.     return array('Id', 'Name');
  5. }

y por último ten en cuenta que para hacer uso de un objeto que esta en session debes incluir antes de la llamada a session_start la clase.

Saludos.
genial, era lo que necesitaba. Si bien ya cambie el codigo es bueno tenerlo en cuenta para mas adelante.

Pregunta que tiene algo que ver, cuando guardo un objeto en $_SESSION implicitamente este se esta serializando?


Gracias a ambos!
  #6 (permalink)  
Antiguo 04/11/2012, 10:12
Avatar de miguec04  
Fecha de Ingreso: agosto-2008
Ubicación: Cimitarra, Santander
Mensajes: 378
Antigüedad: 15 años, 8 meses
Puntos: 15
Respuesta: Problema: PHP PDO y $_SESSIONS

Otra forma y me funciona bien es montar en session el objeto serializado

serialize($objeto);

y cuando lo necesite des-serializo llamandolo de la session en la que lo guarde

unserialize($_SESSION['NOMBRE_SESSION']);
__________________
Desoftc Technology - Miguel Carmona
Creaciones Inteligentes - Cimitarra Colombia
[email protected]
http://www.desoftc.com.co
  #7 (permalink)  
Antiguo 04/11/2012, 11:05
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema: PHP PDO y $_SESSIONS

@necoide, la respuesta rápida es si, igual te dejo la referencia a la doc http://php.net/manual/en/session.examples.basic.php para una explicación mas detallada.

@miguec04, talves hay algo que no veo pero que sentido tiene serializar para guardar en session si PHP lo maneja de forma automática ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 04/11/2012, 11:38
Avatar de miguec04  
Fecha de Ingreso: agosto-2008
Ubicación: Cimitarra, Santander
Mensajes: 378
Antigüedad: 15 años, 8 meses
Puntos: 15
Respuesta: Problema: PHP PDO y $_SESSIONS

Hasta el momento PHP nunca me ha serializado de forma automatica los objetos, yo serializo el objeto lo meto en session y lo llamo cuando lo necesito para usarlo obviamente se des-serializa y funciona a la perfección, no he tenido problema
__________________
Desoftc Technology - Miguel Carmona
Creaciones Inteligentes - Cimitarra Colombia
[email protected]
http://www.desoftc.com.co
  #9 (permalink)  
Antiguo 04/11/2012, 12:03
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Problema: PHP PDO y $_SESSIONS

No se como lo has probado, pero es como funciona,
Cita:
When PHP shuts down, it will automatically take the contents of the $_SESSION superglobal, serialize it, and send it for storage using the session save handle
y problemas no te va a dar si en definitiva como lo haces estas guardando un string(que posteriormente sera serializado), personalmente nunca serializo un objeto para guardarlo en session me parece overhead innecesario.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: html, mysql, pdo, sessions, sql, usuarios
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:13.