Foros del Web » Programando para Internet » PHP »

Problema con sesiones... no consigo aclararme

Estas en el tema de Problema con sesiones... no consigo aclararme en el foro de PHP en Foros del Web. Bueno, tras mucho leer y probar codigo sigo sin enterarme muy bien de como hacer funcionar las sesiones de php. Aqui os dejo lo que ...
  #1 (permalink)  
Antiguo 19/09/2005, 08:45
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 18 años, 8 meses
Puntos: 0
Problema con sesiones... no consigo aclararme

Bueno, tras mucho leer y probar codigo sigo sin enterarme muy bien de como hacer funcionar las sesiones de php. Aqui os dejo lo que he probado y mi error por si alguien puede ayudarme. Muchas gracias.

Tengo un index con un iframe (donde se encuentra el formulario login). Tanto en el index como en la pagina login (donde el usuario se identifica e inicia la sesión), escribo esto antes de cualquier etiqueta html:

Código PHP:
<?php
//cambiar el limitador del cache a 'private'
session_cache_limiter('private');
//iniciamos sesion
session_set_cookie_params(1800);
session_start();
?>
Una vez rellenado el campo de usuario y password, el login se dirige al archivo de autorizacion.php:

Código PHP:
<?php
//cambiar el limitador del cache a 'private'
//session_cache_limiter('private');
//iniciamos sesion
session_set_cookie_params(1800);
session_start();
//header, funcion redirect
function redirect($url_relativa) {
    
header("Location: http://" $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/" $url_relativa);
    }
?>
<?php
define 
(DEBUG1); //modo de depuracion activado-desactivado
/*con esta funcion evitamos que puedan aparecer  mensajes de error personalizados en modo de depuracion desactivado*/
function stderr ($text){
    if (
DEBUG==1) {
        print 
"<br><font style='color: red'>";
        print 
$text;
        print 
"</font></br>";
    }
    return 
true;
    }
//obtenemos variables del formulario
if(empty($_POST['usuario']) AND empty($_POST['userpassword'])) {
    
stderr ("Please, enter a correct username and password");
    return 
false;
}
//declaramos variables de sesion si existen
elseif (isset($_POST['username']) AND  isset($_POST['userpassword'])) {
    
$_SESSION['username'] = $_POST['username'];
    
$_SESSION['userpassword'] = $_POST['userpassword'];
}
else { 
    
$url_relativa'identification.php';
    
redirect($url_relativa);
}    
//id sesion
$_SESSION['session_id'] = session_id();
//establecemos las constantes globales
$DB_HOST 'localhost'//para pruebas, 
//conectamos con la base de datos
if (! $conn mysql_connect ($DB_HOST$_SESSION['username'], $_SESSION['userpassword'])) { 
    
stderr ("Error connecting to database. Please, enter a valid username and userpassword");
    return 
false;
    }
    else { 
    
$url_relativa'main.html';
    
redirect($url_relativa);
}    

if (! 
mysql_close($conn)) {
    
stderr ("Error closing connection");
    return 
false;
}
?>
Aqui viene mi primera duda:

la sentencia session_cache_limiter('private'); debe ir exclusivamente en el index y en la primera pagina del iframe o debe ir en todas las paginas .html o .php de la herramienta? y debe ir en ese lugar o despues de session_start?

A continuación, el usuario identificado pasa a main.html (dentro del iframe), donde aparece el siguiente codigo al inicio del archivo:

Código PHP:
<?php
//cambiar el limitador del cache a 'private'
//session_cache_limiter('private');
//iniciamos sesion
//session_set_cookie_params(1800);
session_start();
//si no hay variables session, sesion finalizada e iniciar una nueva sesion
if (! isset($_SESSION['username']) AND isset($_SESSION['userpassword'])) {
    
$url_relativa'identification.php';
    
header("Location: http://" $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/" $url_relativa);
    exit;
}
else {
     echo 
"Welcome, ".$_SESSION['username'];
     echo 
"Your session ID is: ".$_SESSION['session_id'];
     }
?>
Aqui mis dudas son estas:
1- la sentencia //session_set_cookie_params(1800); debe ir en ese lugar? o puedo omitirla ya que esta en las anteriores paginas (index e identificacion)?
2- no aparece por pantalla:
echo "Welcome, ".$_SESSION['username'];
echo "Your session ID is: ".$_SESSION['session_id'];
Esto lo añado más adelante en una celda del html y tampoco aparece por pantalla.

Y por ultimo mi gran duda es la siguiente, una vez que el usuario se ha identificado y accedido a main.html, puede navegar por otras paginas dentro del iframe, hasta que llega a un formulario en el que se insertan datos en una base de datos de mysql. El problema es que con las sesiones quiero guardar el usuario y password para que al insertar datos en mysql no tenga que volver a identificarse. El error es el siguiente:

Código:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /usr/local/apache/htdocs/www/scripts/loadfile.php:4) in /usr/local/apache/htdocs/www/scripts/loadfile.php on line 7

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/www/scripts/loadfile.php:4) in /usr/local/apache/htdocs/www/scripts/loadfile.php on line 7

