Foros del Web » Programando para Internet » PHP »

Usuarios que refrescan webs (consultas repetidas)

Estas en el tema de Usuarios que refrescan webs (consultas repetidas) en el foro de PHP en Foros del Web. Hola a todos. Voy al grano. Suponemos que un usuario ha escrito todos sus datos personales y hace clic en "Crear usuario". Se cargará una ...
  #1 (permalink)  
Antiguo 14/03/2007, 07:38
Avatar de Pip
Pip
 
Fecha de Ingreso: noviembre-2003
Ubicación: Málaga
Mensajes: 280
Antigüedad: 20 años, 5 meses
Puntos: 0
Usuarios que refrescan webs (consultas repetidas)

Hola a todos.

Voy al grano. Suponemos que un usuario ha escrito todos sus datos personales y hace clic en "Crear usuario". Se cargará una web que en la que nosotros hemos hecho que se ejecute un "INSERT INTO usuarios ($cod, $user, $pass)", registrando a ese usuario en la base de datos.

Mi duda es cómo evitar que un usuario ejecute la consulta varias veces si pulsa F5 para refrescar la página. Los métodos que se me ocurren son los más básicos, una web intermedia, un botón que se desactiva (aunque no sé si esto funciona, porque al refrescarse la web, se enviarían los mismos datos),...

Espero que me digáis cual es el método que usáis vosotros y si hay alguno que el usuario no pueda saltarse.
__________________
por Pip
  #2 (permalink)  
Antiguo 14/03/2007, 08:04
Avatar de seik!  
Fecha de Ingreso: mayo-2006
Mensajes: 492
Antigüedad: 17 años, 10 meses
Puntos: 6
Re: Usuarios que refrescan webs (consultas repetidas)

la soluciones es que cuando crees el usuraio,bien lo direccionas a otra pagina y listo... tambien puedes generar el usuario en otra pagina asincronica enviando tus datos pero que esta no sea visible para el usuario (esto lo logras con ajax)

creo que tu tema pasa por la arquitectura de tu sistema... fijate como kieres que sucedan las cosas... y luego solo programa para que esto sea asi...

son soluciones rapidas... pero seguramente existen mejores ;)

Saludos
__________________
sEIK! -Chile-
Analista Programador.
  #3 (permalink)  
Antiguo 14/03/2007, 08:13
Avatar de seik!  
Fecha de Ingreso: mayo-2006
Mensajes: 492
Antigüedad: 17 años, 10 meses
Puntos: 6
Re: Usuarios que refrescan webs (consultas repetidas)

mira aqui tengo un codigo un poko antiguo pero funcional...

mediante una funcion en javascript mando a llamar esta pagina enviandole unos valores por el metogo GET el cual guardo en una variable y la ocupo para cargar un query en sql para borrar un archivo de base datos, luego que esto sucede aparece un codigo html, en este codigo html ejecuto un javascript al cargar la pagina con la funcion onload ademas de enviar un mensaje alert informando que a sucedido el hecho deceado...

vez esto provoca que el usuario al presionar aceptar se genera todo esto y luego la pagina se cierra... evitando al interaccion con el usuario normal...
espero sirva de orientacion.. sino, podemos intentar algo mas ;)
Código PHP:
<?php
    $cod_respa
=$_GET["codigo"];
    if (isset(
$cod_respa))
        {  
        
// *****ELIMINAMOS LA MINUTA*****
        
$strsql "DELETE FROM soporte.sop_respaldos WHERE cod_respa=".$cod_respa."";
        
$cn conectar_mysql();
        
mysql_query($strsql$cn);
?>

<html>
<head>
<link href="../config.inc.css" rel="stylesheet" type="text/css">
<title>Eliminar Respaldo</title>
<script languaje="javascript">
    alert("Registro Eliminado con Éxito!");
    top.opener.document.location = top.opener.document.location;
</script>
<html>
<head>
<title>Eliminando Respaldo</title>
</head>
<body onload='javascript:window.close();'>
</body>
</html>

<?php }?>
__________________
sEIK! -Chile-
Analista Programador.
  #4 (permalink)  
Antiguo 14/03/2007, 10:00
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 4 meses
Puntos: 17
Re: Usuarios que refrescan webs (consultas repetidas)

Bueno antes que nada, como son registros de usuarios, me imagino que el campo nombre debe ser unique, para que no existan usuarios repetidos, con esto, ya al el usuario si da reload, no ingresara mas datos a esa tabla especifica.

Una buena solucion, debe estar apollada desde el lado del cliente (por JS, redirecionar), y tambien por el lado del servidor, te recomiendo tener una tabla de registros, te cuento la que tengo yo.

registros
Código:
id	|ip			|accion		|hora		|
1	|204.241.201.54	|new_user	|1142351785	|
2	|204.241.2001.54|comentario	|1142351795	|
Antes te ejecutar cualquier consulta de insercion (nuevo usuario, comentarios, voto, etc ...) compruebo que el usuario (la IP) no tenga registros anteriores, pero con condiciones, es decir, si el usuario va a insertar un comentario, comprueba que la misma IP no tenga registros (accion = comentario) con una hora mayor a (time()-180 es decir, hace 3 minutos), entonces de esta manera controlo, que una IP solo pueda insertar 1 comentario cada 3 minutos, para el control de usuarios, puedo dejar que una IP pueda registrar un usuario distintio cada 1 hora, etc ...


Entonces si lo acompaña bien,tanto al lado del cliente y lado del servidor, puedes tener aplicaciones mas seguras en este aspecto

