entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Reconocer sesión de usuario en php

Tengo una página llamada zona (archivo php ) donde quiero colgar varios artículos, pero quiero que para poder ver los artículos de esa página, los usuarios deban de estar logados & registrados en mi bbdd.
Por lo que cual he metido en formulario en la página zona donde le pido al usuario el email y la password.
Incluyo unicamente el form del archivo php donde se hace la llamada a la página encargada de acceder a la bbd

 <?php 
    echo 'Bienvenido:  ';
    if (isset($_SESSION['email'])) {
        echo '<b>'.$_SESSION['email'].'</b>.('.$_SESSION['fp_username'].')';
        echo '<p><a href="logout.php">Logout</a></p>';
    }else{

        echo ' <form id="formulario" action="validar_usuario3.php" method="post">

           <label for="email"> E-mail </label>
           <br >
           <input type="text" name="email" id="email" class="required email" >
           <br >
           <label for="telefono"> Password </label>
           <br >
           <input type="password" name="password" id="password" class="required" >
           <br>

       <input type="submit" id="enviar" value="Enviar" >

        </form>
                <p><a href="registrar.php">Alta como nuevo usuario </a></p>';
        }

Como os he comentado , este formulario llama a un php que se llama validar_usuario3, encargado de coger el email y la password y comprobar en la bbdd que existe

El código de este php es el siguiente :

<?php session_start();

$dbhost = "localhost";
$dbuser = "corbachu";
$dbpass = "Xxxx";
$conx = mysql_connect($dbhost, $dbuser, $dbpass);

 mysql_select_db("corbachu_percy", $conx)or die ('Error al seleccionar la Base de Datos: '.mysql_error());;

if(trim($_POST['email']) != "" && trim($_POST['password']) != "")
{

$sql = 'SELECT password, email, username FROM usuarios WHERE email=\''.$email.'\' and password=\''.$password.'\'';
$result = mysql_query($sql);

    if($row = mysql_fetch_array($result)){  

    if($row['password'] == $password){
            $_SESSION['fp_username'] = $row['username'];
            $_SESSION['email'] = $row['email'];
            var_dump ($result);
            echo 'Has sido logueado correctamente '.$_SESSION['fp_username'].' <p>';
            echo '<a href="zona.php">Index</a></p>Ingreso exitosooooooooo, ahora sera dirigido a la pagina principal , esperemos con la sesión.
            <SCRIPT LANGUAGE="javascript">
            location.href = "zona.php";
            </SCRIPT>';
        }else{

            echo 'Datos incorrectos o contraseñas incorrectas;)';
        }
    }else{
        echo 'datos incorrectos :)';
    }
    mysql_free_result($result);
}else{
    echo 'Debe especificar un usuario y password';
}

El problema que tengo es que, una vez accede a la bbdd y comprueba que el email y la password son correctas , cuando vuelve a la página zona.php no sabe que el usuario que está en la sesión , como si no se hubiera logado. He probado a poner sessionstart() en el archivo zona.php pero me da un error de código.

Muchas gracias por vuestra ayuda

0voto

Peter comentado

Le cambie el título a la pregunta para que sea especifica.

Saludos.

1 Respuesta

0voto

carlossevi Puntos63580

Debes empezar con session_start() para "Iniciar una nueva sesión o reanudar la existente". (Documentación).

Dices:

He probado a poner sessionstart() en el archivo zona.php pero me da un
error de código.

¿Qué error?

0voto

gonzalss comentado

Dices que ponga session_start() ¿ en la pagina dónde está el formulario ?
Si pongo el session_start () tanto en la pagina zona.php ( donde está el formulario) como en la que llama el formulario validar_usuario.php me da el siguiente error :

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/public_html/zona.php:16) in /home3/corbachu/public_html/zona.php on line 230
Bienvenido: [email protected].(gonzalss)

