Foros del Web » Programando para Internet » PHP »

Ayuda con Sesiones en PHP5

Estas en el tema de Ayuda con Sesiones en PHP5 en el foro de PHP en Foros del Web. Hola necesito ayuda con sesiones el manejo de sesiones en php5, he visto varios manuales de php y el concepto lo tengo claro pero nose ...
  #1 (permalink)  
Antiguo 16/12/2004, 16:58
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
Ayuda con Sesiones en PHP5

Hola necesito ayuda con sesiones el manejo de sesiones en php5, he visto varios manuales de php y el concepto lo tengo claro pero nose pk al llevarlo a codigo ahy problemas, he visto codigos ke corren en php4 y trato de ocupar los mismos y no funciona ya que tambien lo trate de hacer con clases y tampoco me funciono me salen vario warnins y los valores no me los rescata cuando paso de una pagina a otra , les pido ayuda pk la verdad no se ke hacer ,aki les va parte del codigo
se supone ke funciona asi
login->control->index2.php(y aki se hace la autentificacion al llamar a seguridad.php)


Código PHP:
$xml simplexml_load_file($documento);
foreach(
$xml->$user as $archivo){
if(
trim($archivo->$id)==$login){
if(
strtolower($pass)==($archivo->password)){
session_start();
session_register("autentificado");
$autentificado "SI";
session_register("logininf");
session_register("asignaturas");
session_register("tipouser");
session_register("nombres");
session_register("paterno");
session_register("carrera");
$logininf=$login;
$asignaturas=$archivo->asignaturas;
$tipouser=$user;
$nombres=$archivo->nombres;
$paterno=$archivo->paterno;
$carrera=$archivo->carrera;}
}
}
if(
$autentificado=="SI"){
header ("Location: index2.php");
}else{
header ("Location: index.html");

llamada en index2.php
Código PHP:
require_once("seguridad.php");
//  despues sale las etiketas html 
codigo de seguridad .php
Código PHP:
session_start();
$control=$_SESSION["autentificado"] ;
if (
$control!= "SI") {
    
header("Location:index.html");
    exit();

y los errores ke me salen son estos
Código:
Warning: session_start() [function.session-start]: Node no longer exists in /usr/local/apache2/htdocs/infoclases/bin/seguridad.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /usr/local/apache2/htdocs/infoclases/bin/seguridad.php:2) in /usr/local/apache2/htdocs/infoclases/bin/seguridad.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache2/htdocs/infoclases/bin/seguridad.php:2) in /usr/local/apache2/htdocs/infoclases/bin/seguridad.php on line 2
si alguien tuviese una clase de php5 con implementacion de sesiones lo agradeceria bastente
desde ya muchas gracias
  #2 (permalink)  
Antiguo 16/12/2004, 17:03
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Y que contiene ...

Que es lo que contiene el fichero $documento que usas en el simplexml_load_file() ?? Este error:
Cita:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /usr/local/apache2/htdocs/infoclases/bin/seguridad.php:2) in /usr/local/apache2/htdocs/infoclases/bin/seguridad.php on line 2
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache2/htdocs/infoclases/bin/seguridad.php:2) in /usr/local/apache2/htdocs/infoclases/bin/seguridad.php on line 2
es que estás mandando a tu navegador una salida antes de enviar las cabeceras correspondientes.

Revisa esos detalles a ver.
Salu2
__________________
Ing. Reynier Pérez Mira
  #3 (permalink)  
Antiguo 16/12/2004, 17:14
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
son datos de un documento xml,ya que no trabajo con base de datos,sinoo ke todo metido en un documento xml donde estal los datos ke valido
por ejemplo esto es ke tine un documento xml
<profesores>
<profesor>
<rut>1234567</rut>
<nombres>Juan</nombres>
<paterno>Gomez</paterno>
<materno>Perez</materno>
<password>6562c5c1f33db6e05a082a88cddab5ea</password>
<asignaturas>241048_2.206013_1</asignaturas>
<mail>[email protected]</mail>
</profesor>
<profesor>
<rut>22222222</rut>
<nombres>Maria del Rosario</nombres>
<paterno>Echeverria</paterno>
<materno>Lagos</materno>
<password>934b535800b1cba8f96a5d72f72f1611</password>
<asignaturas>202005_1</asignaturas>
<mail>[email protected]</mail>
</profesor>
</profesor>
  #4 (permalink)  
Antiguo 16/12/2004, 20:35
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Sobre session_register()... lo mejor es dejar de utilizarla y asignar directamente al superglobal $_SESSION.... el manual recomienda también no mezclar el uso de esa función y el superglobal que te menciono. Aunque eso no tiene nada que ver con tu error... nunca está de más el consejo no?
http://www.php.net/session_register

