Foros del Web » Programando para Internet » PHP »

Problema con sesión

Estas en el tema de Problema con sesión en el foro de PHP en Foros del Web. Buenas, otra vez me vuelven a surgir problemas sin razón aparente. Esta vez, el problema es de sesiones. Tengo diferentes páginas en la que arriba ...
  #1 (permalink)  
Antiguo 05/05/2013, 14:38
Avatar de Jogabba  
Fecha de Ingreso: octubre-2012
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Problema con sesión

Buenas, otra vez me vuelven a surgir problemas sin razón aparente.

Esta vez, el problema es de sesiones. Tengo diferentes páginas en la que arriba te salen dos botones (conectarse o registrarse) en caso de que no hayas hecho login y uno de desconectarse en el caso de que sí te hayas identificado.

En mi caso, todo va bien hasta que intentas hacer login. Entonces, puede pasar que la página te identifique o no lo haga (es decir, que te siga mostrando los botones de entrar y registrarse). Lo raro es que, aunque la página no te haya identificado, puede darse el caso de que saltes a otra página y esta sí te identifique sin pasar por otro login (y te muestre el botón de desconectarse).

Y aún más raro: el botón de desconectarse es completamente inútil. Pese a que la página te informa de que la sesión ha sido destruida con éxito, puede ser que te siga identificando.


Para más información, diré que todas las páginas están hechas a partir de la misma estructura, que he escrito previamente.
Todas cuentan con esta cabecera:

Cita:
<?php include ("sesion.php")?>
<!DOCTYPE html>
<html>
<?php include ("head.php")?>
<body>
<?php include ("header.php")?>
La página sesion.php es la que identifica si estás conectado o no y te muestra unos botones u otros. Su código es este:

Cita:
<?php session_start();
$toplinks = "";
if (isset($_SESSION['id'])) {
$userid = $_SESSION['id'];
$username = $_SESSION['nick'];
$toplinks = '<span id="textohead">Bienvenido,'. $username.'.</span>
<a href="logout.php"><button id="boto1" > Desconectarse</button></a>';
} else {
$toplinks = '<button id="boto1"><a href="registro.php">Registra\'t</a></button><button id="boto1"><a href="login.php">Entra</a></button>';
}
?>
En cuanto al logout inservible, su código es este:

Cita:
<?php
session_start();

session_destroy();
if(!session_is_registered('id')){
$msg = "You are now logged out";
} else {
$msg = "<h2>could not log you out</h2>";
}
?>
<html>
<body>

</body>
</html>
¿Alguna idea de qué es lo que ocurre? Gracias de antemano.
  #2 (permalink)  
Antiguo 05/05/2013, 15:21
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con sesión

session_is_registered
Cita:
Esta función ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.
http://php.net/manual/es/function.se...registered.php


revisa este articulo: http://www.cristalab.com/tutoriales/...5.3.5-c96438l/

te sugiero descargues esta extencion para chrome: http://chrispederick.com/work/web-developer/

luego borres todas las cookies con ella y pruebes el funcionamiento, arreglando el script con lo que se emnciona en el link de cristalab.

saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 05/05/2013, 15:54
Avatar de rocha7778  
Fecha de Ingreso: mayo-2013
Ubicación: Cartagena Colombia
Mensajes: 79
Antigüedad: 10 años, 11 meses
Puntos: 1
Respuesta: Problema con sesión

te dejo este codigo perfectamente funcionando.

ya que lo que quieres hacer es un login y un lougt.

aunque no veo como haces login , seria bueno que lo colocaras el codigo.

el proceso de validacion en mi caso personal,

pasa por tres etapas y una ultima 4:
1. recibir variables
2. registrar las variables de session
3. validar si se registraron las variales de session

si quieres ver un contenido se valida si estas logiado , de lo contrario se envia a una pagina de registro.

4. y ultimo lougout.

revisa en que paso esta la falla.


archivo para validar si se creo una session valida, validar.php
Código PHP:

<?php

if (!isset($_SESSION)) {
    
session_start();
}





// esta funcion debuelve un valor 
// entero 0 para falso 
// 1 para verdadero
function validar_user() {

    if (isset(
$_SESSION['k_userName'])) {
          
        
        return 
1;
    } else {


        return 
0;
    }
}


/**
 *Esta funcion identifica al usuario  que ha
 * iniciado session  durante toda la aplica
 * 
 * devuelve el nombre del usuario quien inicio
 * session como un string
 * @return string 
 */

function nombre() {

    if (isset(
$_SESSION['k_userName'])) {
        return 
"Usted es:" $_SESSION["k_userName"] . "   ";
    } else {
        return 
"usted es: un visitante  ";
    }
}




?>
luego el codigo de un simple formulario para login, login.php

Código PHP:
<form  method="post" action="registrarVariables.php">

    <
label for="txtUsername">Usuario:</label>
    <
input id="usuario" name="usuario" type="text"/>
    <
br>
    <
label for="txtName">Contrase&ntilde;a:</label>
    <
