Permitir sólo una vez el envío de un formulario

Hola!

En mi sistema de comentarios, un tío que se cree hacker (Y remarco el "se cree" porque lo único que hace es darle muchas veces seguidas al botón de Enviar comentario y lo que hace es que se envían muchos comentarios duplicados)

Lo solucioné, pero sólo unos días, porque lo hice con javascript:
<button type="button" onclick="this.disabled=true; document.frm.submit()">Enviar comentario</button>

El problema es que lo que hace es Inspeccionar elemento con Google Chrome, borra el onclick="this.disabled...." y hace lo que hacía al principio

Sólo queda una solución, validar el formulario en PHP

Cómo hago (EN PHP) para que sólo se pueda enviar un comentario por vez? O hacer que tenga que esperar 1 minuto para poner otro comentario?
podrias hacerlo con sessiones o con cookies.
con cookies: http://www.cctw.aportaciones.net/con_cookies.php
<?php
/*////////////////////////////////////////////
// Codigos Y Funciones Utilies En PHP       //
// Sitio Web: http://www.serverdns.us       //
// Soporte Tecnico: [correo eliminado]    //
////////////////////////////////////////////*/

$web="miweb";
$vida=300;
$llego=time();
$caduca=time()+ $vida;
if(!isset($_COOKIE[$web])){
setcookie($web,$llego,$caduca);
echo "Gracias por Visitarme";
}else{
echo "Gracias por Visitarme Otra Vez";
}

?>

en el if encierras tu formulario.

Con Sesiones: http://www.cctw.aportaciones.net/con_sessiones.php

<?php
/*////////////////////////////////////////////
// Codigos Y Funciones Utilies En PHP       //
// Sitio Web: http://www.serverdns.us       //
// Soporte Tecnico: [correo eliminado]    //
////////////////////////////////////////////*/

$sesion="formulario";
$mostraren="600";
$ahora=@date("Y-n-j H:i:s");
@session_name("$sesion");
@session_start();
$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego']));
$esperar=$mostraren-$duracion;
if(!isset($_SESSION['llego'])){
@session_name("$sesion");
@session_start();
$_SESSION['llego']=$ahora;


echo "Hola Hace mas de 600 segundos que no actualizabas tu pagina";


}else{
if($duracion >= $mostraren){
@session_destroy();
@header("Location: ocultar.php");
}else{

echo "No Puedes Usar El Formulario, Espera $esperar segundos";

}
}
?>

al igual el formulario lo encierras en el if

para probarlos solo visita las paginas, espera 10 segundos y actualizalas, en el de sessiones esta un poco mas completo pues llevas un conteo del tiempo.
Gracias server!

He intentado con el de sesiones para tener que esperar 30 segundos entre cada comentario, pero al comentar no guarda el comentario, dejo el código...

<?

// Declaramos que la hora de envío de comentario se ponga en la hora de España
date_default_timezone_set('Europe/Madrid');

// Declaramos las variables para guardar la fecha y hora de envío del comentario
$fecha=date("Y/n/d");
$hora=date("H:i:s");
    $id = strip_tags($_POST[id]);
    $id = htmlentities($id);
    $nick = strip_tags($_POST[nick]);
    $email = strip_tags($_POST[email]);
    $comentario = strip_tags($_POST[comentario]);

    // Hacemos la validación de los campos aquí, para que si entran en este archivo no manden un comentario en blanco
    if (empty($id) || empty($nick) || empty($email) || empty($comentario)) { 
        // Si el usuario no pasó la validación del formulario salta el siguiente echo
        echo "¡Tienes que completar todos los campos para poder dejar tu comentario!"; 
    }
    else {
$sesion="formulario"; 
$mostraren="30"; 
$ahora=@date("Y-n-j H:i:s"); 
@session_name("$sesion"); 
@session_start(); 
$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego'])); 
$esperar=$mostraren-$duracion; 
if(!isset($_SESSION['llego'])){ 
@session_name("$sesion"); 
@session_start(); 
$_SESSION['llego']=$ahora;

}else{ 
if($duracion >= $mostraren){ 
@session_destroy(); 

echo "Tienes que esperar 30 segundos para dejar otro comentario. Inténtalo en <i>$duracion</i> segundos";

}else{ 

// Conectamos a la base de datos 
        $connect = mysql_connect("[COLOR="red"]servidor[/COLOR]", "[COLOR="red"]basededatos[/COLOR]", "[COLOR="red"]password[/COLOR]");
        // Seleccionamos la base de datos
        mysql_select_db("a6136284_minics",$connect);
        // Ingresamos el comentario en la tabla
        $result = mysql_query ("INSERT INTO `[COLOR="red"]basededatos[/COLOR]`.`comentarios`(`id`, `nick`, `email`, `comentario`, `fecha`, `hora`) VALUES ('$id', '$nick', '$email', '$comentario', '$fecha', '$hora')");       
if($result) {    // Si se ejecuta la consulta devuelve true
            // Volvemos a la novedad en la que estábamos
header ("location:novedad.php?id=$id#comments");

} 
}
}
}
?>
es porque lo has puesto al contrario, la sentencia es en el if y el mensaje de error en el else.
Gracias de nuevo por la respuesta, pero sigue sin irme...