Y si sólo la pongo en la página validar_usuario que es la que comprueba en la bbdd de datos que el usuario existe no me da error pero al redirigir a la página principal se pierde la sesión

0voto

carlossevi comentado

En primer lugar, intenta formatear tus comentarios correctamente para que nos sea más sencillo entenderlos.

Queda claro que session_start() se debe usar porque además cuando lo usas te funciona en el sentido de que te reconoce la sesión (te da el mensaje de "Bienvenido...").

Respecto al error, es un Warning que alerta de que se ha empezado a enviar contenido (o cabeceras) antes de iniciar la sesión, lo que podría generar otros errores. ¿Es posible que estés haciendo algún output antes de ejecutar este script?

Revisa los espacios en blanco y salto de línea antes de las líneas <?php y ?>.

0voto

gonzalss comentado

¿ Tengo que poner el session_start () en ambos php ?

0voto

carlossevi comentado

Debes usarlo cada vez que quieras acceder a alguna información relacionada con la sesión. En este caso concreto desde ambos scripts intentas acceder a $_SESSION por lo que la respuesta es sí, debes incluirlo en ambos.

Que no te engañe la parte del nombre "start" ya que como te decía anteriormente lo que hace la función es "Iniciar una nueva sesión o reanudar la existente" y poner a tu disposición las variables globales relacionadas con al sesión. De esta forma no tienen que cargarse siempre estas variables y sólo lo hacen en el caso de que vayan a utilizarse.

0voto

gonzalss comentado

Me sigue dando el error el warning

<?php session_start();
echo 'Bienvenido:  ';
if (isset($_SESSION['email'])) {
    echo '<b>'.$_SESSION['email'].'</b>.('.$_SESSION['fp_username'].')';
    echo '<p><a href="logout.php">Logout</a></p>';
}else{
?>    
     <form id="formulario" action="validar_usuario3.php" method="post">

       <label for="email"> E-mail </label>
       <br />
       <input type="text" name="email" id="email" class="required email" />
       <br />
       <label for="telefono"> Password </label>
       <br />
       <input type="password" name="password" id="password" class="required" />
       <br>

   <input type="submit" id="enviar" value="Enviar" />

    </form>
            <p><a href="registrar.php">Alta como nuevo usuario </a></p>
<?php           
    }
?>  

El código de validar_usuario3 es este 

<?php session_start();

$dbhost = "localhost";
$dbuser = "corbachu";
$dbpass = "Xxxxx";
$conx = mysql_connect($dbhost, $dbuser, $dbpass);

mysql_select_db("corbachu_percy", $conx)or die ('Error al seleccionar la Base de Datos: '.mysql_error());;

if(trim($_POST['email']) != "" && trim($_POST['password']) != "")
{

$sql = 'SELECT password, email, username FROM usuarios WHERE email="[email protected]" and password="Elliot55" ';
$result = mysql_query($sql);

if($row = mysql_fetch_array($result)){  

if($row['password'] == $password){
        $_SESSION['fp_username'] = $row['username'];
        $_SESSION['email'] = $row['email'];

        $_SESSION['fp_username'];

?>

        <SCRIPT LANGUAGE="javascript">
        location.href = "zona.php";
        </SCRIPT>'

<?php

    }else{

        echo 'Datos incorrectos o contraseñas incorrectas;)';
    }
}else{
    echo 'datos incorrectos :)';
}
mysql_free_result($result);

}else{
echo 'Debe especificar un usuario y password';
}

mysql_close();
?>

Me muestra el warning directamente en la página
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/public_html/zona.php:16) in /home3/corbachu/public_html/zona.php on line 230
http://www.corbachotenis.com/zona.php

0voto

carlossevi comentado

En primer lugar, intenta formatear tus comentarios correctamente para que nos sea más sencillo entenderlos.

Intenta analizar el mensaje de error: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/publichtml/zona.php:16) in /home3/corbachu/public_html/zona.php on line 230