Warning: mysql_connect(): Access denied for user 'nobody'@'localhost' (using password: NO) in /usr/local/apache/htdocs/www/scripts/loadfile.php on line 28

Error connecting to database
  #2 (permalink)  
Antiguo 19/09/2005, 10:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Despues de cada redirección vía header("Location: ...") .. deberías terminar la ejecución de tu script:

Código PHP:
function redirect($url_relativa) { 
    
header("Location: http://" $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/" $url_relativa); 
exit;
    } 
Sino, el script continua según su flujo (atendiendo a tus condionales y demás) hasta su fin .. originando que se ejecute código que tal vez no corresponda como parece que es tu caso.

Cita:
la sentencia session_cache_limiter('private'); debe ir exclusivamente en el index y en la primera pagina del iframe o debe ir en todas las paginas .html o .php de la herramienta? y debe ir en ese lugar o despues de session_start?
Los iframes debes entenderlos como páginas/scripts completamente independientes, por ende .. todos y cada uno de tus scripts deben contener las llamadas a session_start() y demás funciones de sesiones si es que las llaman/usan.

Todo tiene que tener coherencia .. es decir .. si en un script usas X valor para tu definición de cookies (de la propagación del SID y/o valor de esa cookie) hazlo igual en todos los scripts.

Por lo demás .. ajustas valores para propagación del SID en cookies .. pero en ningún lado se vé como propagas tu SID de tus sesiones .. (ni lo fuerzas a usar cookies). Si vas a propagar el SID en cookies, debes asegurarte que tu navegador las acepte.

Un saludo,
  #3 (permalink)  
Antiguo 20/09/2005, 01:29
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchas gracias Cluster por tu ayuda. En la instalación de php no lo compile con --enable-trans-sid, pero cambie la configuración del php.ini y queda como sigue:

register_globals = off
session_use_trans_sid = 1
session.use_cookies = 1
session.auto_start = 0

Debo recompilar php con la opción --enable-trans-sid?

De todos modos investigare más sobre la propagación del sid y vere si funciona, ya que apenas entiendo del tema. Gracias.
  #4 (permalink)  
Antiguo 20/09/2005, 04:21
 
Fecha de Ingreso: agosto-2005
Mensajes: 76
Antigüedad: 18 años, 8 meses
Puntos: 0
Encontre el error. Mi navegador no tenia habilitadas las cookies. Lo cambie y la sesion funciona perfectamente. Muchas gracias.
  #5 (permalink)  
Antiguo 21/09/2005, 06:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si vas a propagar el SID en cookies .. mejor usa:

session_use_trans_sid = 0
session.auto_start = 0
session.use_cookies = 1
session.use_only_cookies = 0

De esta forma realmente propagas el SID en cookies completamente.

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 08:02.