<?

// Declaramos que la hora de envío de comentario se ponga en la hora de España
date_default_timezone_set('Europe/Madrid');

// Declaramos las variables para guardar la fecha y hora de envío del comentario
$fecha=date("Y/n/d");
$hora=date("H:i:s");
    $id = strip_tags($_POST[id]);
    $id = htmlentities($id);
    $nick = strip_tags($_POST[nick]);
    $email = strip_tags($_POST[email]);
    $comentario = strip_tags($_POST[comentario]);

    // Hacemos la validación de los campos aquí, para que si entran en este archivo no manden un comentario en blanco
    if (empty($id) || empty($nick) || empty($email) || empty($comentario)) { 
        // Si el usuario no pasó la validación del formulario salta el siguiente echo
        echo "¡Tienes que completar todos los campos para poder dejar tu comentario!"; 
    }
    else {
$sesion="formulario"; 
$mostraren="30"; 
$ahora=@date("Y-n-j H:i:s"); 
@session_name("$sesion"); 
@session_start(); 
$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego'])); 
$esperar=$mostraren-$duracion; 
if(!isset($_SESSION['llego'])){ 
@session_name("$sesion"); 
@session_start(); 
$_SESSION['llego']=$ahora;

}else{ 
if($duracion >= $mostraren){ 
@session_destroy();

// Conectamos a la base de datos 
        $connect = mysql_connect("servidor", "basededatos", "password");
        // Seleccionamos la base de datos
        mysql_select_db("basededatos",$connect);
        // Ingresamos el comentario en la tabla
        $result = mysql_query ("INSERT INTO `basededatos`.`comentarios`(`id`, `nick`, `email`, `comentario`, `fecha`, `hora`) VALUES ('$id', '$nick', '$email', '$comentario', '$fecha', '$hora')");       
if($result) {    // Si se ejecuta la consulta devuelve true
            // Volvemos a la novedad en la que estábamos
header ("location:novedad.php?id=$id#comments");

} 

}else{ 

echo "Tienes que esperar 30 segundos para dejar otro comentario. Inténtalo en <i>$duracion</i> segundos";

}
}
}
?>
Retiro lo dicho, sí funcionaba pero debía borrar caché para que se guardaran los cambios

Gracias por la ayuda!
Ya me estaba dejando yo los sesos rebanando el codigo pasito por pasito (creo haber visto un error, pero no recuerdo donde haha)
Supongo que lo de COLOR=RED no lo tendras puesto, pero yo no veo ningun fallo en el codigo, otra cosa es que alguna cosa no funcione bien o no entre donde crees que lo hace.
@victor5atodogas: Sí, lo del no me acordaba que lo puse en
 en vez de en [CODE] el código jejeje

Me he encontrado con un problema con este código, la primera vez que envias el formulario, no te da ningún error, pero no guarda el comentario. Le doy a atrás, vuelvo a enviarlo, y me pone que espere los 30 segundos. Los espero, lo intento enviar de nuevo y sí lo envía.

Pero la primera vez no, "poh qué?"
CREO que el fallo esta aqui:

$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego']));