Saludos

Última edición por DeeR; 14/03/2007 a las 10:02 Razón: xD
  #5 (permalink)  
Antiguo 14/03/2007, 11:21
 
Fecha de Ingreso: enero-2004
Ubicación: Medellin
Mensajes: 178
Antigüedad: 20 años, 3 meses
Puntos: 8
Re: Usuarios que refrescan webs (consultas repetidas)

yo lo haria de la siguiente manera.

antes de hacer el insert into, verifico que el usuario no exista. por ejemplo ya sea consultar x el user.

si no existe procedo a guardar en otro caso muestro un mensaje de que el usuario ya esta registrado.
  #6 (permalink)  
Antiguo 14/03/2007, 11:42
Avatar de xempro  
Fecha de Ingreso: marzo-2007
Ubicación: Chile
Mensajes: 222
Antigüedad: 17 años, 1 mes
Puntos: 6
Re: Usuarios que refrescan webs (consultas repetidas)

Cuando termines de hacer el INSERT debes redireccionar a otra página, a continuación te indico una de muchas formas de hacerlo:

Código PHP:
<?
   $goTo 
"insertOK.php";
   if (isset(
$_SERVER['QUERY_STRING'])) {
      
$goTo .= (strpos($goTo'?')) ? "&" "?";
      
$goTo .= $_SERVER['QUERY_STRING'];
   }
   
header("Location: ".$goTo);
?>
  #7 (permalink)  
Antiguo 14/03/2007, 11:49
Avatar de rcoromin  
Fecha de Ingreso: marzo-2007
Mensajes: 16
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Usuarios que refrescan webs (consultas repetidas)

claro me mejor antes de hacer un insert en este caso seria hacer un select si hay registos, no inserto, si no hay inserto
entodo caso si pones en la BDD un campo como CLAVA PRIMARIA aunque le des a actualizar no se podra por ser clave las claves no se puede repetir con solo esto te ahorras el echo de que se inserte denuevo.
Puedes tambien usar una bariable de estado que cuando proceda a insertar cambie de estado y al principio pregunta por esta variable que si lleva un determindado estado inserte si no no haga nada o envie un mensaje y donde le envies los datos enviales la variable .ok espero que te ayude.
  #8 (permalink)  
Antiguo 14/03/2007, 16:25
Avatar de Pip
Pip
 
Fecha de Ingreso: noviembre-2003
Ubicación: Málaga
Mensajes: 280
Antigüedad: 20 años, 5 meses
Puntos: 0
Re: Usuarios que refrescan webs (consultas repetidas)

Uff, dejé el post, me fui a clase a la facultad y cuando he vuelto tengo esta sorpresa agradable, me alegra ver que es un tema que genera interés.

Antes de nada decir que cuando se habla de insertar, no penséis sólo en usuarios o en tuplas que no pueden insertarse varias veces, ya que si no, no podemos abordar todo el problema.

Quisiera hacer un resumen de todos los métodos que habéis dicho, algunos de ellos los conocía (aunque como llevo sin programar en php casi tres años, lo tenía un poco olvidado) y otros me resultan nuevos y originales, por tanto:

Diferentes Métodos
  • Redireccionar al usuario a otra página: parece lo más simple y tiene la desventaja de que el usuario siempre tiene ocasión de refrescar antes de que se le redireccione. Tampoco es la más elegante. Y en este apartado hay dos variantes.
    • Redirección normal. Con una función en Javacript que cargue otra página al cabo de 'x' segundos.
    • Redirección a través de headers. Este método parece mejor que el anterior, entre otras razones, porque no usa Javascript (que siempre puede desactivarlo el usuario). Es el que probablemente acabe usando.
  • Abriendo ventana: ejecutamos la consulta y la cerramos. Parece práctico pero me queda la duda de si el usuario, desactivando Javascript, también podría refrescar a su antojo y, sobre todo, si podría suceder que la ventana se cerrara sin tener la certeza de que la consulta ha sido ejecutada. Aunque esto es una duda mía, no digo que sea así.
  • Usando tabla de registros: la idea ya la ha explicado muy bien DeeR. Esta es una de esas ideas que no conocía, es original y, bien planteada, puede ser muy práctica.
  • Ajax: esta es el método que más "envidia" me da porque parece muy novedoso y no sé nada del tema. Es más, si seik! no me lo hubiera dicho, no sabría que existe. Lamentablemente el proyecto que estoy haciendo me urge terminarlo, si no, estudiaría este apartado. Tampoco sé del todo bien cómo funciona internamente, he leido que son zonas concretas de una misma página que se refrescan de manera independiente e inaccesible para el usuario, como hace la gmail (es decir, es perfecto).
  • Combinando botón con web de procedencia: esto es algo que he estado pensando pero que aún tengo que probar. Se trataría de comprobar si el botón del formulario de la web que nos ha llevado hasta la que ejecuta la consulta ha sido pulsado y si la dirección de la cual venimos es la que nosotros deseemos. Para saber de qué web se ha llegado a la actual:
    Código PHP:
    $_SERVER["HTTP_REFERER"

Espero que si alguien tiene alguna idea diferente se sume al resto para aportar su grano de arena. Ante todo, muchas gracias a todos los que habléis posteado.
__________________
por Pip

Última edición por Pip; 15/03/2007 a las 06:14 Razón: La variable $_SERVER["HTTP_REFERER"] estaba mal puesta
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 05:47.