Foros del Web » Programando para Internet » PHP »

Problemas con las sesiones (más)

Estas en el tema de Problemas con las sesiones (más) en el foro de PHP en Foros del Web. Hola. He creado un script donde el usuario mete los datos en un formulario, se comprueba q existe y a partir d ahí: Si existe ...
  #1 (permalink)  
Antiguo 16/11/2004, 15:40
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 13 años, 1 mes
Puntos: 0
Problemas con las sesiones (más)

Hola. He creado un script donde el usuario mete los datos en un formulario, se comprueba q existe y a partir d ahí:
Si existe --> creo 2 vbles d sesion con los valores del login y del password y redirecciono (éste es mi problema) la pág hacia el menú d opciones.
Si no existe --> aviso d q no existe tal usuario y lo mando de nuevo al inicio.
Probé a redireccionar automáticamente con
Código PHP:
header("menuAlumno.php"); 
pero me da l siguiente ERROR:

Código HTML:
Warning: Cannot add header information - headers already sent by (output started at c:\apache\htdocs\index_usuario.php:7) in c:\apache\htdocs\index_usuario.php on line 46
He buscado acerca de este problema pero no saco mucho en claro.Por eso si alguien sabe cómo solucionar esto, q si me puede echar una mano.

Adjunto el código d 2 scripts con los q trabajo:

Nota:¿Sería correcta la forma de comenzar las sesiones y de terminarlas?; es decir, si las etiquetas están bien situadas y si son las correctas.

"index_usuario.php"

Código PHP:
<?session_start();?>
<HTML>
<HEAD>
<TITLE>Bienvenido a CorreoLab</TITLE>
</HEAD>
<BODY bgcolor="#cccccc">
<?