Saludos
  #5 (permalink)  
Antiguo 16/12/2004, 22:46
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
Exclamación Hice un cambio ,pero parce ke se me borra nlos valores de las variables

hora hice un cambio, al momento despues de registar las sesions le mando un session_write_close() ,pero el problema ke tengo es ke ahora no puedo ve los valores de las vaariables ,me los muestra vacio
este es el codigo ke cambie en control.php
Código PHP:
_SESSION["autentificado"] = "SI";
$_SESSION["logininf"] = $login;
$_SESSION["asignaturas"] = $archivo->asignaturas;
$_SESSION["tipouser"] = $user;
$_SESSION["nombres"] = $archivo->nombres;
$_SESSION["paterno"]=$archivo->paterno;
$_SESSION["carrera"]=$archivo->carrera;
}
session_write_close(); 
se me fueron los warnings pero no tengo valores de las variables de sesiones, se me habia olvidado mencionar ke dentro dela pagina principal tengo un iframes,pero los codigo ke tengo adentro no los he validado con seguridad todavia
  #6 (permalink)  
Antiguo 17/12/2004, 05:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Session_write_close() no es neceario que lo uses ... (bueno .. yo hasta la fecha nunca lo he usado y no he tenído problemas ..).

Lo que si que debes es usar session_start() antes de pretender acceder a una variable de sesión en $_SESSION .. ya sea para darle valor o para leerla.

No puedes enviar salida antes al cliente si usas sesiones ..

Es decir ..

correcto:

Código PHP:
<?php
session_start
();
$_SESSION['variable']="valor";
?>
// resto de tu script/HTML o lo que sea ..
NO correcto:
Código PHP:
<html>
<head>
</head>
<body>
<?
session_start
();
$_SESSION['variable']="valor";
?>
</body>
</html>
Un saludo,
  #7 (permalink)  
