Foros del Web » Programando para Internet » PHP »

Sobre las cookies

Estas en el tema de Sobre las cookies en el foro de PHP en Foros del Web. Holas!!! Bueno el tema es sobre las cookies, tengo una página llamada uvalidar.php y una llamada uficha.php, en la primera tengo un simple formulario de ...
  #1 (permalink)  
Antiguo 16/07/2004, 09:45
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Sobre las cookies

Holas!!!

Bueno el tema es sobre las cookies, tengo una página llamada uvalidar.php y una llamada uficha.php, en la primera tengo un simple formulario de Login, para que el usuario introduzca su nick y contraseña y en la segunda realizo toda la comprobación de los datos para, si son correctos, mostrar una ficha con los datos del usuario.

Lo que yo quiero saber es como hacer para cuando el usuario ya se ha validado, debería crear una página que haga la validación e incluirla en las que yo quiera que se recuperen los datos de la cookie??

Pongo el código de mi página de validación para ver si se entiende mejor:

Código PHP:
<html>
<head>
<? include("variables.php"); ?>
<title>Acceso Usuarios - <? echo $Site?></title>
<LINK rel="stylesheet" href="Estilos/estilo.css">
</head>
<body>
<? include("cabecera.php"); ?>
<br>
<?
echo "<table width=\"90%\" bgcolor=\"#0000DD\" border=\"2\" bordercolor=\"white\" cellspacing=\"0\" cellpading=\"0\"><tr>";
echo 
"<td bgcolor=\"#0000AA\" bordercolor=\"\0000AA\" onMouseOver=\"this.style.background='#00F'\" onMouseOut=\"this.style.background='#00B'\">";
echo 
"<font>Introduce tu nombre de <font class=\"1\">usuario</font> y <font class=\"1\">contraseña</font> para acceder a tu ficha personal.</font>";
echo 
"</td></tr></table>";
?>
<br>
<?
echo "<table width=\"40%\" bgcolor=\"#0000DD\" cellspacing=\"0\" cellpading=\"0\" align=\"center\"><tr>";
echo 
"<img src=\"ImagenesUsuarios/EsquinaTablaLogin.gif\"></tr><tr>";
echo 
"<td align=\"center\" style=\"border-right:2px orange solid;\"><form name=\"form_login\" action=\"uficha.php\" method=\"post\">";
echo 
"<hr align=\"center\"><br>";
echo 
"Nick: &nbsp;<input type=\"text\" maxlenght=\"15\" name=\"Nickusu\"><br><br>";
echo 
"Pass: &nbsp;<input type=\"Password\" maxlenght=\"10\" name=\"Passusu\"><br><br>";
echo 
"<hr align=\"center\"><br><br>";
echo 
"<hr align=\"center\">";
echo 
"<input type=\"submit\" value=\"Enviar\">&nbsp;&nbsp;&nbsp;<input type=\"reset\" value=\"Vaciar\"><br>";
echo 
"<hr align=\"center\">";
echo 
"</form>";
echo 
"</td><td><img src=\"ImagenesUsuarios/Login.jpg\" border=\"2\" style=\"border-color:white;\" align=\"right\">";
echo 
"</td></tr></table>";
echo 
"<table width=\"40%\" align=\"center\"><tr>";
echo 
"<img src=\"ImagenesUsuarios/EsquinaTablaLogin2.gif\"></tr></table>";
?>
<br>
<? include("pie.php"); ?>
</body>
</html>
Saludos!!

Última edición por Animanganime; 16/07/2004 a las 09:50 Razón: Modificar datos
  #2 (permalink)  
Antiguo 16/07/2004, 09:49
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
La otra

Y este es el código de la página uficha.php en la que muestro la ficha del usuario una vez validado:

