Foros del Web » Programando para Internet » PHP »

Protección ante mensajes masivos.

Estas en el tema de Protección ante mensajes masivos. en el foro de PHP en Foros del Web. Seré breve. Cuando un usuario envía un mensaje, me gustaría que tuviera que esperar al menos 10 segundos para enviar otro, y así evitar envíos ...
  #1 (permalink)  
Antiguo 09/03/2006, 11:03
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Protección ante mensajes masivos.

Seré breve. Cuando un usuario envía un mensaje, me gustaría que tuviera que esperar al menos 10 segundos para enviar otro, y así evitar envíos masivos.

Para ello he aplicado éste código:

Código PHP:
<?                     
//Compruebo que no haya escrito un mensaje muy reciente.
include ("config/index.php");
$query "SELECT * FROM minichat where autor=$autor and fecha < (NOW()-10)";
$result =  mysql_db_query ($dbname$query$link);
    if(
mysql_num_rows($result)==1) {
echo 
"<font class='Estilo1'>No puedes enviar tantos mensajes seguidos.</font>";
}
else {
//Se envía el mensaje
?>
Me devuelve el siguiente error:
Código:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/opinions/public_html/minichat.php on line 71

¿Qué pasa? Gracias
  #2 (permalink)  
Antiguo 09/03/2006, 11:33
Avatar de causita  
Fecha de Ingreso: mayo-2002
Ubicación: Lima-Perú
Mensajes: 2.043
Antigüedad: 21 años, 11 meses
Puntos: 8
xq no usas imágenes de seguridad? esas q uno tiene q digitar y q aparecen aleatoriamente, para evitar q robots usen tu formulario. no soy experto en esto pero te brindo una solución.

salu2
__________________
|| no hay pregunta tonta....lo q hay son tontos q no preguntan || d-.-b

El Causita
  #3 (permalink)  
Antiguo 09/03/2006, 12:07
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Es un "minichat", no quiero que los usuarios deban estar escribiendo el número que aparece en la imagen por cada mensaje
  #4 (permalink)  
Antiguo 09/03/2006, 12:20
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Para poder ver el error usa mysql_error(). De todas maneras para mi es por que estas pasando NOW, que da la fecha en formato YYYY/MM/DD HH:MM:SS, y usada con un operador matemático se transforma en YYYYMMDDHHMMSS...o debería ser un string, o un int, y como no se y no decís el formato del campo fecha estimo que el probelma esta ahí. Para ser óptimo debería ser un campo tipo int de 11 almacenando un timestamp, de esta manera podrías hacer:
$query = "SELECT * FROM minichat where autor=".$autor." and fecha < ". time()-60;

Sino haz un echo de $query y correlo en Sqlyog/SqlFront/MySqlQueryBrowser arreglando ahí el problema a medida que ves el error.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 09/03/2006, 12:55
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
El campo era de tipo "time". Lo acabo de poner a INT pero... ¿me puedes decir cómo ingreso la fecha? (al hacer INSERT) Es que pruebo y pruebo y no lo consigo...

Gracias
  #6 (permalink)  
Antiguo 09/03/2006, 13:03
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
yo suelo usar time() de php (pone el tiemstamp unix). También podes hacerlo desde sql usando unix_timestamp().
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #7 (permalink)  
Antiguo 09/03/2006, 13:25
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
No me sirve time() .... me devuelve éste número al mostrarlo : 1141932305
  #8 (permalink)  
Antiguo 09/03/2006, 13:31
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Cita:
Iniciado por david_M_G
No me sirve time() .... me devuelve éste número al mostrarlo : 1141932305

Hola david_M_G!

Es que la función time te devuelve el número de segundos desde no se que fecha , hehe, creo desde 1970, porque no te sirve esa función?

Ah!, nada relacionado con el tema , pero ayer ví tu página david_M_G , en un post que pusiste ayer para dar a conocer tu mini chat, y me pareció excelente el sistema de jitomates, hahaha, muy bueno!, aparte tu página esta muy interesante, eso de poner tu artículos y que la gente opine sobre ellos me pareció genial.

Un saludo y la mejor de las suertes para tu proyecto
  #9 (permalink)  
Antiguo 09/03/2006, 13:34
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Mil gracias por ese comentario

Esto de poner un tiempo para mensajes es efectivamente para ese minichat. Aunque las fechas me están dando mucho trabajo...
  #10 (permalink)  
Antiguo 09/03/2006, 13:39
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
El número ese es correcto, y como dice jahepi es el número de segundos pasados desde el 1 de Enero 1 1970 00:00:00 GMT.
Para trabajar en tu caso es ideal, y muy rápido ya que es un int...lo mismo si quisieras sacar cuentas sobre una fecha, ya que sabiendo que 1 min necesitan de 60 segundos, una hora de 60 min, y un día de 24 horas, podrías deducir que echo date("d-m-Y h:i:s", time() - 84600 ) es igual a ayer a esta hora.
Para comparar usa el ejemplo que te di con time(), para guardarla lo mismo que te pase (también time() o unix_timespatmp() ), y si quieres verlo en pantalla deberías usar date, o gmdate si quisieras sacar una salida gmt (tiempo medio de greenwich). Ej:
Código PHP:
echo date("d-m-Y"$rs["fecha"] ); 
Espero te ayude
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #11 (permalink)  
Antiguo 09/03/2006, 13:46
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Al mostrarlo pongo eso y me devuelve exactamente: 09-03-2006

¿Pero qué hay de la hora? no me interesa poner el día.
  #12 (permalink)  
Antiguo 09/03/2006, 13:50
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Lo siento, estoy durmiendo... ya puse:

Código PHP:
<? echo date("H:i:s"$row["fecha"] ); ?>
  #13 (permalink)  
Antiguo 09/03/2006, 13:50
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Cita:
Iniciado por nicolaspar
El número ese es correcto, y como dice jahepi es el numero de segundos pasados desde el 1 de Enero 1 1970 00:00:00 GMT.
Para trabajar en tu caso es ideal, y muy rápido ya que es un int...lo mismo si quicieras sacar cuentas sobre una fecha, ya que sabiendo que 1 min necesitan de 60 segundos, una hora de 60 min, y un día de 24 horas, podrías deducir que echo date("d-m-Y h:i:s", time() - 84600 ) es igual a ayer a esta hora.
Para comparar usa el ejemplo que te di con time(), para guardarla lo mismo que te pase (tambien time() o unix_timespatmp() ), y si queres verlo en pantalla deberías usar date, o gmdate si quisieras sacar una salida gmt (tiempo medio de greenwich). Ej:
Código PHP:
echo date("d-m-Y"$rs["fecha"] ); 
Espero te ayude
Como bien dice nicolaspar, utiliza esa función para comprobar que manden mensajes cada n minutos.

En tu campo fecha mejor guarda los segundos hasta ahora, puedes utilizar una función de MySql:

Código:
INSERT INTO tuTabla (Fecha) VALUES(UNIX_TIMESTAMP());
Así guardas el tiempo en segundos en tu columna fecha.

Cuando haces la consulta para ver si ya puede mandar mensajes haces esto:

Código:
$query = "SELECT * FROM minichat where autor=$autor and fecha < (UNIX_TIMESTAMP()-600)";
Le resto 600, porque 600 segundos es el equivalente a 10 minutos.

Un saludo!
  #14 (permalink)  
Antiguo 09/03/2006, 13:53
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Volvemos al principio del tema...

Código:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/opinions/public_html/minichat.php on line 71
  #15 (permalink)  
Antiguo 09/03/2006, 14:21
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Esto esta bien:
"SELECT * FROM minichat where autor=$autor and fecha < (UNIX_TIMESTAMP()-600)";
NO suelo usar así, sino que escapo las variables, pero no hace la diferencia. Ahora, si $autor no existe te generaría una error, lo mismo si la tabla no se llama así, y el campo fecha no existe. Para saber el error hace como te dije antes (trata de leer, sino escribimos 3 veces las cosas, y termina cansando ayudar ;).:
EJEMPLO
Código PHP:
$sql "SELECT * FROM minichat where autor=$autor and fecha < (UNIX_TIMESTAMP()-600)"
$r mysql_query$sql ) or die ("Error"mysql_error()); 
Sino imprime $sql y correlo en un editor.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #16 (permalink)  
Antiguo 09/03/2006, 14:29
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Pasé por alto el detalle ya que me devuelve sólo esto:

