Foros del Web » Programando para Internet » PHP »

Problemas con marcos y session_start()

Estas en el tema de Problemas con marcos y session_start() en el foro de PHP en Foros del Web. Hola a todos, estoy haciendo una aplicación en php de esta manera: index.php (formulario para poner user y pass para acceder a la aplicación) principal.php ...
  #1 (permalink)  
Antiguo 24/01/2005, 11:01
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
Problemas con marcos y session_start()

Hola a todos, estoy haciendo una aplicación en php de esta manera:
index.php (formulario para poner user y pass para acceder a la aplicación)
principal.php (frameset)
marco_superior.php (marco superior)
marco_inferior.php (marco inferior)

El tema es que en marco_superior.php tengo varias solapas con las opciones que son vinculos a páginas que aparecerán en el marco inferior, pero el problema es que no me reconoce el usuario el marco superior y me saca.
Me explico un poco mejor:
los datos 'usuario' y 'password' son validados dentro del marco_superior.php:

<?php
session_start();
$host = "localhost";
$user = "root";
$dbname = "mysql";

if (isset ($_POST['usuario']) && ($_POST['password']))
{
$usuario = $_POST['usuario'];
$password = $_POST['password'];

$link=mysql_connect($host, $user);
$query="SELECT * FROM usuarios WHERE usuario='$usuario' AND password='$password'";
$result=mysql_db_query($dbname, $query, $link);
if (mysql_num_rows($result) > 0){
$_SESSION['usuario_valido'] = $usuario;
}
} else {
echo "Se encontraron errores en su intento de acceso. <br>";
echo "Vuelva a intentarlo desde <a href='index.php'>aqui</a>.";
exit;
}
?>

Si al index.php le digo que envíe los datos del formulario directamente al marco_superior.php anda perfecto, sin ningún problema, pero si le digo que los mande al principal.php (frameset) me sale el mensaje del error especificao en el script (Se encontraron errores en su intento de acceso. Vuelva a intentarlo desde aqui.).

Hay que poner algún tipo de código php en el frameset ? Si alguien me puede ayudar un poquito ... es que estoy estancado y ya no sé que hacer ...

Muchas gracias de antemano.
__________________
Impala
  #2 (permalink)  
Antiguo 24/01/2005, 11:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Deberías adjuntar el código de tus scripts/páginas que componen tu frame-set .. sobre todo para ver que uso de sesiones haces en ellos. El "session_Start()" ha de estar en todos los scripts que pretendas acceder a tus variables de sesiones, recuerda que los "marcos" se ejecutan completamente independientes unos de otros.

Un saludo,
  #3 (permalink)  
Antiguo 24/01/2005, 12:07
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
Acá te dejo los scripts:

index.php

<html>
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p>&nbsp;</p>
<table width="70%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><div align="center"><font color="#000066" face="Verdana, Arial, Helvetica, sans-serif">Ingreso</font></div></td>
</tr>
</table>
<p>&nbsp;</p>
<form method="post" action="principal.php">
<table width="30%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#333333">
<tr>
<td><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#CCCCCC"><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif">Debe
identificarse para poder ingresar</font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif"></font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font color="#000066" face="Verdana, Arial, Helvetica, sans-serif">Usuario</font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif">
<input name="usuario" type="text" id="usuario">
</font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif"></font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font color="#000066" face="Verdana, Arial, Helvetica, sans-serif">Contrase&ntilde;a</font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33"><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif">
<input name="password" type="password" id="password">
</font></div>
</td>
</tr>
<tr>
<td bgcolor="#FFCC33">&nbsp;</td>
</tr>
<tr>
<td><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif">
<input type="submit" name="Submit" value="Ingresar">
</font></div>
</td>
</tr>
</table></td>
</tr>
</table>
</form>
<br>
</body>
</html>

--------------------------------------------------------------------------
principal.php

<html>
<head>
<title>Principal</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset rows="80,*" frameborder="NO" border="0" framespacing="0">
<frame src="marco_superior.php" name="superior" scrolling="NO" noresize >
<frame src="marco_inferior.php" name="inferior" id="inferior">
</frameset>
<noframes>
<body>
<?php
session_start(); //esto no sé si está bien acá o si falta agregar algo mas ...
?>
</body>
</noframes>
</html>

---------------------------------------------------------------------------
marco_superior.php

<html>
<head>
<title>Marco superior</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover{text-decoration:none}
a:active{text-decoration:none}
</style>
</head>
<body link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF">
<?php
session_start();
require ( 'mysql_header.php' );

if (isset ($_POST['usuario']) && ($_POST['password']))
{
$usuario = $_POST['usuario'];
$password = $_POST['password'];

$link=mysql_connect($host, $user);
$query="SELECT * FROM usuarios WHERE usuario='$usuario' AND password='$password'";
$result=mysql_db_query($dbname, $query, $link);
if (mysql_num_rows($result) > 0){
$_SESSION['usuario_valido'] = $usuario;
}
} else {
echo "Se encontraron errores en su intento de acceso. <br>";
echo "Vuelva a intentarlo desde <a href='index.php'>aqui</a>.";
exit;
}