si no me equivoco, esto: ($_SESSION['llego'])


lo declaras despues, lo que hace que hasta que no lo "envies" y vuelvas siempre sera X-0 = X, por lo tanto, nunca entra en el if hasta la 2º vez. Revisa eso como te digo que es donde creo que esta el fallo.
Cambiando el $_SESSION['llego']=$ahora; más arriba que $duracion, al comentar me pone el error de que tengo que esperar los 30 segundos... pero los segundos no bajan (se quedan siempre en 30) y no se puede comentar
El problema es que en un principio este codigo fue creado para proteger un fornulario de mostrarse o no, y tu lo estas utilizando en el codigo que inserta los comentarios, para que funcione correctamente tienes que iniciar la session en el formulario para que comience el conteo del tiempo:

$sesion="formulario"; 
@session_name("$sesion");
@session_start();
if(!isset($_SESSION['llego'])) $_SESSION['llego']=@date("Y-n-j H:i:s");

este codigo debes ponerlo al principio de tu formulario para comenzar el conteo.
Joder, pues es cierto y logico, sino abres la sesion al principio, siempre lo hace al final y x eso siempre te muestra 30, k cosas mas tonta de verdad!jejeje
Gracias por la ayuda, al final he decidido dejarlo como está, con el "error" ese, explicando qué hacer para dejar el comentario (Darle a un enlace para ir a atrás que puse y darle a enviar de nuevo, etc..) así también evito 1 comentario de spam, que siempre son molestos :-D
Pues si que soluciona el problema, pero al dejarlo asi como dices, quizas sea un poco molesto para algunas personas, creo que te vendria mejor en lugar de regresar un formulario con los datos que envio en el primero y con un bonton de enviar, algo asi como confirmas que deceas enviar el comentario y aceptas nuestras terminos de uso, porque eso de enviar y regresar a la larga sera moslesto para mas de uno.
Buenas tardes con todos quiero modificar este codigo para usarla en una aplicacion qe tengo qe hacer para facebook.

Mi consulta es , yo cambie el codigo para ajustarlo a mis necesidades pero no se si estara bien como lo eh cambiado, codigo no domino mucho pero trato de hacerlo funcionar de alguna manera je, bueno les paso el codigo modificado

<?

// Declaramos que la hora de envío de comentario se ponga en la hora de España
date_default_timezone_set('Europe/Madrid');

// Declaramos las variables para guardar la fecha y hora de envío del comentario
$fecha=date("Y/n/d");
$hora=date("H:i:s");
    $id = strip_tags($_POST[id]);
    $id = htmlentities($id);
    $nick = strip_tags($_POST[nick]);
    $email = strip_tags($_POST[email]);
    $comentario = strip_tags($_POST[comentario]);

    
$sesion="formulario"; 
$mostraren="98"; 
$ahora=@date("Y-n-j H:i:s"); 
@session_name("$sesion"); 
@session_start(); 
$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego'])); 
$esperar=$mostraren-$duracion; 
if(!isset($_SESSION['llego'])){ 
@session_name("$sesion"); 
@session_start(); 
$_SESSION['llego']=$ahora;



echo "<center><img src='http://www.salypimienta.pe/prueba2/text-enviado.jpg'/></center>"; 

}else{ 
if($duracion >= $mostraren){ 
@session_destroy();

$nombre = $_POST['nombre'];
$correo = $_POST['correo'];
$billa = $_POST['billa'];


$header = 'From: [correo eliminado]' . $mail . " \r\n";
$header .= "X-Mailer: PHP/" . phpversion() . " \r\n";
$header .= "Mime-Version: 1.0 \r\n";
$header .= "Content-Type: text/plain";

$mensaje = "Mensaje enviado por " . $nombre . " \r\n";
$mensaje .= "Su e-mail es: " . $correo . " \r\n";
$mensaje .= "Su respuesta es: " . " \r\n";
$mensaje .= "-" . $billa . " \r\n";


$mensaje .= "Enviado el " . date('d/m/Y', time());

$para = '[correo eliminado]';

$asunto = 'Billabong Girls Sum`12';

mail($para, $asunto, utf8_decode($mensaje), $header);

@header ("location:http://www.salypimienta.pe/prueba2/ruba2.php");



}else{ 

echo "<center><img src='http://www.salypimienta.pe/prueba2/text-intento.jpg'/></center>";


}
}
?>