function formulario($login,$password){
?>
<div align="center"> </div>
   <form name="formlogin" method="post" action="index_usuario.php">
    <div align="center">
      <table>
      <tr><td>Login: </td><td><input name="login" type="text" maxlength="30"></td></tr>
      <tr><td>Password: </td><td><input type="password" name="password"></td></tr>
      <tr><td><input type="submit" name="submit" value="aceptar"></td></tr>
      </table>
    </div>
  </form>
</div>
<BR><div align="center">Si eres un usuario nuevo, <a href="alumno_peticion.php">REGISTRATE</a></div>

<?
//fin formulario


function comprobar($login,$password){
include(
"conexionBD.php");
 
$ok=0;
 
$tipo="alu";
 
$consulta="select login,pass,tipo from usuarios;";
 
$resul=mysql_query($consulta);
 while (
$row mysql_fetch_array($resul)){
   if ((
$login==$row[0])&&($password==$row[1])&&($tipo==$row[2])){
    
$ok=1;
    break;
   }
  }

 if (
$ok){    //SI EL USUARIO EXISTE
  
$login=$row[0];
  
$password=$row[1];
  
$_SESSION["login"]=$login;
  
$_SESSION["password"]=$password;
  
header("menuAlumno.php");

/*  echo "<BR>",'<div align="center"><font size=3 color ="#000080"><b>HOLA '.$_SESSION["login"].'. BIENVENIDO A LABMAIL</b></font></div>';
  echo "<BR>",'<div align="center"><font size=3 color ="#000080"><a href="menuAlumno.php">CONTINUAR</a></font></div>';
  echo '<div align="center">';     */
 
}
 else { 
// SI EL USUARIO NO EXISTE
  
session_destroy();
  echo 
"<BR>",'<div align="center">Ha ocurrido un error.El nombre de usuario o la contraseña son incorrectos</div>';
  echo 
"<BR>",'<div align="center"><a href="index_usuario.php">Volver</a></div>';
 }

//fin comprobar

if (!isset($submit)){
 
formulario($login,$password);}
else {
 
comprobar($login,$password);}
?>

</BODY>
</HTML>

"menuAlumno.php"

Código PHP:
<?session_start();?>
<?
if(!($_SESSION["login"])) {
   
header("indice.htm");

//  echo '<div align="center"><BR><BR><b>ERROR: USUARIO NO VALIDO</b></a></div>';
//  echo '<div align="center"><a href="indice.htm"><BR><BR>SALIR</a></div>';
 
}
 else{
?>  //else sesion
<HTML>
<HEAD>
<TITLE>Modificar</TITLE>
</HEAD>
<BODY bgcolor="#cccccc">
<?include("conexionBD.php");
 
$ok=0;
 
$tipo="alu";
 
$consulta="select login,pass,tipo from usuarios;";
 
$resul=mysql_query($consulta);
 while (
$row mysql_fetch_array($resul)){
   if ((
$login==$row[0])&&($password==$row[1])&&($tipo==$row[2])){
    
$ok=1;
    break;
   }
  }
if (
$ok){ //PRINCIPAL
 
$login=$row[0];

// echo "<BR>",'<div align="center"><font size=3 color ="#000080"><b>HOLA '.$row[0].'. BIENVENIDO A LABMAIL</b></font></div>';
 
echo '<div align="center">';

 
//Conexion con la base
 
include("conexionBD.php");

//DECLARACIÓN DE FUNCIONES
function recuperar(&$nombre,&$apellidos,&$dni,&$email,$login,&$password){
 include(
"conexionBD.php");
 
$consulta="select * from usuarios where login='$login';";
 
$resul=mysql_query($consulta);
 while (
$row mysql_fetch_array($resul)){
  
$nombre=$row[0];
  
$apellidos=$row[1];
  
$dni=$row[2];
  
$email=$row[3];
  
//$login=$row[4];
  
$password=$row[5];
 }
}  
//FIN RECUPERAR



function comprobar_email($email){
    
$mail_correcto 0;
    
//compruebo unas cosas primeras
    
if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@")){
       if ((!
strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) {
          
//miro si tiene caracter .
          
if (substr_count($email,".")>= 1){
             
//obtengo la terminacion del dominio
             
$term_dom substr(strrchr ($email'.'),1);
             
//compruebo que la terminación del dominio sea correcta
             
if (strlen($term_dom)>&& strlen($term_dom)<&& (!strstr($term_dom,"@")) ){
                
//compruebo que lo de antes del dominio sea correcto
                
$antes_dom substr($email,0,strlen($email) - strlen($term_dom) - 1);
                
$caracter_ult substr($antes_dom,strlen($antes_dom)-1,1);
                if (
$caracter_ult != "@" && $caracter_ult != "."){
                   
$mail_correcto 1;
                }
             }
          }
       }
    }
    if (
$mail_correcto)
       return 
1;
    else
       return 
0;
}  
//FIN COMPROBAR_EMAIL



function formulario($nombre,$apellidos,$dni,$dni2,$email,$login,$password,$passconf) {
?>
<CENTER>
<FORM ACTION="alumno_modificar.php" method=post>
<TABLE BORDER=0 CELLSPACING=5 CELLPADDING=2>
<TR>  <TD>Nombre: </TD>
<TD><INPUT TYPE="TEXT" NAME="nombre" VALUE="<? echo $nombre ?>"></TD></TR>
<TR>  <TD>Apellidos: </TD>
 <TD><INPUT TYPE=TEXT SIZE=30 NAME="apellidos" VALUE="<? echo $apellidos ?>"></TD></TR>
<TR>  <TD>DNI: </TD>
 <TD><INPUT TYPE=TEXT SIZE=30 NAME="dni2" VALUE="<? echo $dni2 ?>"></TD></TR>
<TR>  <TD>e-mail: </TD>
 <TD><INPUT TYPE=TEXT SIZE=40 NAME="email" VALUE="<? echo $email ?>"></TD>
</TR>
<TR>  <TD>LOGIN: </TD>
 <TD><INPUT TYPE=TEXT SIZE=20 NAME="login" VALUE="<? echo $login ?>"></TD>
</TR>
<TR>  <TD>Password: </TD>
 <TD><INPUT TYPE=PASSWORD SIZE=20 NAME="password" VALUE="<? echo $password ?>"></TD></TR>
<TR>  <TD>Confirma Password: </TD>
 <TD><INPUT TYPE=PASSWORD SIZE=20 NAME="passconf" VALUE="<? echo $passconf ?>"></TD></TR>

<INPUT TYPE="hidden" SIZE=20 NAME="dni" VALUE="<? echo $dni ?>">

</TABLE>

 <table>
<tr>
  <td><INPUT TYPE="submit" name="aceptar_form" value="Modificar datos"></td>
</tr>
<tr>
  <td> <input type="button" name="borrar" value="Desactivar de listas" onClick="this.form.action='desactivar_listas.php';this.form.submit()"></td>
</tr>
<tr>
  <td> <input type="button" name="fuera" value="Cerrar sesi&oacute;n <?echo $login?>" onClick="this.form.action='cerrar_sesion_isset.php';this.form.submit()"></td>
</tr>
</table>


</FORM>

</CENTER>
<?}//FIN FORMULARIO

function confirma($nombre,$apellidos,$dni,$dni2,$email,$login,$password){?>
 <BR><font size=4>Verifique si los datos son correctos:</font>
 <hr width="40">
 <table>
 <tr><td>
  <?
   
echo "<b>Nombre: </b>",$nombre,"<BR><b>Apellidos: </b>",$apellidos,"<BR><b>DNI: </b>",$dni2,"<BR><b>e-mail: </b>",$email,"<BR><b>Login: </b>",$login;
  
?>
 </td></tr>
 </table>
 <hr width="40">
<table border=0>
 <tr><td>
 <a href="modificar_isset.php?nombre=<?php echo $nombre?>&apellidos=<?php echo $apellidos?>&dni=<?php echo $dni?>&dni2=<?php echo $dni2?>&email=<?php echo $email?>&login=<?php echo $login?>&password=<?php echo $password?>"><b><font size=3>ACTUALIZAR DATOS</font></b></a>
 </td><td><a href="menuAlumno.php"><b><font size=3>CANCELAR</font></b></a>
 </td></tr>
 </table>
 <BR><BR>
<?
//FIN CONFIRMA




function chequear($nombre,$apellidos,$dni,$dni2,$email,$login,$password,$passconf){
 
$comp_email comprobar_email($email);
 if(!
$nombre||!$apellidos||!$dni2||!$email||!$login||!$password||!$passconf||!$comp_email||($password!=$passconf)){
  echo(
"<H3>Se ha producido un error:<H3>");
 if (!
$nombre){
  echo (
"Tiene que introducir el <b>Nombre</b>.<br>");}
 if (!
$apellidos){
  echo (
"Tiene que introducir los <b>Apellidos</b>.<br>");}
 if (!
$dni2){
  echo (
"Tiene que introducir el <b>DNI</b>.<br>");}
 if (!
$email){
  echo (
"Tiene que introducir el <b>e-mail</b>.<br>");}
 if (!
$login){
  echo (
"Tiene que introducir el <b>login</b>.<br>");}
 if (!
$password){
  echo (
"Tiene que Introducir el <b>Password</b>.<br>");}
 if(!
$passconf){
  echo (
"Tiene que confirmar el <b>Password</b>.<br>");}
 if(
$password!=$passconf){
   echo (
"El password no coincide. Por favor, introdúzcalo de nuevo.<br>");}
 if (!
$comp_email){
  echo (
"El formato de correo no es valido. Por favor, introdúzcalo de nuevo");}
 
formulario($nombre,$apellidos,$dni,$dni2,$email,$login,$password,$passconf);
}
 else {
  
confirma($nombre,$apellidos,$dni,$dni2,$email,$login,$password);
  }
// FIN CHEQUEAR




//CUERPO DEL PROGRAMA
 
$nom="";
 
$ape="";
 
$mail="";
 
$dni="";
 
$passw="";

 if(!isset(
$aceptar_form)){
   
recuperar($nom,$ape,$dni,$mail,$login,$passw);
   
formulario($nom,$ape,$dni,$dni,$mail,$login,$passw,$passw);
  }
 else{
   
chequear($nombre,$apellidos,$dni,$dni2,$email,$login,$password,$passconf);
    }
/*?>
 <BR><div align="center"><a href="cerrar_sesion_isset.php">Cerrar sesión</a></div>
<?*/
//FIN PRINCIPAL
else{
    
session_destroy();
    echo 
"<BR>",'<div align="center">Ha ocurrido un error.<br>Escriba correctamente su nombre de usuario y contraseña</div>';
    echo 
"<BR>",'<div align="center"><a href="index_usuario.php">Volver</a></div>';
   }

//fin else sesion
?></BODY></HTML>


Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 16/11/2004, 15:51
 
Fecha de Ingreso: mayo-2004
Ubicación: SurOeste de Guayaquil
Mensajes: 241
Antigüedad: 13 años, 6 meses
Puntos: 0
SALUDOS :

claro que dara problema
te recomiendo que la validacion lo utilices en otro archivo php
__________________
javier
  #3 (permalink)  
Antiguo 16/11/2004, 16:20
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 13 años, 1 mes
Puntos: 0
La validación de usuario ya probé a hacerla en un archivo aparte. Lo q hacía era q el usuario cubriera los datos, aceptaba y en otro archivo comprobaba q existía. Si existía, le daba un mensaje, cargaba las vbles de sesión y le decía "Pincha aquí" y eso le llevaba al menú y a partir de ahí jugaba con las sesiones.
Si no existía, le mandaba para atrás.
Y mi problema es ese archivo intermedio en el q compruebo si existe el usuario pq cuando cierro sesión y le doy para atrás a las páginas, ésa es la única q me recarga los datos pq en ella no sé cómo lograr q no me los muestre (esto es por el problema de darle a recargar página cuando te dice q ha caducado).
Un usuario de estos foros me propuso la solución de un único script y el uso de los headers pero no sé cómo trabajar con ellos; y ésta es la opción q más me convence.
Mi duda sigue siendo cómo hacer q funcionen los direccionamientos.
  #4 (permalink)  
Antiguo 17/11/2004, 06:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La función header() no es -sólo- usada para "redireccionar" pese que el 99% de los ejemplos que suelas ver se use para eso.

Dicha función es "genérica" y se usa para "lanzar" (enviar) cabeceras HTTP a tu cliente (navegador) .. Una de tantas cabeceras HTTP son las de "Location" que indican al navegador que "cambie" la página que estás viendo por otra para redireccinar. Así que el uso de header() para el caso concreto de "redireccionar" sería:

Código PHP:
header ("Location: pagina.tal"); 
A su vez .. como lo que haces es enviar cabeceras HTTP al cliente vía la función header() .. NOO puedes enviar otro tipo de salida al navegador antes de usar dicha función .. EN tu caso el error te dice que en la línea 7 de tu index_usuario.php ya estás enviando cierto tipo de salida .. en concreto es ese HTML que ahí tienes de <html> .. etc ..

El script que usas de index_usuario.php hace dos procesos .. o un formulario HTML con su salida correspondiente necesaria (tu HTML) .. o bien hace un proceso puramente PHP que es la validación de tu usuario. En el proceso "puro" de PHP de validación NOOO es necesario el HTML que debes usar para formar tu página HTML para crear ese formulario HTML .. si te finas .. cuando "validas" .. lo que haces es redireccionar vía header("Location ...") así que no tiene sentido ese HTML ahí pues NUNCA se procesará. Las cabeceras HTTP enviadas por header() al navegador se procesan por parte de tu navegador -antes- que el resto de HTML que puedas enviar y demás que generas.

De lo dicho .. tu código tendrías que reordenarlo para que quede tipo:
Código PHP:
if (!isset($submit)){ 
?>
<html>
etc ....
<?
formulario
($login,$password);
?>
etc ...
</body>
</html>
<?
} else { 
comprobar($login,$password);}
Ojo por qué un simple espacio antes del primer <? .. o un salto de línea se considera también como "salida" .. y dará problemas con header().

Otros detalles que tienes (mal) son ..
* Para ver si tu usuario existe bajo ese nombre de usuario y password . .NO debes hacer una consulta SQL total a tu BD y comparar uno por uno los registros que te arroja bajo PHP y tu IF .. DEBES! usar más SQL (que significa: lenguaje estrucutrado de consultas) .. con el objetivo de que sea tu BD la que vía SQL te devuelva si hay o no registros que coincidan con tu consulta realizada bajo el criterio que definas.

Ejemplo:
Código PHP:
$consulta="select login,pass,tipo from usuarios WHERE login='".$login."' AND pass='".$password."' AND tipo='".$tipo."'" 
Con ese tipo de consulta .. ya que necesitas esos datos si es que coincide todo (el login, pass y el tipo ...) puedes usar la función mysql_num_rows() para contar el n° de resultados que te arrojó dicha consulta .. en teoría o 1 o 0 si existe o no ..

Código PHP:
$result=mysql_query($consulta) or die (mysql_error());
if (
mysql_num_rows($result) == 1){
   
$row=mysql_fetch_array($result);
   
$_SESSION["login"]=$row['login']; 
   
$_SESSION["password"]=$row['pass']; 
   
header("Location: menuAlumno.php"); 
   exit;
} else {
   
header ("Location: error.php");
   exit;

Si te fijas .. ante el error que no exista el usuario NO hago un echo "Error..." sino que redirecciono igualmente .. pero a otra página para mostrar el error (podría ser la misma página .. pero con una variable de control para saber si corresponde mostrar el error o no ..)

Todos esto conceptos lo puedes ver funcionando en mi script Autentificator por si quieres hecharle un vistazo:
http://php.cluster-web.com/autentificator/

Un saludo,

Última edición por Cluster; 17/11/2004 a las 06:06
  #5 (permalink)  
Antiguo 17/11/2004, 07:33
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 13 años, 1 mes
Puntos: 0
De acuerdo

Jodé. Muchísimas gracias por detenerte tanto con mi script. Voy a mirar esto con profundidad. Mil gracias otra vez.
  #6 (permalink)  
Antiguo 17/11/2004, 15:37
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 13 años, 1 mes
Puntos: 0
De acuerdo

Problema solucionado. Te debo una. Qué digo una!! Te debo cientos.
Por cierto, he visto tu Autentificator_v201. No te voy a mentir y decir q lo he analizado en profundidad pero le he hechado un vistazo por encima y me parece una obra de arte (opinión de un humilde principiante de php).
Para ahora no, pero para mi proyecto, fijo que tomo "un par de líneas" de él. Excepcional.
Tomo nota, sobre todo de la limpieza de estructura y legibilidad del código, q a mí me hace falta.
Tb muy interesante la página http://www.hotscripts.com.
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 19:06.