El Warning lo da en la línea 230 de zona.php, donde se intenta hacer un session_start() cuando la salida de información ha empezado en la línea 16.

Esos números de línea no se corresponden con el código que nos has facilitado, así que vamos a tener complicado intentar ayudarte. ¿El código que nos has pegado es el mismo que estás ejecutando?

0voto

gonzalss comentado

Es que sólo he pegado el código php de la página zona.php ya que es muy largo

    230 <?php session_start();  ?>
     231 <p>Bienvenidooo : </p>
     232 <?php 
     233 if (isset($_SESSION['email'])) {
    234 echo '<b>'.$_SESSION['email'].'</b>.('.$_SESSION['fp_username'].')';
    235 echo '<p><a href="logout.php">Logout</a></p>';
    236 }else{
   237 ?> 

El error lo da en la línea 230. La sesión me funciona pero me sale el warning directamente en la página
Y si quito el session_start , me deja de aparecer el warning pero lógicamente no me coge la sesión

0voto

carlossevi comentado

La función session_start() debe ser llamada al inicio del script, de ahí la advertencia. Mueve la llamada a la primera línea del script zona.php.

0voto

gonzalss comentado

Era eso , lo he puesto al principio del script y funciona.

Muchas gracias

0voto

gonzalss comentado

Perdón ,me sigue dando el mismo error. Lo he puesto al inicio del script y ahora me sale el warning al principio de la página.

0voto

carlossevi comentado

Copianos el literal del error y revisa que no haya espacios en blanco ni saltos de página antes del primer <?php.

0voto

gonzalss comentado

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/public_html/zona.php:16) in /home3/corbachu/public_html/zona.php on line 70

Lo único que he puesto es

<?php session_start();

  ?>

Lo he metido debajo de las llamadas

<script type="text/javascript" src="js/jquery.validate.min.js"></script>

Muchas gracias

0voto

carlossevi comentado

A ver si alguien puede mover tu respuesta a comentario, que es lo que realmente es.

¿Qué quieres decir exactamente con "lo he puesto al principio del script"?

Según el mensaje de error, lo tienes en la línea 70. ¿Puedes ponerlo en la primera?

0voto

gonzalss comentado

Lo he metido en la línea 1 y me sale esto ;

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/public_html/zona.php:1) in /home3/corbachu/public_html/zona.php on line 1

0voto

carlossevi comentado

¿Tienes así el inicio del fichero zona.php?

<?php
session_start();
... resto contenido ...

¿Sin nada delante del signo <? ¿Sin ninguna otro comando en la misma línea?

0voto

gonzalss comentado

Lo tengo así :

  <?php session_start();

  ?> 
<!DOCTYPE HTML>
<HTML>

0voto

carlossevi comentado

No tengo tu archivo para comprobarlo, pero según el texto que has copiado, entre <!DOCTYPE HTML> y el inicio de la línea no hay ningún espacio, pero delante de <? session_start(); sí que parece haber: ` dos espacios o un tabulador o algo. ¿Estás seguro de que el primer caracter del fichero es el<`?

0voto

gonzalss comentado

Lo he puesto ahora así

  <?php session_start();?>
<!DOCTYPE HTML>
<HTML>

Con el resultado : Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home3/corbachu/public_html/zona.php:1) in /home3/corbachu/public_html/zona.php on line 1

0voto

carlossevi comentado

Sigue pareciendo que en la primera línea hay algún caracter delante del <. ¿Te has asegurado que el primer caracter de todo el fichero es el signo <?

0voto

gonzalss comentado

Tenias razón era por el espacio .
Ahora funciona perfectamente
Muchas gracias amigo

0voto

carlossevi comentado

Me alegro que te funcione. En el futuro intenta leer más despacio los comentarios ya que esta misma solución te la di como 10 comentarios más arriba y podíamos haber ahorrado algo de tiempo =)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta