Foros del Web » Programando para Internet » PHP »

Sigo con errores en las sesiones

Estas en el tema de Sigo con errores en las sesiones en el foro de PHP en Foros del Web. Pues estoy tratando de trabajar con sesiones en mi Foro. Lo que me pasa es que no se porque razón no me crea las sesiones ...
  #1 (permalink)  
Antiguo 28/06/2004, 07:54
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 22 años
Puntos: 1
Sigo con errores en las sesiones

Pues estoy tratando de trabajar con sesiones en mi Foro. Lo que me pasa es que no se porque razón no me crea las sesiones sino que me sobreescribe las existentes en algunos casos y en otros se me pierde el SID. Esto es lo que estoy haciendo:
Código PHP:
function SessionConfig(){
  
ini_set("session.use_cookies","1");
  
ini_set("session.user_trans_sid","1");
  
session_name("sid");
  
session_save_path("sess/");
 }

//esto en la pagina index.php
SessionConfig();
session_start();
if(isset(
$_SESSION['usuario']) && isset($_SESSION['tipo']) && isset($_SESSION['passwd']) && isset($_SESSION['iduser'])){
  
$link "?usuario=".$_SESSION['usuario']."&tipo=".$_SESSION['tipo']."&idusuario=".$_SESSION['iduser']."&".SID."";
 }else{
  
$link "?".SID."";
 } 
// cuando paso del index a cualquier otra pagina lo que hago es esto
Código PHP:
session_start(); 
pero cuando hago login como usuario registrado hago esto otro:
Código PHP:
SessionConfig();
   
session_start();
   
$_SESSION['usuario']  = $_POST['login'];
   
$_SESSION['tipo']     = $source['level'];
   
$_SESSION['passwd']   = $passwd_in_db;
   
$_SESSION['iduser']   = $source['iduser']; 
y cuando redirecciono al index.php es donde pierdo los valores del SID o simplemente me crea las sesiones vacias.
¿Que hago mal?
Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 28/06/2004, 09:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Te pregunto yo ahora ..

¿sabes como estás propagando el SID?
¿sabes que hace la configuración de sesiones que pretendes forzar?

Te lo digo en buena fé .. Por qué veo que no entiendes que es el SID (y no por este mensaje sino por todos los que andas probando el tema ..) ni la configuración de PHP sobre sesiones que "pretendes" forzar con ini_set() .. NO tiene sentido propagar el SID en el URL (ni las variables de sesión que usas en ese $link) cuando por otro lado estás forzando a PHP a que propage el SID en cookies y más encima "(por si acaso)" le obligas a que sobre-escriba link's y demás con el SID.

Aclarate primero con el tema sesiones. Conoce la configuación de PHP. USA las cosa de forma simple y luego añades "funcionalidades" y observas como funciona.

El forzado de la configuración de sesiones SE DEBE! hacer en todo el uso de sesiones que hagas .. si lo haces con tus ini_set() o funciones de sesiones que definen alguna configuración especial como esa definición del nombre de sesión o de la ruta donde PHP guardará sus sesiones (que por cierto: USA! direcciones absolutas no relativas sino tendras problemas).

Un saludo,
  #3 (permalink)  
Antiguo 28/06/2004, 09:41
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 22 años
Puntos: 1
Pues eso ...

Cluster:
Como ya ves soy algo bruto. El porque propago esas variables por URL es para luego hacer uso de las variables globales $_GET. He estudiado todo lo que he podido de las sesiones pero por ejemplo: en mi pagina de inicio imprimo una tabla con vinculo en dependencia o no de que las sesiones tengan valores. Si están activadas las sesiones y estas tienen datos diferentes a:
Código PHP:
if(isset($_SESSION['usuario']) && $_SESSION['usuario']!=""){
  
// imprimo la parte superior del Foro

con vínculos correspondientes como es el caso de Editar perfil de usuario y otros y entonces quito el vinculo de Login de Usuario :: Registro de Usuarios y otros que no tienen porque estar o estar de alguna forma específica si el usuario ha sido identificado o no en la Base de Datos. Entonces si el usuario a sido identificado tendría lógica que siguiera haciendo uso de esa sesión en todas las páginas para así imprimir lo mismo en la primera(index.php) que en la que me muestra los temas de cada foro(viewforos.php) porque sería algo ilógico que no mostrara en la primera Login de Usuario :: Registro de Usuarios y entonces estando iniciada la sesión y el usuario estando logeado en el sitio que en la segunda entonces mostrara Login de Usuario :: Registro de Usuarios. ¿Tiene o no lógica lo que trato de hacer? ¿Si está mal me podrías dar alguna pista de como hacer lo correcto? y si está bien entonces como podría mejorarlo.

Salu2
__________________
Ing. Reynier Pérez Mira
  #4 (permalink)  
Antiguo 29/06/2004, 06:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Como ya ves soy algo bruto. El porque propago esas variables por URL es para luego hacer uso de las variables globales $_GET.
Ya te comenté que esas variables las tienes ya en tu sesión .. así que deberías usar: $_SESSION (como variables "super-globales" que son: sino no tiene sentido usar sesiones si al final del todo vas a tomar el valor de "$_GET ..")

Cita:
if(isset($_SESSION['usuario']) && $_SESSION['usuario']!=""){
// imprimo la parte superior del Foro
}
La función empty() hace lo mismo que un isset() + un $variable != '' ... usala preferentemente para esos casos.

El resto .. de la "lógica" que empleas no la acabo de entender (bajo tu concepto).

Yo lo único que pretendo hacerte entender (o explicarte) que .. si tienes una variable en una sesión (como así es por qué antes incluso compruebas que tiene valor) .. debes usar ese valor.

Si al modo que usas esas variables que propagas en el URL pese que ya están en al sesión se debe a que en tu script que las recepcionas puede acceptar valores de una session o que entren por el URL ($_SESSION o $_GET dependiendo de algún caso .. ) tendrías que hacer algo tipo:

Código PHP:
if (!empty($_SESSION['variable'])){
   
$variable=$_SESSION['variable'];
} elseif (!empty(
$_GET['variable'])) {
    
$variable=$_GET['variable'];
} else {
    
$variable="valor por defecto";
}
// En el resto del script usas $variable .. 
No sé si será esto lo que necesitas .. pero, si te fijas .. si $_SESSIOn['variable'] está definida y con algún valor .. $variable .. tomará ese valor .. si no lo está tomará el de $_GET['variable'] y .. si ni esa está definida entoces predefino un valor.

Un saludo,
  #5 (permalink)  
Antiguo 29/06/2004, 10:54
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 22 años
Puntos: 1
Pues gracias

Cluster muchas gracias. Ahora si he comprendido bien el uso de las sesiones como variables globales. Ya todo me trabaja bien pero me queda una pequeña duda al respecto. He estado probando el resultado en mi PC. Pues bien cuando entro al Foro se me inicia una session vacia, ahora cuando me logeo como usuario registrado se me crean las variables de sesion normalmente, pero dentro de la sesion que ya estaba creada. Es esto correcto? El navegador no lo cierro ni nada o sea que todo ocurre en la misma ventana.

Lo otro que no logro hacer es crear las cookies. He quitado todos los forzados que le hacia al php.ini, todos esos ini_set y nada. La cookie la creo de esta forma:
Código PHP:
$login $_POST['login'];
   
$pass md5($_POST['passwd']);
   
$value $login."::".$pass;
   
setcookie("rpmforos",$value,time()+3600); 
que hago mal?
Salu2
__________________
Ing. Reynier Pérez Mira
  #6 (permalink)  
Antiguo 30/06/2004, 21:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Sobre lo que comentas de la sesión .. así es como funciona la propagación del SID y la relación que guarda este con el archivo físico que se crea:

Al "abrir" tu ventan (la primera) .. tu script PHP inicia la sesión con su correspondiente session_start() .. esto genera un SID válido -> se propaga el SID por el médio que uses (cookies, URL ...). Si el SID le llega propagado a un script cualquiera, al usar session_start() .. php le asocia el mismo SID válido y continua usandolo .. por ende todo lo que trabajes (variables en la sesión) caerá a ese mismo archivo.

Por esto mismo, si el SID se pierde (no se propaga: sea por qué se te olvidó propagarlo en el URL .. o la cookie no se creó/se borró) al "iniciar" el uso de sesiones con session_start() .. al no "detectarse" un SID propagado, se creará uno nuevo (=un nuevo archivo físico) por eso .. no puedes acceder a las variables de sesión (no existen) ya que no están ahí .. bajo ese "nuevo" SID sino bajo otro que "perdistes" el enlace con el. Si pudieras recuperar ese "SID" antes de que session.gc_maxlifetime termine de expirar ese SID (haciendolo nulo y pasando al estado "garbage" el archivo de sesión creado) podrías poder retomar la sesión con los valores que tenía. (He de ahí por ejemplo el por qué no es recomendable propagar el SID en el URL donde podría caer en otras manos y ser usado en tu contra).

------

El tema de las cookies .. así las registras .. pero no se vé como intentas (ni donde exactamente) donde pretendes leer su valor. Recuerda que tanto cookies como sesiones no quedan disponibles hasta la próxima petición al servidor que hagas (sea una recarga de página o bien algun link que hagas .. formulario que hagas el Submit .. etc).

También fijate en la documentación oficial de setcookie() (www.php.net/setcookie) por qué hay más parámetros que podrian influir (como la ruta o dominio de validez de esa cookie).

Un saludo,
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 13:02.