Foros del Web » Programando para Internet » PHP »

Problema con sesiones y header

Estas en el tema de Problema con sesiones y header en el foro de PHP en Foros del Web. Buenas, tengo un problema bastante extraño. En una aplicación tengo varias páginas con uso intensivo de variables de sesion. El problema me surge en un ...
  #1 (permalink)  
Antiguo 22/12/2004, 04:05
 
Fecha de Ingreso: diciembre-2004
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Problema con sesiones y header

Buenas, tengo un problema bastante extraño. En una aplicación tengo varias páginas con uso intensivo de variables de sesion. El problema me surge en un redireccionamiento mediante Header().

En mi pagina chkusuario.php, accedo a la BBDD y leo el perfil de usuario (integer), en funcion de ese perfil el usuario es dirigido a una pagina u otra. El problema me aparece en una pagina especifica, donde la variable de sesion no se recupera, sin embargo en el resto sí. He intentado cambiar configuraciones en php.ini sin resultado alguno, el codigo es bastante similar a esto:

//acceso a bbdd y asignacion de session

$_SESSION['perfil'] = 2;

//redireccionamiento,

switch($_SESSION['perfil']){
case 1:
Header("Location:/main.php");
exit;
break;
case 2:
Header("Location:/main2.php");
exit;
break;
}

digamos en main.php funciona y en main2.php no funciona, habiendo codigos identicos de recuperacion de la variable de sesion:

$perfil = $_SESSION['perfil'];

y previo a cualquier otro tipo de codigo. La verdad es que no se donde puede estar el fallo, he probado ya cientos de cosas pero no consigo hallar la causa.

Muchas gracias por su ayuda.

Carlos.
  #2 (permalink)  
Antiguo 22/12/2004, 05:16
Avatar de yesik  
Fecha de Ingreso: octubre-2004
Ubicación: Orense
Mensajes: 292
Antigüedad: 13 años, 2 meses
Puntos: 1
Si enseñas el codigo de las páginas.. tiene qe aber error,,
se me ocurre q t olvidaras d session_start().. no sé pero deja el codigo para qe te ayude alguien qe sepa (a aki los hay)
__________________
Inmuebles de Galicia:: www.inmueblevirtual.net
Compartir piso Galicia:: www.inmueblevirtual.net/foro
  #3 (permalink)  
Antiguo 22/12/2004, 09:30
 
Fecha de Ingreso: diciembre-2004
Mensajes: 3
Antigüedad: 13 años
Puntos: 0
Adjunto codigo problema de sesiones y header

Probe con session_start(); pero no obtuve ningun resultado. A parte, en php.ini tengo ya session.auto_start = 1;

Adjunto código de los archivos. Muchas gracias!

Carlos.


Archivo origen:chkusuario.php (el que procesa los valores del formulario, realiza la comprobación y el redireccionamiento).


/valores del Form
$pass=$_POST["pas"];
$usuarios=$_POST["user"];

//creando conexion y ejecutando query
mysql_connect( 'localhost', $_SESSION['db_user'], $_SESSION['db_pass']) or die ( 'Unable to connect to server.' );
mysql_select_db( 'publidirecta' ) or die ( 'Unable to select database.' );
$sql = "SELECT * FROM usuarios WHERE user='$usuarios' and password='$pass'";
$result = mysql_query( $sql ) or die ( 'Unable to execute query.' );
//comprueba el numero de filas y si es igual a 1 y solo a 1 (eliminando duplicacion de registros)
//, el login y password son validos. Con ello se evita que si un usuario tiene su registro por dupli-
//cado la aplicacion tampoco le permita entrar.
$num = mysql_numrows( $result );