//Para si es Admin
$nivel_acc = "admin";
$row=mysql_fetch_array($result);
?>

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="40">
<?php
if ($nivel_acc == $row['nivel']){
echo "<table width='960' border='0' align='center' cellpadding='0' cellspacing='0'>";
}else{
echo "<table width='840' border='0' align='center' cellpadding='0' cellspacing='0'>";
}
?> <tr>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif">Habitaciones</font></font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif">Cafeter&iacute;a</font></font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF" face="Geneva, Arial, Helvetica, sans-serif">Gastos</font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif">Clientes</font></font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif">Proveedores</font></font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF" face="Geneva, Arial, Helvetica, sans-serif">Facturas</font></div></td>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif"><a href="backup.php">Backup</a></font></font></div></td>
<?php
if ($nivel_acc == $row['nivel']){
?>
<td width="120" height="40" background="imagenes/pestana.gif"><div align="center"><font color="#FFFFFF"><font face="Geneva, Arial, Helvetica, sans-serif"><a href="admin_usuarios.php" target="inferior">Usuarios</a></font></font></div></td>
<?php
}
?>
</tr>
</table>
<tr>
<td bgcolor="#FFCC33"><div align="right">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#FFCC33">
<td width="78%">&nbsp;</td>
<td width="14%"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em><font face="Geneva, Arial, Helvetica, sans-serif">Bienvenido</font> <?php echo $_SESSION['usuario_valido']; ?></em></font></td>
<td width="8%"><div align="center"><font size="2" face="Geneva, Arial, Helvetica, sans-serif"><a href="logout.php">salir</a></font></div></td>
</tr>
</table>
<font size="2" face="Verdana, Arial, Helvetica, sans-serif"></font></div></td>
</tr>
</table>
</body>
</html>

--------------------------------------------------------------------------
mysql_header.php

<?php
$host = "localhost";
$user = "root";
$dbname = "hostal";
?>

Estos son los 3 scripts en cuestión. Espero que alguien encuentre el fallo ...
__________________
Impala
  #4 (permalink)  
Antiguo 24/01/2005, 13:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
En principa.php (tu "frame-set") si realmente no usas sesiones en el .. puedes omitir el uso de session_Start() en el mismo .. y si lo usas debe estar antes de cualquier HTML que puedas tener . .no en el "<body>" .. es una sentencia PHP

Lo mismo sucede con los otros session_start() .. debes usarlos antes de cualquier HTML .. ejemplo:

<?
session_start();
?>
<html>
etc ...

No veas a "PHP" como HTML con incrustraciones de PHP .. sino a que PHP es quien realmente "genera" o "dá salida" a ese HTML en función de la lógica de este.

Por lo demás .. faltaría saber como propagas el SID en tu configuración de PHP (php.ini o phpinfo() lo puedes ver) .. Lo que es en tu código no lo usas para nada .. así que asumes que se va a propagar en el URL al menos automáticamente re-escribiendo ciertos tag's de HTML como links y algunos otros. O bien vas a propagar el SID en cookies (lo cual es más seguro con sus inconvenientes).

Un saludo,
  #5 (permalink)  
Antiguo 24/01/2005, 14:27
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
Antes que nada, gracias por responder. Ahora, puse:
<?php
session_start();
?>
al principio de principal.php (frameset) y probé tambien omitiendolo, pero me sigue pasando lo mismo, em sigue saliendo en el marco superior el error especificado en el script marco_superior.php.

Te digo sinceramente, lo de como se propaga el SID es la misma duda que tengo yo ya que, la verdad, recién estoy empezando con esto de PHP.

Y te repito, si del index.php voy directamente al marco_superior.php anda todo de maravillas, de hecho, puse un link de prueba en este script que me manda a una página que solo tiene como codigo:
<?php
session_start();
echo $_SESSION['usuario_valido'];
?>

y me devuelve como resultado el nombre del usuario con el que estoy logueado, por lo que entiendo que el SID se propaga bien (de alguna manera se propaga, pero bien). Lo que no entiendo es porque parece que al pasar por el principal.php parece que desapareciera por el camino no dejandome entrar ...

me expliqué bien ??
Saludos y gracias
__________________
Impala
  #6 (permalink)  
Antiguo 25/01/2005, 02:53
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
No sé si te servirá de algo, pero la opción 'session.use_trans_sid' en el php.ini está en OFF para los valores LOCAL y MASTER.
__________________
Impala
  #7 (permalink)  
Antiguo 25/01/2005, 03:25
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Una cosa, ¿tu problema es al poner el target de ese formulario a principal.php? Si es asi, en principal.php tendria que estar el codigo de procesamiento del formulario, lo que ahora esta en marco_superior.php. Solo principal.php recibe el post.

Los frames son 3 paginas totalmente independientes: el que contiene el frameset, y los dos con los contenidos de los frames. Es como si en el que esta el frameset abre 2 popups via javacripts.
Cita:
No sé si te servirá de algo, pero la opción 'session.use_trans_sid' en el php.ini está en OFF para los valores LOCAL y MASTER.
Si el usuario no tiene activadas las cookies, con esa directiva a off tendrias que pasar manualmente el id de sesion en todos los links.

Salduos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 25/01/2005, 03:47
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
Ya está resuelto el problema. El tema es que la variable $_SESSION['usuario_valido'] se definia recien en marco_superior.php y, claro, el frameset (principal.php) no entendía esa variable. POr eso me parecía como que se perdía en el camino el valor de esa variable ... jejeje, es que nunca llegaba !
Saludos y gracias !
__________________
Impala
  #9 (permalink)  
Antiguo 25/01/2005, 03:48
 
Fecha de Ingreso: septiembre-2004
Mensajes: 203
Antigüedad: 19 años, 6 meses
Puntos: 0
Uy, Josemi, respondí como solucioné el tema sin haber visto tu post, pero estabas en lo cierto. Y bueno, serán errores de principiantes ;P
Saludos
__________________
Impala
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:21.