a ver si lo puede chekearlo alguien lo revisa y me indican los errores o si esta todo bien. ultimamente me dicen qe los mensajes llegan solo unos cuantos y despues ya no llegan. osea lo qe necesito es qe cuando alguien entre en el formulario ingrese sus datos y mande su respuesta y despues quiera volver a mandar nuevamente ya no premita mandar, yasea qe el formulario no se mande o qe ya no salga la pagina del formulario, no se si me dejo entender. qedo en espera de respuestas gracias.


saludos y gracias a todos los qe puedan ayudarme con esto.

PD: si necesitan qe les envie los archivos me dicen un correo a donde mandar ok.
Buenas tardes con todos quiero modificar este codigo para usarla en una aplicacion qe tengo qe hacer para facebook.

Mi consulta es , yo cambie el codigo para ajustarlo a mis necesidades pero no se si estara bien como lo eh cambiado, codigo no domino mucho pero trato de hacerlo funcionar de alguna manera je, bueno les paso el codigo modificado

<?

// Declaramos que la hora de envío de comentario se ponga en la hora de España
date_default_timezone_set('Europe/Madrid');

// Declaramos las variables para guardar la fecha y hora de envío del comentario
$fecha=date("Y/n/d");
$hora=date("H:i:s");
    $id = strip_tags($_POST[id]);
    $id = htmlentities($id);
    $nick = strip_tags($_POST[nick]);
    $email = strip_tags($_POST[email]);
    $comentario = strip_tags($_POST[comentario]);

    
$sesion="formulario"; 
$mostraren="98"; 
$ahora=@date("Y-n-j H:i:s"); 
@session_name("$sesion"); 
@session_start(); 
$duracion = (@strtotime($ahora)-@strtotime($_SESSION['llego'])); 
$esperar=$mostraren-$duracion; 
if(!isset($_SESSION['llego'])){ 
@session_name("$sesion"); 
@session_start(); 
$_SESSION['llego']=$ahora;



echo "<center><img src='http://www.salypimienta.pe/prueba2/text-enviado.jpg'/></center>"; 

}else{ 
if($duracion >= $mostraren){ 
@session_destroy();

$nombre = $_POST['nombre'];
$correo = $_POST['correo'];
$billa = $_POST['billa'];


$header = 'From: [correo eliminado]' . $mail . " \r\n";
$header .= "X-Mailer: PHP/" . phpversion() . " \r\n";
$header .= "Mime-Version: 1.0 \r\n";
$header .= "Content-Type: text/plain";

$mensaje = "Mensaje enviado por " . $nombre . " \r\n";
$mensaje .= "Su e-mail es: " . $correo . " \r\n";
$mensaje .= "Su respuesta es: " . " \r\n";
$mensaje .= "-" . $billa . " \r\n";


$mensaje .= "Enviado el " . date('d/m/Y', time());

$para = '[correo eliminado]';

$asunto = 'Billabong Girls Sum`12';

mail($para, $asunto, utf8_decode($mensaje), $header);

@header ("location:http://www.salypimienta.pe/prueba2/ruba2.php");



}else{ 

echo "<center><img src='http://www.salypimienta.pe/prueba2/text-intento.jpg'/></center>";


}
}
?>

a ver si lo puede chekearlo alguien lo revisa y me indican los errores o si esta todo bien. ultimamente me dicen qe los mensajes llegan solo unos cuantos y despues ya no llegan. osea lo qe necesito es qe cuando alguien entre en el formulario ingrese sus datos y mande su respuesta y despues quiera volver a mandar nuevamente ya no premita mandar, yasea qe el formulario no se mande o qe ya no salga la pagina del formulario, no se si me dejo entender. qedo en espera de respuestas gracias. Por cierto los mensajes si estan llegando pero solo las primerasveces qe envian y despues ya no llega nada al correo de destino.


saludos y gracias a todos los qe puedan ayudarme con esto.

PD: si necesitan qe les envie los archivos me dicen un correo a donde mandar ok.