input id="password" name="password" type="password"/>
    <
br>

    <
input name="submit" type="submit" value="Registrar" />


</
form
aqui viene el primer paso recibir las variables
dos registrar las variables

Código PHP:

<?php
session_start
();
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
$nombre=$_POST['usuario'];
 
$pass$_POST['password'];//
 
 
if($nombre=='carlos'){


     
// aqui registras la variable     
     
$_SESSION['k_userName']=$nombre;
     
     echo(
'<script>location.href="verDocumento.php"</script>');
     
 }else{
      echo(
'<script>location.href="verDocumento.php"</script>');
 }
         
         
 
?>

tercero visualizar el contenido, pero no antes validando si hay una session registrada o valida

el archivo se llama verDocumento.php
Código PHP:

<?php
require 'validar.php';
?>

<?php
if (validar_user()) {
    
    echo 
"usted es".nombre()."<br><br><br>";
    
?>

mostrar contenido [en tu caso es el boton de log out]


<a href="log.php"><button id="boto1" > salir</button></a>

    <?php

} else {
    
?>
no mostrar contenido [en tu caso es el boton de registro]
<a href="login.php"><button id="boto1" > registrarse o login</button></a>

<?php ?>

por ultimo salir , log.php

Código PHP:
<?php
session_start
();
session_destroy(); 
?> 

<a href="login.php"><button id="boto1" > registrarse o login</button></a>
este codigo funciona perfectamente , igualmente lo busque en internet.

analisalo y si tienes duda pregunta.
espero haberte ayudado.
  #4 (permalink)  
Antiguo 08/05/2013, 15:36
Avatar de Jogabba  
Fecha de Ingreso: octubre-2012
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problema con sesión

Gracias, pero me gustaría comprender por qué no funciona mi código antes de usar otro.

Por cierto, la página de login es así:



Cita:
<?php

session_start();
if (isset($_POST['nick'])) {
//Connect to the database through our include
include ("PHP/connect_to_mysql.php");

$nick = $_POST['nick'];

$password = preg_replace("[^A-Za-z0-9]", "", $_POST['password']); // filter everything but numbers and letters
$password = md5($password);
// Make query and then register all database data that -
// cannot be changed by member into SESSION variables.
// Data that you want member to be able to change -
// should never be set into a SESSION variable.
$sql = mysql_query("SELECT * FROM members WHERE nick='$nick' AND password='$password' AND activacion='1'");
$login_check = mysql_num_rows($sql);
if($login_check > 0){
while($row = mysql_fetch_array($sql)){
// Get member ID into a session variable
$id = $row["id"];
$_SESSION['id'] = $id;

// Get member username into a session variable
$nick = $row["nick"];
$_SESSION['nick'] = $nick;

// Print success message here if all went well then exit the script
header("location: http://www.vacancesisortides.com/index.php");
exit();
} // close while
} else {
// Print login failure message to the user and link them back to your login page
print '<br /><br /><font color="#FF0000">No match in our records, try again </font><br />
<br /><a href="login.php">Click here</a> to go back to the login page.';
exit();
}
}// close if post
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Login to your profile</title>
<script type="text/javascript">
<!-- Form Validation -->
function validate_form ( ) {
valid = true;
if ( document.logform.email.value == "" ) {
alert ( "Please enter your User Name" );
valid = false;
}
if ( document.logform.pass.value == "" ) {
alert ( "Please enter your password" );
valid = false;
}
return valid;
}
<!-- Form Validation -->
</script>
</head>
<body>
<div align="center">
<h3><br />
<br />
Conéctate:<br />

<br />
</h3>
</div>
<table align="center" cellpadding="5">
<form action="http://www.vacancesisortides.com/login.php" method="post" enctype="multipart/form-data" name="logform" id="logform" onsubmit="return validate_form ( );">
<tr>
<td class="style7"><div align="right">Nick</div></td>
<td><input name="nick" type="text" id="nick" size="30" maxlength="64" /></td>
</tr>
<tr>
<td class="style7"><div align="right">Contraseñaa:</div></td>
<td><input name="password" type="password" id="password" size="30" maxlength="24" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="Submit" type="submit" value="Conectate" /></td>
</tr>
</form>
</table>
Si aún no estás registrado, hazlo <a href="http://www.vacancesisortides.com/registre.php">aquí.</a>
</body>
</html>

Última edición por Jogabba; 08/05/2013 a las 15:42
  #5 (permalink)  
Antiguo 08/05/2013, 20:23
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con sesión

mmm que intentas hacer con esto:
Código PHP:
Ver original
  1. $sql = mysql_query("SELECT * FROM members WHERE nick='$nick' AND password='$password' AND activacion='1'");
  2. $login_check = mysql_num_rows($sql);
  3. if($login_check > 0){
  4. while($row = mysql_fetch_array($sql)){
  5. // Get member ID into a session variable
  6. $id = $row["id"];
  7. $_SESSION['id'] = $id;
  8.  
  9. // Get member username into a session variable
  10. $nick = $row["nick"];
  11. $_SESSION['nick'] = $nick;
  12.  
  13. // Print success message here if all went well then exit the script
  14. header("location: http://www.vacancesisortides.com/index.php");
  15. exit();
  16. } // close while
  17. }

yo usaria:
Código PHP:
Ver original
  1. $sql = mysql_query("SELECT * FROM members WHERE nick='$nick' AND password='$password' AND activacion='1'");
  2.     if(mysql_num_rows($sql) > 0) {
  3.         $row = mysql_fetch_array($sql);
  4.         // Get member ID into a session variable
  5.         $_SESSION['id'] = $row["id"];
  6.  
  7.         // Get member username into a session variable
  8.         $_SESSION['nick'] = $row["nick"];
  9.  
  10.         // Print success message here if all went well then exit the script
  11.         header("location: http://www.vacancesisortides.com/index.php");
  12.         exit();
  13.     } else {

dejendo ese detalle de lado, no veo en que momentos compruebas si el usuario ya esta logueado, podemos mejorar ese codigo pero el problema no esta alli...
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 09/05/2013, 09:45
Avatar de Jogabba  
Fecha de Ingreso: octubre-2012
Mensajes: 18
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problema con sesión

¿A qué te refieres, NSD? El código de sesion.php que he puesto en el primer post y va incluido en todas las páginas de mi site es suficiente para comprobar si el usuario está logueado, ¿no? ¿O se me ha escapado algo?
  #7 (permalink)  
Antiguo 09/05/2013, 10:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con sesión

mmm veamos, si el usuario se loguea registras los datos de la session y lo rediriges a otra pagina donde supongo tienes incluido session.php a priori deberia funcionar.

sigues con el problema de que no te loguea?

habria que revisar exaustivamente tu codigo para determinar en que linea falla, sin embargo te hago una sugerencia: cambia la forma de manejar el logueo.

de la forma que lo haces es muy "artesanal", con esto me refiero a que el usuario solo se puede loguear desde una unica pagina no desde cualquiera.

te pongo el codigo de ejemplo que tendria que tener tu session.php (basandome en los que pasaste)

Código PHP:
Ver original
  1. <?php
  2.     session_start();
  3.     $toplinks = '';
  4.     if (isset($_SESSION['id'])) {
  5.    
  6.         //Si ya estas logueado.
  7.         $toplinks = '<span id="textohead">Bienvenido, '.$_SESSION['nick'].'.</span><a href="logout.php"><button id="boto1">Desconectarse</button></a>';
  8.        
  9.     } elseif (isset($_POST['nick'])) {
  10.         //Si te estas logueando ahora
  11.        
  12.         include ("PHP/connect_to_mysql.php");
  13.        
  14.         //Filtro y encripto la clave.
  15.         $password = preg_replace("[^A-Za-z0-9]", "", $_POST['password']);
  16.         $password = md5($password);
  17.        
  18.         $sql = mysql_query("SELECT * FROM members WHERE nick='$nick' AND password='$password' AND activacion='1'");
  19.        
  20.         //Si encontre al usuario.
  21.         if(mysql_num_rows($sql) > 0) {
  22.             //Agarro los datos del usuario en un array.
  23.             $row = mysql_fetch_array($sql);
  24.            
  25.             //Los guardo en la sesion.
  26.             $_SESSION['id'] = $row['id'];
  27.             $_SESSION['nick'] = $row['nick'];
  28.            
  29.             //Preparo el toplink.
  30.             $toplinks = '<span id="textohead">Bienvenido, '.$_SESSION['nick'].'.</span><a href="logout.php"><button id="boto1">Desconectarse</button></a>';
  31.         } else {
  32.            
  33.             //Si no encontre al usuario redirijo a la pagina de login.
  34.             header("location: http://www.vacancesisortides.com/index.php?loginincorrecto=si");
  35.             exit();
  36.         }
  37.     } else {
  38.         //Si no esta logueado ni se esta logueando.
  39.         $toplinks = '<button id="boto1"><a href="registro.php">Registra\'t</a></button><button id="boto1"><a href="login.php">Entra</a></button>';
  40.     }
  41. ?>

en al action de tu formulario de logueo debes poner la pagina que se debe abrir si los datos estan bien, por ejemplo su perfil o lo que sea, no importa a que pagina apuntes, el codigo de session.php se encargara de validar y de lo contrario volvera al index.

como veras cuando redirecciona envia una variable por GET tu podrias tomar esta variable y si esta definida en "si" mostrar un cartelito.

se podria ampliar aun mas el codigo y agregar que si recibe por $_GET una variable que diga logout=si deslogue al usuario, tambien se podria agregar que guarde en la session la ip del visitante y luego verifique que sea la misma ip en cada caso, por si algun malechor digital le robo una cookie que no pueda hacerse pasar por el.

en fin, hay varias cosas interesantes como para agregarle, pero en principio ahi tendria que andar.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: html, registro, sesión
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 22:58.