if ( $num == 1 ) {
//almacenando las variables de session con el usuarioID correspondiente al login, que más adelante
//servira para leer el perfil de usuario (gerarquia) y las paginas a las que tiene acceso para poder
// configurar el menu.
//Creando la variable de session que almacena el ususario ID, perfiles y otras variables de utilidad
//para uso en el resto de la aplicacion.

$_SESSION['idusuario'] = mysql_result($result,0,"idusuario");
$_SESSION['perfil'] = mysql_result($result,0,"gerarquia");

//leyendo las secciones a las que este usuario tiene acceso, creando arrays en los que se almacenan
//los indices de las secciones ($paginas_ok) y los nombres de las paginas (sin path en $mazx).
$sql = "select idsecciones from permisos where idusuario=" . $_SESSION['idusuario'];
$query_leerSecciones=mysql_query($sql);
while($row=mysql_fetch_array($query_leerSecciones) ){
//añadiendo a los arrays
$paginas_ok[]=$row2["idsecciones"];
$mazx[]=damepaginas($row2["idsecciones"]);//llamada a la funcion que retorna los nombres de las paginas.

//si por una misma seccion se especifican varias paginas estas vienen delimitadas con el separador '|'.
}

//creando las variables de session que almacenaran esta informacion haciendola accesible al resto
//de la aplicacion.
$_SESSION['paginas_ok']=$paginas_ok;
$_SESSION['mazx']=$mazx;


//creando la variable de session de comercial, identica a $_SESSION['idusuario']. De momento se
//mantiene pero pendiente de eliminar y habilitar $_SESSION['idusuario'] en todas las partes del
//codigo
$_SESSION['id_crm_comercial']=$id_usuario;
//creacion de una cookie. Ver como afecta mas adelante
//setcookie("identificacion",$id_usuario,time()+1800 0);

//en funcion del perfil, enviar un encabezado de menus u otro


//salvando la informacion de session

switch($_SESSION['perfil']) {
case 0:
Header("Location:/___abc/maininfocampana.php");
exit;
break;
case 1:
Header("Location:/___abc/menuadmin.php");
exit;
break;
case 2:
Header("Location:/___abc/maininfocampana.php");
//echo '<script language="javascript">window.navigate("/___abc/frameinfocampana.htm");;
exit;
break;
case 3:

Header("Location:/___abc/homeclient.php");
exit;
break;
case 4:
//esta funcion registra en la tabla 'acciones' el registro login para el usuario. Por lo
//que he estudiado de codigo hasta el momento, creo que no se usa practicamente en toda la
//aplicacion por lo que tras dicha verificacion se podra descartar. Incluida en 'funciones.php'
carga_accion_comercial($_SESSION['idusuario'],"Login",0);
Header("Location:menuadmin.php");
break;
case 5:
Header("Location:/___abc/homecoste.php");
break;
default:
Header("Location:http://www.publidirecta.com/");
break;
}

}
else{
/* para el caso en que la informacion de registro no sea valida */
include "erro_log.php";
echo '<br><div align="center"><h1>Usuario o password incorrectos!</h1></div><br><div align="center"><a href="javascript:history.back();">Reingresar</a></div>';
}

?>




Archivo 2: maininfocampana.php -- el que da error. Los otros redireccionamientos no dan error.


<?

$idusuario = $_SESSION['idusuario'];
echo $idusuario;
if (!isset($_SESSION['idusuario'])){
echo "la variable global idusuario debe inicializarse";exit;
}
else{echo "la var esta inicializada";exit;}
$iduser=$_SESSION['idusuario'];

include "utilities/saldos.php";

@mysql_connect("localhost",$_SESSION['db_user'],$_SESSION['db_pass']);
@$result3=mysql_db_query('publidirecta',"select * from delegaciones where idusuario=$idusuario order by fecha");
@$usuario=mysql_result($result3,0,"Iddelegacion");

include "utilities/funciones.php";

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<style type="text/css">
<!--
.area {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: 000000;
text-decoration: none;
background-color: #FFFFFF;
border: none;
scrollbar-arrow-color:#000000;
scrollbar-dark-shadow-color:#ffffff;
scrollbar-face-color:#ffffff;
scrollbar-highlight-color:#ffffff;
scrollbar-bordercolor:#ffffff;
scrollbar-shadow-color:#ffffff;
}
-->
</style>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>


<table border="1" align="center" bordercolor="#FFFFFF" width="90%">
<tr bordercolor="#999999"><td colspan="8" align="center"><font size="2" face="verdana">Información Interna</font></td></tr>

<?

