Foros del Web » Programando para Internet » PHP »

No puedo encontrar por qué no anda...

Estas en el tema de No puedo encontrar por qué no anda... en el foro de PHP en Foros del Web. Estoy haciendo un validador de usuario y contraseña. Está practicamente terminado pero hace una cosa muy extraña. El tema es con los diferentes tipos de ...
  #1 (permalink)  
Antiguo 13/12/2008, 15:40
Rodre
Invitado
 
Mensajes: n/a
Puntos:
No puedo encontrar por qué no anda...

Estoy haciendo un validador de usuario y contraseña. Está practicamente terminado pero hace una cosa muy extraña. El tema es con los diferentes tipos de error que puede haber al poner mal usuario y contraseña. Está hecho de forma tal que cuando usuario y/o contraseña no concuerdan con la base, avisa dónde está el error y vuelve a mostrar el form para ingresar los datos.

Si se ponen bien los datos funciona bien.
Si se pone mal el usuario, salta el cartel de usuario uinexistente, y pone el form de nuevo.
El problema es que si se pone bien el usuario, pero mal la contraseña, vuelve al login, pero no muestra el cartel de contraseña inválida!... y lo más loco, es que solo sucede la primera vez. Es decir si luego de que no acertó la primera vez, la vuelvo a ingresar mal.. ahi si me muestra el cartel. La verdad estoy hace media hora revisando el código, y no me doy cuenta de lo que sucede. Pongo el código a ver si alguien encuentra lo que sucede.

Soy nuevo en esto, así que quizá haya algo muy boludo que no estoy viendo..

Gracias de antemano

CODIGO DE LOGIN.PHP
Código php:
Ver original
  1. <?
  2. $_SESSION['validate'] = 0;
  3. ?>
  4. <html>
  5. <head>
  6. <title>Log in</title>
  7. <link rel="stylesheet" type="text/css" href="login.css">
  8. </head>
  9. <body>
  10. <?
  11. if ($_SESSION['error'] == 1)
  12.   {
  13.     echo "Contraseña inválida";
  14.     $_SESSION['error'] = 0;
  15.   }
  16. else if ($_SESSION['error'] == 2)
  17.   {
  18.     echo "Usuario inexistente";
  19.     $_SESSION['error'] = 0;
  20.   }
  21. else
  22.   {
  23.     echo "&nbsp;";
  24.   }
  25. ?>
  26. <div align="center">
  27.   <div class="contenedor">
  28.     <form action="validate.php" method="post">
  29.       <table>
  30.         <tr>
  31.           <td>Usuario:</td>
  32.           <td><input type="text" name="usuario"></td>
  33.         </tr>
  34.         <tr>
  35.           <td>Password:</td>
  36.           <td><input type="password" name="password"></td>
  37.         </tr>
  38.         <tr>
  39.           <td colspan="2" align="center"><input type="submit" value="Ingresar"></td>
  40.         </tr>
  41.       </table>
  42.     </form>
  43.   </div>
  44. </div>
  45. </body>
  46. </html>

CODIGO DE VALIDATE.PHP
Código php:
Ver original
  1. <?
  2. $_SESSION['error'] = 0;
  3. $usuario = $_POST['usuario'];
  4. $password = $_POST['password'];
  5. $conexion = mysql_connect('localhost','root','atun');
  6. if (!$conexion)
  7.   {
  8.     echo "No se puede conectar";
  9.   }
  10. mysql_select_db("nicole");
  11. $query = "SELECT * FROM sesiones WHERE user = '$usuario'";
  12. $rowset = mysql_query($query);
  13. $log = 0;
  14. if($row = mysql_fetch_array($rowset))
  15.   {
  16.     do
  17.     {
  18.       if($row['pass'] == $password)
  19.       $log = 2;
  20.     }
  21.       while($row = mysql_fetch_array ($rowset));
  22.     }
  23. else $log = 1;
  24. if($log == 0) // Contraseña inválida
  25.   {
  26.     $_SESSION['error'] = 1;
  27.     Header("Location: login.php");
  28.   }
  29. else if($log == 1) // Usuario inexistente  
  30.   {
  31.     $_SESSION['error'] = 2;
  32.     Header("Location: login.php");
  33.   }
  34. else if ($log == 2) // Success
  35.   {
  36.     $_SESSION['validate'] = 1;
  37.     Header("Location: manage.php");
  38.   }
  39. mysql_close($conexion);
  40. ?>

Saludos

Última edición por GatorV; 13/12/2008 a las 16:05
  #2 (permalink)  
Antiguo 13/12/2008, 16:12
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: No puedo encontrar por qué no anda...

Yo lo cambiaria a algo mas sencillo y sin usar variables en session hasta que sea realmente necesario:

Estructura login.php:
Código:
session_start()
$error = '';
Si existe $_POST['entrar'] {
    Procesar los campos necesarios
    si usuario o password = '' {
          $error  = 'no dejes en blanco estos campos'
    } else {
         buscar usuario y password en la base de datos
         si usuario no existe {
               $error = 'nombre de usuario invalido'
         } else si password no coincide {
               $error = 'contraseña invalida'
         } else {
               no hay errores, establecer las variables necesarias y redirigir
         }
    }
}
echo $error
?>
aqui el formulario solo modificas el action
      <form method="post" action"=login.php">