Código PHP:
<html>
<head>
<? include("variables.php"); ?>
<title>Ficha de Usuario - <? echo $Nick?></title>
<LINK rel="stylesheet" href="Estilos/estilo.css">
</head>
<body>
<? include("cabecera.php"); ?>
<br>
<?
if($Nickusu == "" || $Passusu == "") {
echo 
"<p align=\"center\"><font class=\"2\">Debe rellenar los datos completamente. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                                     }

$conec = @mysql_connect("localhost""root");
mysql_select_db("Animanganime"$conec);

$existe mysql_query("SELECT * FROM Usuarios WHERE Nick='$Nickusu'"$conec);
$num_existe mysql_num_rows($existe);

if(
$num_existe==0) {
echo 
"<p align=\"center\"><font class=\"2\">El Nick $Nickusu no existe. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                   }
if(
mysql_result($existe0"Password")!=$Passusu) {
echo 
"<p align=\"center\"><font class=\"2\">La contraseña es incorrecta. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                                                   }
Ficha del usuario aqui...

mysql_close($conec);

?>
<br>
<? include("pie.php"); ?>
</body>
</html>
Saludos!!

Última edición por Animanganime; 16/07/2004 a las 09:50 Razón: Fallo en código
  #3 (permalink)  
Antiguo 16/07/2004, 09:58
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
mira estoy viendo, y por lo que veo no reconoces lo que es en teoría las cookies.

Se tienen que poner antes que cualquier instrucción HTML, por lo que si quieres usarlo acá, puedes usar un META redireccionador a un archivo que cree cookies, obviamente, en puro PHP. y con eso lo creas perféctamente.

Para mas información visita: http://mx.php.net/manual/es/features.cookies.php

Última edición por lado2mx; 16/07/2004 a las 10:01
  #4 (permalink)  
Antiguo 16/07/2004, 10:02
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Es así

Si este código esta sin cookies más que nada porque nose exactamente como hacer para que funcione sin problema, mi idea es poner una comprobación de que hay cookie en la página de uvalidad.php y que si la hay vaya directamente a la ficha, redireccionando automáticamente y si no la hay pues que el usuario logee.

Sería ese el método??

Saludos!!
  #5 (permalink)  
Antiguo 16/07/2004, 10:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Lo ideal sería que tuvieras tu código de validación separado del de la presentación de los mensajes de error/exito o del proceso que se ha de realizar si se autentificó tu usuario (que lo validó tu consulta a tu BD).

Así conseguirías un sistema más versatil.

El objetivo sería:
1) Tu formuario de login -> validar usuario (autentificarlo).
2) Si se autentifica correctamente .. redireccionas hacia donde tenga que ir: en tu caso a tu script.php que haga el proceso de ver esa ficha o lo que corresponda.
Si no se autentifica correctamente . .lo redireccionas al formulario de login.

Estos redireccionamientos que hablo los puedes hacer con:
header ("Location: pagina.tal");

Y .. para el caso del "error" donde volveras a tu formulario .. puedes usar una variable de control para presentar los mensajes de error en la página del formulario NUNCA en el proceso (flujo continuo.. a continuación) de tu proceso. Es decir .. ejemplo:

Código PHP:
if (todo bien){
header ("Location: perfil.php"); // o donde sea
exit;
} else {
header ("Location: formulario.php?codigo=error");
exit;

Y en tu formulario.php .. verificas la existencia de esa variable "codigo" para mostrar o no el mensaje de error en consecuencia.

Código PHP:
if (isset($_GET['codigo'])){
echo 
"Error: tal cosa está mal";

Esto sería el proceso de "autentificación" .. ahora faltaría el proceso de "validación o seguimiento" del usuario en tus páginas de tu sitio .. por lo menos en esa que se redirecciona al ser validado tu usuario: "perfil.php".

Para ese "seguimiento" puedes usar cookies o mejor todavía sesiones (más seguras).

El proceso de "seguimiento" del usuario pasa por dos cosas:
1) crear las variables de sesión/cookies en la autentificación (si es válida).
2) verificar la existencia al menos de esas variables de cookie/sesión en las páginas que requieran autentificación (que han sido validadas por tu login).

Al usar "cookies" para este seguimiento necesitas crear en la cookie la variable de tu "usuario" y de tu "password" (es altamente recomendable que trabajes con passwords encriptados en MD5() al menos), para poder -volver- a autentificar a tu usuario en esa página haciendo la consulta a tu DB pero en este caso serán tomados los datos de la cookie y no los de tu formulario. Esto es una validación necesaria si quieres algo de seguridad usando cookies, por qué si tan sólo verificas la existencia de esa cookie (con el "usuario" sobraría) ..la cookie podría ser alterada y "suplantar" a otro usuario en tu sistema. (por eso mismo recomiendo usar sesiones y no cookeis para esta taréa concreta). Si usas sesiones para este "seguimento" puedes "confiar" en sólo validar la existencia de esta variable de sesión (sin hacer la consulta a tu BD nuevamente) pues la sesión (sus datos) permanecen en el servidor y no son tan fácilmente "alterarbles" por el própio usuario con algo de experiencia.

Un saludo,
  #6 (permalink)  
Antiguo 16/07/2004, 10:33
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Paso a paso

Bueno, como yo me he metido en PHP a saco y sin tener todos los conocimientos previos es posible que me pierda un poco con ciertas cosas. Dicho de otra manera intento correr antes que caminar y es lógico que tropieze jeje.

Si no te he entendido mal tu me dices que en el mismo formulario de login haga la comprobación de que los datos son correctos y en caso de serlos que vaya a mi ficha o, si no lo son, que vuelva a la página de login para que introduzca nuevamente los datos, no??

Si es así entonces en el action del formulario debería indicar la propia página de login como destino y la autentificación meterla en una función que tendría que ser llamada al validar, cierto?

Saludos!!
  #7 (permalink)  
Antiguo 16/07/2004, 11:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
no ..
decía

formaulario_login.php (el action=apunta a procesa_login.php .. da igual si lo tienes en un mismo script o en otro .. mas simple para empezar en otro aparte.)

procesa_logion.php
ahí validas a tu usuario como ya lo haces contra tu BD.

El proceso de "autentificación" puedes tenerlo en otro script y llamarlo en las páginas que requieran autentificación o bien en el mismo.

¿Por qué hablo de tener todo separado? .. Por qué si o tienes junto has de implementar más lógica que tal vez ahora no "conoces" . .por eso hablo de tenermo separado (sea en una función o como lo llames es lo de menos).

sería algo así:

formulario.php
Código PHP:
<?
if (isset($_GET['codigo'])){
echo 
"hay un error";
}
<
form .. action="autentifica.php" method="post">
</
form>
perfil.php
Código PHP:
<?
include ("valida.php");
echo 
"Hola: ".$_COOKIE['nombre'];
// resto de tu lógica para obtener el perfil...
?>
valida.php (validación muyyy simple en este ejemplo)
Código PHP:
<?
if (!isset($_COOKIE['nombre'])){
header ("Location: formulario.php");
exit;
}
?>
autentifica.php
Código PHP:
<?
// tu actual código que validas contra tu BD si es correcto ese usuario/pass que pides en el formualrio.

if (correcto todo){
// creas la cookie (con un tiempo de expiración)
// se crea la cookie "nombre" (así de nombre) y con valor .. el de tu "usuario" .. para que así lo uses en tus "perfil" y en las consultas SQL que hagas bajo esa condición.
setcookie ("nombre",$_POST['usuario'],time()+3600);
header ("Location: perfil.php");
exit;
} else {
header ("Location: formulario.php?codigo=error"); 
exit;
}
Esta "validacion" es extremadamente simple .. ya te comenté sus problemas .. así que toma el ejemplo para ver el "proceso" pero a ser posible usa sesiones.

Un saludo,

Última edición por Cluster; 16/07/2004 a las 11:05
  #8 (permalink)  
Antiguo 16/07/2004, 19:56
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
A ver

Voy a ponerme a ello pero viendo si he captado tu idea:

Creo el formulario, imaginemos, login.php en el que remitirá el nombre de usuario y pass a valida.php que me comprobará la base de datos para saber si existe, en caso de existir, mete la cookie con el nombre del usuario y me redirecciona a perfil.php para mostrar el perfil recogiendo el valor de la cookie y demás datos.

Para luego no tener que repetir el proceso crear una página autentifica.php que explorará a ver si hay cookie y si no la hay que valla al formulario, pero en este también sería adecuado que si la cookie existe la recoja, no??

Saludos!!
  #9 (permalink)  
Antiguo 16/07/2004, 20:21
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
Pues claro, mira, y para que reconosca la cookie; veo que usas interfases en PHP, entonces, puedes hacer una sola página con toda la interfase tanto en PHP como en HTML, y obviamente, al inicio de la página, reconocer la cookie, y en caso que exista o no exista el usuario registrado, plasmarlo en el HTML.

Usa la idea de perfil.php y con eso te facilita muchísimo la forma de recuperar la información del usuario.
  #10 (permalink)  
Antiguo 19/07/2004, 07:17
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Algo falla

Holas!!

He creado la página que me comprueba los datos y que me redirecciona, a nivel local, en mi equipo funciona, pero una vez lo cuelo deja de funcionar, este es el código:

Código PHP:
<html>
<head>
<? include("variables.php"); ?>
<title>Validando en <? echo $Site?></title>
<LINK rel="stylesheet" href="Estilos/estilo.css">
</head>
<body>
<? include("cabecera.php"); ?>
<br>
<?
if($Nickusu == "" || $Passusu == "") {
echo 
"<p align=\"center\"><font class=\"2\">Debe rellenar los datos completamente. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                                     }

$conec = @mysql_connect("localhost""root");
mysql_select_db("Animanganime"$conec);

$existe mysql_query("SELECT * FROM Usuarios WHERE Nick='$Nickusu'"$conec);
$num_existe mysql_num_rows($existe);

if(
$num_existe==0) {
echo 
"<p align=\"center\"><font class=\"2\">El Nick $Nickusu no existe. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                   }
if(
mysql_result($existe0"Password")!=$Passusu) {
echo 
"<p align=\"center\"><font class=\"2\">La contraseña es incorrecta. Pulse el botón para volver atrás y rellene el formulario correctamente.</font><br><br>";
echo 
"<input type=\"button\" value=\"Volver\" onClick=\"history.go(-1)\"></p>";
exit;
                                                   }
setcookie("Usuario"$_POST['$Nickusu'], time()+3600);
header ("Location: uficha.php");
mysql_close($conec);
?>
</body>
</html>
No entiendo por qué no me redirecciona una vez colgada si está puesta la página de uficha.php y por supuesto están cambiados los datos de la BD, ya que mi servidor me proporciona otro usuario y otro nombre para la base de datos.

Saludos!!
  #11 (permalink)  
Antiguo 19/07/2004, 09:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Parece que no entendistes la filosofía que intenté expresar en mi respuesta anterior ..

En tu script PHP de proceso (el que valida a tu usuario) NOOOO debe existir nada de salida "HTML" al cliente (navegador) (por lo menos en ese proceso, no quiere decir que en un mismo script PHP no pueda hacer vários proceso: validar y mostrar errores . .pero en procesos: "peticiones" separadas ..) .. no es lo "correcto" ..

para eso, te hacía mención a las variables de control como ese tal "código" .. para que redirecciones a donde quieras mostrar esos mensajes de error/exit con el "código" que sea .. ya sea que tu contraseña no es vália .. o que el usuario no existe o que todo fué bien o cualquier otra condición.

header ("Location: formulario.php?codigo=error");

Cuando se usa "header()" NOOOO puede existir nada de HTML por encima de este (en su ejecución). QUita todo ese HTML/estilos y demás que tienes ahí y create si quieres una página aparte para mostrar los mensajes de error (ya te comenté como podrías hacerlo en la misma que el formulario . así evitas una página más por el médio).

Un saludo,
  #12 (permalink)  
Antiguo 19/07/2004, 10:47
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Falta menos

Ya he hecho la validación, me pomprueba los datos y controla todos los erroes.

El fallo viene cuando utilizao el código ese que pusiste:

Código PHP:
<? 
if (!isset($_COOKIE['Usuario'])){ 
header ("Location: uvalidar.php"); 
exit; 

?>
Siempre me devuelve a la página del login, he de decirte que ese código de validación lo guardé en una página y es lo primero que llamo en la de el perfil.

A qué puede deberse??

Saludos!!
  #13 (permalink)  
Antiguo 19/07/2004, 14:17
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Entonces ..

se supone que este código se ejecuta:

setcookie("Usuario", $_POST['$Nickusu'], time()+3600);
header ("Location: uficha.php");

Es decir .. se crea tu cookie (faltaría comprobarlo) y redirecciona hacia "uficha.php" si la validación es correcta.

Por cierto: sobre el $ en $Nickuso si accedes a las variables externas por el array superglobal $_POST:

setcookie("Usuario", $_POST['Nickusu'], time()+3600);

Otros detalles:
1) Usas un navegador que acepte cookies?
2) que versión de PHP usas: debes usar PHP 4.1.0 o superior para poder usar los arrays superglobales $_POST, $_SESSION .. $_COOKIE ...

Un saludo,
  #14 (permalink)  
Antiguo 19/07/2004, 15:12
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
Okis

Uso Apache 4.3.7 e Internet Explorer 6 con las cookies habilitadas, quizá sea ese detalle del dolar.

He de probar, pero me redirecciona perfectamente hasta que utilizo la página de validación que te comenté. Lo lógico es pensar que no está creando la cookie , ahora, no entiendo pq.

Saludos!!
  #15 (permalink)  
Antiguo 19/07/2004, 16:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Usa error_reporting (E_ALL); al principio de tu script .. a ver si sale algún error que no ves (por configuración de PHP con bajo nivel de "mostrar" errores).

Un saludo,
  #16 (permalink)  
Antiguo 19/07/2004, 20:03
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
El dólar

Efectivamente, era el símbolo dólar de la variable al crear la cookie, una vez quitada funciona y accede al perfil.

Ahora sólo me queda ver pq al poner la validación el formulario no me comprueba si hay cookie y me da directamente al pefil sin tener que poner nombre de usuario y contraseña nuevamente.

Saludos!!
  #17 (permalink)  
Antiguo 24/07/2004, 12:48
Avatar de Animanganime  
Fecha de Ingreso: noviembre-2003
Ubicación: Tenerife
Mensajes: 90
Antigüedad: 20 años, 5 meses
Puntos: 0
No sigue

Holas!!

COntinúo con este post interminable, quiero que una vez validado el usuario si pincha en "TU Cuenta" que en principio es la página de Login, me redireccione automáticamente al perfil del usuario verificando previamente la existencia de la cookie.

En la página con el código:

Código PHP:
<? 
if (!isset($_COOKIE['Usuario'])) { 
header ("Location: uvalidar.php"); 
exit; 
                                 }
?>
He probado a introducir de todo para que si existe la cookie me vaya directamente a la página de perfil, pero no se que añadirle para que funcione.

Dejo el código como lo tenía en principio y me gustaría saber que añadirle para que haga lo que me interesa.

Saludos!!
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 09:27.