#1064 - You have an error in your SQL syntax;


y con mysql_error me dice "Query was empty"




EDITO: La tabla se llama minichat, el autor lo procesa bien y el otro campo se llama fecha...
  #17 (permalink)  
Antiguo 09/03/2006, 14:31
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Y Query was empty no te dice nada?

Pone el código entero de lo que estes haciendo!!!
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #18 (permalink)  
Antiguo 09/03/2006, 14:37
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Siento estar dando tanto trabajo...

Aquí mi código (algo chapucero. Hay que reconocer que soy novato y está hecho totalmente por mí )

Código PHP:
<?
                    
//Comprobamos que no está baneado
                    
if (empty($row['baneomc'])) {
    
                     if (
$postmc) {
                     
                    
//Compruebo que no haya escrito un mensaje muy reciente.
                    
include ("config/index.php");
                    
mysql_select_db("$dbname",$link);
                    
$query "SELECT * FROM minichat where autor=$autor and fecha < (UNIX_TIMESTAMP()-600)"
                    
$result =  mysql_db_query ($dbname$query$link);
                    if(
mysql_num_rows($result)==1) {
                    echo 
"<font class='Estilo1'>No puedes enviar tantos mensajes seguidos.</font>";
                    }
                    else {


                    
//Quitamos los espacios del principio y del final
                    
$sinespacios trim($mensaje);
                    
//Verificamos si es mod
                    
if ($row['nivel']=='2') {
                    
$placamod_ 'mod';
                    }
                    else {
                    
$placamod_ '';
                    }
                    
//Verificamos si es vip
                    
if ($row['vipmc']=='vip') {
                    
$placavip_ 'vip';
                    }
                    else {
                    
$placavip_ '';
                    }
                    
//Verificamos que el mensaje no esté vacío
                    
if (empty($sinespacios)) { print "<font size='1' face='Verdana' color='#FF000='><b>Error: Mensaje vacío</font></b><br><br>"; }
                    
//Añadimos el mensaje
                      
else { 
                      
$mensaje_filtropalabras wordwrap($mensaje20"[salto]\n"20);
                    include_once (
"config/index.php");
   
mysql_select_db("$dbname",$link);
   
$query "INSERT into minichat (autor, mensaje, fecha, ip, placamod, placavip) values('$autor','$mensaje_filtropalabras', UNIX_TIMESTAMP(), '$ip', '$placamod_', '$placavip_')";
    if (
mysql_query ($query$link)) {
                      
//Cogemos al autor del mensaje y le sumamos 1 mensaje mas.

?>
  #19 (permalink)  
Antiguo 09/03/2006, 14:44
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Arrancamos mal :D...en tu código, donde esta el "or die" que te dice "Query was empty "...?


Ahora, te doy otra opción. Por que no guardas una cookie cuando insertas, y comprobar esta al enviar un mensaje (de la misma manera, pero sin consultar)? Que te ahorras?...mucho, calculá consultas menos entre el limite que le pongas...puede ser mucho!

Lo de ponerle una fecha puede ser para limitar el pedido de mensajes ( n últimos mayores a x tiemestamp), y el resto a un history (un simple link a un php que levante todo y de el archivo como salida).
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #20 (permalink)  
Antiguo 09/03/2006, 14:58
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 2 meses
Puntos: 20
Cita:
Arrancamos mal :D...en tu código, donde esta el "or die" que te dice "Query was empty "...?
Lo quité ya hace rato.

No entendí la solució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 19:44.