agregas un campo oculto:
      <input type="hidden" name="entrar" value="1" />
y finalizas con el resto del formulario
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 13/12/2008, 16:29
Rodre
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: No puedo encontrar por qué no anda...

Ok, entiendo tu punto y estoy de acuerdo.

La duda que me entra es, el campo oculto es para checkear si existe solamente? o tiene otra funcion ?

Y lo otro sería, para evitar que alguien quiera saltear el login poniendo la dirección de la página directamente en el browser uso una variable de sesion ?

Última edición por Rodre; 13/12/2008 a las 16:34
  #4 (permalink)  
Antiguo 13/12/2008, 16:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: No puedo encontrar por qué no anda...

El campo oculto es solo para saber si el formulario fue enviado y procesar la informacion recibida, solo para eso.

En todas las paginas que no quieras que se vean directamente debes verificar la sesion creada en login.php (cuando no hubo errores), si la sesion no es valida, los rediriges a login.php nuevamente.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 13/12/2008, 16:59
Rodre
Invitado
 
Mensajes: n/a
Puntos:
Ok, mil gracias por tu ayuda.

Esto es un php para un login que busca en una base y autentifica o no. Despues de varios retoques y gracias a la ayuda de algunos foreros funciona bien. Pero me pasa algo que si bien no altera el funcionamiento me generó curiosidad.

Sucede que en el caso de que alguno de los datos de usuario o contraseña esté equivocados, vuelve al formulario de login mostrando donde estuvo el error todo bien. Si en esa instancia se hace un refresh desde el browser, salta un cartel del firefox que dice lo siguiente, y no hace el refresh.

"Para mostrar esta página, Firefox debe enviar información que repetirá cualquier acción (como una búsqueda o una compra) que pueda haberse hecho anteriormente."

Alguien sabe a qué se deb esto ?

Dejo el código.

Saludos

Código PHP:
<?
session_start
();
$_SESSION['validate'] = 0;
$usuario $_POST['usuario'];
$password $_POST['password'];
$entrar $_POST['entrar'];
$error "";
$primero "Ingrese sus datos";
if (
$entrar == 1)
{
  
$conexion mysql_connect('localhost','root','atun');
  if (!
$conexion
    {
      echo 
"No se puede conectar";
    }
  
mysql_select_db("nicole");
  
$query "SELECT * FROM sesiones WHERE user = '$usuario'";
  
$rowset mysql_query($query);
  
$log 0;
  if(
$row mysql_fetch_array($rowset))
    { 
      do
      {
        if(
$row['pass'] == $password)
        {
          
$_SESSION['validate'] = 1;
          
mysql_close($conexion);
          
Header("Location: manage.php"); // Success
        
}
        else 
        { 
          
$error "Contraseña inválida";
        }
      }
      while(
$row mysql_fetch_array ($rowset));
    }
  else
  {
    
$error "Usuario inexistente";
  }
  
mysql_close($conexion);
}
?>
<html>
<head>
<title>Log in</title>
<link rel="stylesheet" type="text/css" href="login.css">
</head>
<body>
<div align="center">
  <div class="contenedor">
    <form action="login2.php" method="post">
      <table>
        <tr>
          <td colspan="2" align="center"><?if ($entrar == 1) {echo $error;} else {echo $primero;}?></td>
        </tr>
        <tr>
          <td>Usuario:</td>
          <td><input type="text" name="usuario"></td>
        </tr>
        <tr>
          <td>Contraseña:</td>
          <td><input type="password" name="password"></td>
        </tr>
        <tr>
          <td colspan="2" align="center"><input type="submit" value="Ingresar"></td>
        </tr>
        <tr>
          <td><input type="hidden" name="entrar" value="1"></td>
        </tr>
      </table>
    </form>
  </div>
</div>
</body>
</html>

Última edición por GatorV; 13/12/2008 a las 20:39
  #6 (permalink)  
Antiguo 13/12/2008, 20:29
 
Fecha de Ingreso: febrero-2006
Mensajes: 858
Antigüedad: 18 años, 2 meses
Puntos: 4
Respuesta: Por qué pasa esto ?

creo que esto no tiene nada que ver con el codigo,, es simplemente porque firefox esta volviendo a enviar los datos al servidor ,,
es x eso lo que pasa,,

no estoy seguro,, asi que espera mas respuestas

saludos
__________________
*La amistad se multiplica cuando se divide*
  #7 (permalink)  
Antiguo 13/12/2008, 20:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por qué pasa esto ?

Temas unidos por favor continua sobre el mismo tema.
  #8 (permalink)  
Antiguo 13/12/2008, 20:55
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: No puedo encontrar por qué no anda...

Eso no sólo te sucederá con Firefox, sino con IE y otros exploradores. Si tu haces un request tipo POST, el sevridor genera y manda un contenido al navegador. Si refresacas la página el navegador tendrá que enviar nuevamente el mismo tipo de request para obtener la misma página, por lo tanto, los datos que enviaste previamente en tu formulario deberán ser enviados nuevamente.

La única solución es evitar mostrar algún tipo de contenido en las páginas que procesan requests tipo POST. Osea, hacer el procesamiento y luego redirigir inmediatamente usando header() sin enviar algún otro tipo de cabeceras al navegador. Sólo así evitas el reenvio de datos.

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:37.