Antiguo 17/12/2004, 21:42
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
parece ke mi problema es otro :(

Cluster, tb lo he hecho de esa manera y l acreacion de la sesion funciona, el problema es cuando trato de verificar ,como ke se pierde el valor de la variable, he ocupado codigos ke a otras personas le funcionan, he probado en slack con apache2 y php5 y tambien ene winxp con wamp, ke trae php5 tambien, he ltrabajado con clases esistentes pero no ahy caso, en verdad kreo ke estoy m,aldito con las de sesiones
  #8 (permalink)  
Antiguo 17/12/2004, 22:17
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Y ...

Verificastes que estes iniciando el uso de sesiones en la página donde verificas el valor de la variable ??? O sea, session_start() ? De todas formas pon el código donde creas la sesión y el código de donde la lees a ver que puede estar pasando.

Salu2
__________________
Ing. Reynier Pérez Mira
  #9 (permalink)  
Antiguo 17/12/2004, 22:17
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Por favor... pon el código que utilizas completo... verifica que no hayan salidas al navegador (HTML.... o incluso espacios en blanco o saltos de línea antes del "<?php", ni tampoco salidas con "echo" antes del session_start()).
Saludos
  #10 (permalink)  
Antiguo 18/12/2004, 00:29
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
aki va todo el codigo, ahora implemente una clase ke esta ne funcionmiento en otra parte,pero resulta ke el error ahora es ke no me pasa el valor de las variables despues de hacer la verificacion, jajj aahora si ke nose ke pasa

Clase ke uso para las sesiones(esta clase funciona corrrectamente pk esta en uso
Código PHP:
class sesion{

    
    var 
$carrera;

    var 
$creada;
    
    var 
$asignaturas;
    
    var 
$user;
    
    var 
$nombres;
    
    var 
$paterno;
    
    var 
$login;


    function 
sesion(){

        
$this->creada true;

    }



    function 
creaSesion($log,$cod,$asig,$user,$nom,$pat){

        
$this->login $log;

        
$this->carrera =$cod;
        
        
$this->asignaturas=$asig;
        
        
$this->user=$user;
        
        
$this->nombres=$nom;
        
        
$this->paterno=$pat;

        
$sess_name "ses";

        
session_name($sess_name);

        
$variable_de_session "login";

        
$variable_de_session_2 "carrera";

        
$variable_de_Session_3 "seguridad";
        
        
$variable_de_Session_4="user";
        
$variable_de_Session_5="nombres";
        
$variable_de_Session_6="paterno";
        
$variable_de_Session_7="asignaturas";

        
session_register($variable_de_session);

        
session_register($variable_de_session2);

        
session_register($variable_de_session3);
        
session_register($variable_de_session4);
        
session_register($variable_de_session5);
        
session_register($variable_de_session6);
        
session_register($variable_de_session7);

        
session_start();

        
$_SESSION['login'] = $this->login;
        
        
$_SESSION['nombres'] = $this->nombres;
        
        
$_SESSION['paterno'] = $this->paterno;
        
        
$_SESSION['user'] = $this->user;
        
        
$_SESSION['asignaturas'] = $this->asignaturas;

        
$_SESSION['carrera'] = $this->carrera;

        
$_SESSION['seguridad'] = "_O-l_H-";

    }



    function  
validaSesion(){



    
$variable_de_session "login";

    

    
session_register($variable_de_session);

   
    
session_start();

    if(
session_is_registered("login")){

            return(
$_SESSION['login']);

    }

    else

        return(
FALSE);

    

    }

este es el codigo del control,donde sehacen las validaciones de usuarios
Código PHP:
require_once("./ClaseSesion.php");
$sesion=new Sesiones();
$user=$sesion->VerificarTipoUsuario($_POST['login']);
$login=$_POST['login'];
$pass=$_POST['contra'];
require_once(
"class.sesiones.inc.php");
$ses=new sesion();

switch(
$user){
    case 
"alumno":{$documento="../data/usuarios/alumnos.xml";
                
$id="matricula";}
            break;
case 
"profesor":{$documento="../data/usuarios/profesores.xml";
                 
$id="rut";
                        }
                        break;
case 
"admin":{$documento="../admin/xml/admin.xml";
                       
$id="id";
                        }
                        break;
}
$xml simplexml_load_file($documento);
    foreach(
$xml->$user as $archivo){
        if(
trim($archivo->$id)==$login){
            if(
strtolower($pass)==($archivo->password)){
    
    
$ses->creaSesion($login,$archivo->carrera,$archivo->asignaturas,$user,$archivo->nombres,$archivo->paterno);
    
            }
        }
    }


if(
$ses->validaSesion()!=false){
header ("Location: index2.php");
}else{
header ("Location: index.html");

y finalmente este es el codigo de la validacion ke tendria ke ir en cada pagina
Código PHP:
<?
require_once("class.sesiones.inc.php");
$ses=new sesion();
if(
$ses->validaSesion()!=FALSE){
header ("Location: index.html");
}else    { 
$mm=$ses->validaSesion()};
?>
<html>
<head>
<title>
esto $mm=$ses->validaSesion() lo hago para ver el valor de la variable. e inserto esto <?php echo "nn".$mm;?> en otra parte de codigo html y este valor no me lo muestra... ayuda por favor
ese es todo el codigo, la validacio de usuario funciona,tambien la validacion de sesion el la pagina index2.php, asi ke cual sera el error??.... no lo se, ademas en php.ini tengo esto
session.use_cookies = ON
ademas estoy ocupando iun iframes
  #11 (permalink)  
Antiguo 18/12/2004, 22:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por mi parte ya te comentè que NO debes usar session_register() si usas $_SESSION .. no son compatibles .. te pude dar problemas por ahì.

Por lo demàs .. si propagas el SID en cookies .. tu navegador debe aceptar cookies. Revisa también que no tengas ningùn proxy, firewall o similar que pueda estar bloqueando la cookie que usa PHP para propagar el SID .. por què si el SID se pierde .. se pierde el "enlace" con tu sesiòn de tu servidor (la que gestiona PHP) y no podrás acceder a sus valores (se generará siempre una nueva).

Un saludo,
  #12 (permalink)  
Antiguo 19/12/2004, 02:39
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
cluster
ahora ,lo estoy haciendo con $_SESSION,pero aun asi se pierde el valor, tine algo ke ver el iframe???, estoy desesperado con esto ,lo he provado en 4 ekipos distintos con ie y nestcape,mozilla, ke mas se podria revisar??
y grax por tratar de coperar
  #13 (permalink)  
Antiguo 19/12/2004, 03:35
 
Fecha de Ingreso: julio-2004
Mensajes: 9
Antigüedad: 13 años, 5 meses
Puntos: 0
Exclamación Nueva manera..pero todavia se pierde los valores

ahor estoy haciendo de una nueva manera lo de sesiones ,pero aun asi se pierde el valor, aki les va el codigo para ver si pueden ver donde me ekivoco
clase sesion
Código PHP:
class Session {
    
/**
     * Initialize the session to make sure the lockList is present and
     * unwritable
     **/
    
function __construct() {
        if (!
$this->isSess("lockList")) {
            
$lockList = array();
            
$lockList[] = "lockList";
            
$_SESSION["lockList"] = $lockList;
        }
    }

    
/**
     * Sets a value in the session, checking first to make sure the 
     * variable isn't locked and the name is valid.
     * @param string $name name of variable stored in session
     * @param mixed $value value of variable stored in session
     **/
    
function setSess($name$value)
    {
        if (
preg_match("!^[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*$!i"$name)){
            
$lockList $this->getSess("lockList");
            if (
in_array($name$lockList)) {
                
trigger_error("'<i>$name</i>' is locked and cannot be set"E_USER_NOTICE);
            } else {
                
$_SESSION[$name] = $value;
            }
        } else {
            
trigger_error("Invalid variable name"E_USER_NOTICE);
        }
    }

    
/**
     * Gets a value from session
     * @param string $name nmae of variable checked in session
     * @return mixed Value in session or null if not found
     **/
    
function getSess($name)
    {
        if (isset(
$_SESSION[$name])) {
            return 
$_SESSION[$name];
        } else {
            return 
null;    
        }
    }

    
/**
     * Checks to see if a variable is in session
     * @param string $name name of variable checked in session
     * @return boolean true if found, false if not
     **/
    
function isSess($name)
    {
        return (
$this->getSess($name) !== null);
    }

    
/**
     * Delete a key/value pair in session, checking first to make sure 
     * the key is not locked.
     * @param string $name name of variable to be removed from session
     **/
    
function delSess($name)
    {
        
$lockList $this->getSess("lockList");
        if (
in_array($name$lockList)) {
            
trigger_error("'<i>$name</i>' is locked and cannot be deleted"E_USER_NOTICE);
        } else {
            unset(
$_SESSION[$name]);        
        }
    }

    
/**
     * Locks a key/value pair in the session so that it cannot be overwritten
     * @param string $name name of the variable to be locked in session
     **/
    
function lockSess($name)
    {
        
$lockList $this->getSess("lockList");
        if (
$this->isSess($name)) {
            if (
in_array($name$lockList)) {
                
trigger_error("'<i>$name</i>' has already been locked"E_USER_NOTICE);
            } else {
                
$lockList[] = $name;
                
$_SESSION["lockList"] = $lockList;
            }
        } else {
            
trigger_error("There is no session variable called '<i>$name</i>'"E_USER_NOTICE);
        }
    }

    
/**
     * Unlocks a key/value parin in the session so that it can be updated
     * @param string $name name of variable to be unlocked in session.
     * @return 
     **/
    
function unlockSess($name)
    {
        
$lockList $this->getSess("lockList");
        if (
$key array_search($name$lockList)) {
            unset(
$lockList[$key]);
            
$_SESSION["lockList"] = $lockList;
        } else {
            
trigger_error("'<i>$name</i>' is not locked."E_USER_NOTICE);
        }
    }

    
/**
     * Kills the entire session. This is VERY dangerous to use. Use with caution!
     **/
    
function killSess()
    {
        
session_destroy();
        
$_SESSION = array();
    }
}
?> 
codigo carga sesion(control.php)


Código PHP:
require_once("session.class.php");
$session = new Session();

require_once(
"./ClaseSesion.php");
$sesion = new Sesiones();

$user $sesion->VerificarTipoUsuario($_POST['login']);
$login $_POST['login'];
$contra $_POST['contra'];

switch (
$user) {
    case 
"alumno":
        
$documento "../data/usuarios/alumnos.xml";
        
$id "matricula";
        break;
    case 
"profesor":
        
$documento "../data/usuarios/profesores.xml";
        
$id "rut";
        break;
    case 
"admin":
        
$documento "../admin/xml/admin.xml";
           
$id "id";
        break;
}

// se carga el documento con los usuarios del tipo de quien hizo login
$xml simplexml_load_file($documento);

foreach (
$xml->$user as $archivo){
       if (
strtolower($archivo->$id) == strtolower($login)) { // $id y $login: matricula
           
if (strtolower($contra) == strtolower($archivo->password)) {
            
$session->setSess('autorizado''SI');
            
$session->setSess("user"$user);
            
$session->setSess("login"$login);
            
$session->setSess('carrera',  $archivo->carrera);
            
$session->setSess('asignaturas',  $archivo->asignaturas);
               
$session->setSess("nombres"$archivo->nombres);
               
$session->setSess("paterno"$archivo->paterno);
        }
    }
    
}
?> 
cdigo para verificar la sesion y es aki donde lo generado se pierde,que se supone ke deveria venir lo de sesiones de la pagina anterior

Código PHP:
<?php
include_once "session.class.php";
$session = new Session();
session_start();
$mm=$session->getSess("login");
?>
por favor ayudenme con esto pk es de vital importancia.....muchas gracias
  #14 (permalink)  
Antiguo 19/12/2004, 20:26
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Esa clase "sesiones" de dónde sale??
El constructor de la clase "Session" intenta leer en las variables de sesión... por lo tanto debes hacer el session_start() antes de instanciar esa clase (new Session).
Fuerza al parser a mostrar todos los mensajes de error poniendo la línea
Código PHP:
error_reporting(E_ALL
al comienzo de todo.

Saludos
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 22:45.