@mysql_connect("localhost",$_SESSION['db_user'],$_SESSION['db_pass']);
$masi=mysql_db_query('publidirecta',"select * from news where IDusuario=$usuario and ver=0 order by fecha desc");
while ([email protected]_fetch_array($masi)){
$idinfocampana=$row10["idinformecampana"];
$mosita=mysql_db_query('publidirecta',"select * from campana where IDcampana=$idinfocampana and borrado = 0");
if(mysql_num_rows($mosita) > 0){
echo '<tr bgcolor="#ffffff"><td bordercolor="#ffffff" colspan="4"><br></td></tr>';
echo '<tr bgcolor="#eeeeee"><td bordercolor="#DDDDDD">';
$idcliente=mysql_result($mosita,0,"idcliente");
$cliente=mysql_db_query('publidirecta',"select * from clientes where IDcliente=$idcliente");
printf("<font size=1 face=verdana color=#000000><strong>Cliente:</strong></font><font size=2 color=FF0000 face=verdana> %s</font></td>",@mysql_result($cliente,0,"razon"));
printf("<td bordercolor=#DDDDDD align=center><font size=2 face=verdana color=#FF0000> %s</font></td>",modificafechaver(mysql_result($mosita,0,"fech a")));
echo '<td bordercolor=#DDDDDD><font size="1" face="verdana"><strong>Saldo : </strong></font><font size=2 face=verdana color=#FF0000>';
echo buscasaldcampana($idcliente,$idinfocampana);
echo '</font></td>';
printf("</tr><tr bgcolor=#eeeeee><td bordercolor=#DDDDDD colspan=3><font size=1 face=verdana><strong>Campa&ntilde;a : </strong><font size=2 face=verdana color=FF0000>%s</font></b></font></td>",mysql_result($mosita,0,"nombre"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Detalles de campa&ntilde;a</b></font></td></tr><tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana><font size=1 face=verdana>%s</font></td>",mysql_result($mosita,0,"obs"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Duracion y fechas</b></font></td></tr><tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td>",mysql_result($mosita,0,"dura"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Poblacion</b></font></td></tr><tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td>",mysql_result($mosita,0,"pobla"));
//printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Fechas</b></font></td></tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td></tr>",mysql_result($mosita,0,"fechas"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Tipo de folletos</b></font></td></tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td></tr>",mysql_result($mosita,0,"tipofolle"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Zonas a distribuir</b></font></td></tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td></tr>",mysql_result($mosita,0,"zonasdstri"));
printf("</tr><tr><td align=center bordercolor=#DDDDDD bgcolor=#eeeeee colspan=3><font size=1 face=verdana><b>Dirección de recogida de publicidad</b></font></td></tr><td align=center bordercolor=#DDDDDD colspan=3><font size=1 face=verdana>%s</font></td></tr>",mysql_result($mosita,0,"recogida"));
//@mysql_free_result($mosit);
}}
?>
</table>
</body>
</html>
  #4 (permalink)  
Antiguo 22/12/2004, 12:33
Avatar de The_Dark_Roy  
Fecha de Ingreso: enero-2004
Mensajes: 218
Antigüedad: 13 años, 10 meses
Puntos: 0
antes de crear cualquier variable de session tienes que poner session_start()
__________________
ojala te hayas quitado la venda

http://www.surire.cl
http://www.uta.cl
  #5 (permalink)  
Antiguo 26/12/2004, 17:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No deberìas usar:
session.auto_start = 1;

Sé que es "engorroso" acordarse de usar session_start() en cada script que requieras el uso de sesiones .. pero eso mismo hace que tus aplicaciones sean màs óptimas, pues sòlo inicias sesiones cunado las necesitas y no por ejemplo en pàginas donde no las usas ...

Lo que no comentas es como tu aplicaciòn gestiona el SID (Identificador Único de sesiòn) y como lo hace la configuraciòn de tu servidor .. Parece que "pierdes" el SID por no propagarlo correctamente.

En tu aplicaciòn (los scripts que pusistes) no propagas el SID manualmente en ninguna parter .. así que se asume que PHP lo tiene que hacer .. y ademàs por COOKIES, esto requiere de un navegador que acepte cookies y que nada las interfiera para su creaciòn (ej. firewalls, proxy... etc).

A su vez .. la configuraciòn de PHP deberìa ser:

session.use_cookies = ON

(en tu PHP.ini)

Eso es lo que has programado .. y asì tendrà que ser la configuraciòn y los requisitos de los "clientes" (navegadores) .. Por otro lado es lo màs seguro (propagar el SID en cookies) y lo màs cómodo para programar .. (te olvidas del SID .. pero eso no quita que debas saber que es y como influye en que tu aplicaciòn funcione como esperas en algunas configuraciones de servidores e incluso de "clientes" (si no aceptan cookies o las bloquea algùn proxy como suele pasar).

En las FAQ's de este foro tienes una explicaciòn màs amplia sobre las sesiones y todo esto del "SID".

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