ragazzi sapete per caso come si chiama quando compili un form dopo un tot puoi compilarlo ancora, se no la gente ogni secondo ti contatta e ti arrivano 4235423 email, grazie per l'aiuto
ragazzi sapete per caso come si chiama quando compili un form dopo un tot puoi compilarlo ancora, se no la gente ogni secondo ti contatta e ti arrivano 4235423 email, grazie per l'aiuto
Non ho ben capito: vuoi sapere come si chiama o come fare?
in pratica quando un utente mi contatta in un form, dopo che mi ha contattato ci vuole ad esempio 30 minuti per contattarmi di nuovo, ogni volta deve aspettare 30 minuti per contattarmi, se ci fai caso ogni volta che scrivi un messaggio qui, ti dice di aspettare 30 secondi prima di rispondere
questo è il messaggio che esce
SI SONO VERIFICATI ALCUNI ERRORI DURANTE L'INVIO DI QUESTO MESSAGGIO
Questo forum richiede un'attesa di 30 secondi tra i messaggi. Riprova tra 14 secondi.
Ultima modifica di AmOrEaMiCiZa : 18-04-2014 alle ore 21.07.27
Il modo più semplice è impostare un cookie che duri 30 min, però attento che io potrei cancellarlo o non accettarlo e ti riscrivo dopo 2 secondi.
Un modo più difficile sarebbe un cookie per un controllo rapido + salvi l IP dell utente e al secondo tentativo verifichi che quell' ip non abbia scritto nell'ultima mezzora.
per il come si chiama mm è una sorta di Flooding, mailbombing, anti spam? roba del genere non so bene cosa faccia il tuo form e se quelli che ti arrivano siano messaggi di spam o semplici utenti che scrivono una lettera per messaggio.
Potresti anche utilizzare un database dove salvi IP e ora del messaggio e poi fai eventuali controlli.
in pratica la gente scrive l'email e nome utente poi possono mandarmi un messaggio e vorrei aggiungerci anche un input dove può inviarmi l'url dell'utente se per caso viola le regole del mio social network ecc...
bhè se gli utenti sono già identificati è semplice, nella tabella degli utenti metti una campo aggiuntivo in cui salvi la data e l'ora dell'ultima segnalazione, al momento dell'invio controlli che in quel campo non ci sia un ora più vecchia di 30 min. in questo modo è piuttosto sicuro che non possano bombardarti senza cookie etc
non so come si fa il punto è quello
è un form che posso modificarlo come mi pare
Seguiamo la strada del database che è la più facile.
Il database lo hai già, devi utilizzare phpmyadmin per creare una tabella che chiameremo "controllo" (chiamala come vuoi ).
La tabella deve avere almeno un campo che contiene l'ip dell'utente (puoi fare un char o un varchar ricordando per la lunghezza che un indirizzo ip è al massimo di 15 caratteri IPv4), e un campo per la data e l'ora.
Utilizzerei microtime() così è più facile conteggiare il tempo in più o in meno.
Quando un utente cerca di inviare un messaggio apri una connessione con il database cerchi se esiste una riga che contiene il suo indirizzo ip e un microtime passato da meno di mezzora, se la trovi restituisci un errore in caso contrario invii il messaggio.
Ti consiglio in fondo al tuo script di inserire una query che ricerchi ed elimini tutti i record nella tabella "Controllo" con un microtime passato da più di mezzora in questo modo eviti che si accumulino dati spazzatura.
Per il codice da scrivere ti rimanda alla documentazione ufficiale di php che è con corredata da esempi pratici non dovresi avere problemi a capirla.
Ricorda sempre di controllare i dati che ricevi dai form per evitare caratteri nocivi, questo sopratutto se decidi di archiviare dati nel database.
Questa è una soluzione ce ne sono altre migliori ma questa mi è sembrata la più facile se hai problemi con il codice postalo :D
scusa ma non ho capito molto bene lo uso da poco phpmyadmin potresti scriverlo tu qui? :( grazie mille se lo fai
Codice PHP:
<?php
require_once('commentanything/config.inc.php');
require_once('commentanything/funcs.inc.php');
//get comments from database
$comments = $db->query("SELECT * FROM em_comments WHERE object_id = ".$db->quote($object_id)." ORDER BY id")->fetchAll();
// -- form output ------------------------------------------------
$total = count($comments);
$counter = 1;
$html = '<div id="emContent">';
if($total > $CCOUNT){
$html .= '<div class="emShowAllComments" id="emShowAllComments"><a href="javascript:viewAllComments();">'.$lang['view'].' <span id="total_em_comments">'.$total.'</span> '.$lang['view2'].'</a> <noscript><em>This page needs JavaScript to display all comments</em></noscript></div>';
}
foreach($comments as $comment){
if($comment['sender_name']){
if($comment['sender_mail']){
$comment['sender_name'] = jsEncode($comment['sender_mail'], $comment['sender_name']);
}
$sender = '<span class="emSenderName">'.$comment['sender_name'].'</span>: ';
}else{
$sender = '';
}
$html .= '<div class="emComment" id="comment_'.$comment['id'].'" '.($counter < ($total - ($CCOUNT - 1))?'style="display:none"':'').'>
<div class="emCommentImage">
<img src="http://www.gravatar.com/avatar/'.gravatar($comment['sender_mail'], false).'" width="32" height="32" alt="Gravatar" />
</div>
<div class="emCommentText">
'.$sender.stripslashes($comment['comment_text']).'
</div>
<div class="emCommentInto">
'.strftime($DATEFORMAT,strtotime($comment['created'])).'
</div>
</div>';
$counter++;
}
$html .= '</div>';
$html .= '<div id="emAddComment">
<form method="post" action="commentanything/php/addComment.php" onsubmit="return false;">
<span '.($SHOWNAME?'':'').' id="emNameSpan">
<label for="addEmName">'.$lang['name'].':</label>
<input type="text" placeholder="'.$lang['enterName'].'" id="addEmName" name="sender_name" />
</span>
<span '.($SHOWMAIL?'':'').' id="emMailSpan">
<label for="addEmMail">'.$lang['mail'].':</label>
<input type="text" placeholder="'.$lang['enterMail'].'" id="addEmMail" name="sender_mail" />
</span>
<textarea placeholder="'.$lang['enterComment'].'" id="addEmComment" name="comment"></textarea>
<input type="text" name="email" value="" id="addEmPot" />
<input type="hidden" name="object_id" value="'.$object_id.'" />
<span class="emButton">
<input type="submit" class="emButton" id="emAddButton" value="'.$lang['comment'].'" onclick="addEMComment(\''.$object_id.'\')" />
</span>
</form>
</div>';
//send reply to client
echo '<div id="emComments" object="'.$object_id.'" class="ignorejsloader">'.$html.'</div>';
?>
<?php
/***
* Encode MailAddresses against Spam Bots
***/
function jsEncode($address, $text){
preg_match('!^(.*)(\?.*)$!',$address,$match);
if(!empty($match[2])) {
$smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
return;
}
$address_encode = '';
for ($x=0; $x < strlen($address); $x++) {
if(preg_match('!\w!',$address[$x])) {
$address_encode .= '%' . bin2hex($address[$x]);
} else {
$address_encode .= $address[$x];
}
}
$text_encode = '';
for ($x=0; $x < strlen($text); $x++) {
$text_encode .= '&#x' . bin2hex($text[$x]).';';
}
$mailto = "mailto:";
return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
}
/***
* Get rid of all HTML in the input
***/
function cleanInput($str){
return nl2br(htmlspecialchars(strip_tags(trim(urldecode($str)))));
}
/***
* Prepare a Gravatar String
***/
function gravatar($email, $absolute=true){
if($absolute){
$dir = str_replace('/commentanything/ajax/loadComments.php','/',$_SERVER['REQUEST_URI']);
$dir = str_replace('/commentanything/ajax/addComment.php','/',$dir);
return md5( strtolower( trim( $email ) ) ).'?s=32&d='.urlencode('http://'.$_SERVER['HTTP_HOST'].$dir.'commentanything/css/images/default.gif');
}
$dirs = explode('/',$_SERVER['REQUEST_URI']);
array_pop($dirs);
$dir = implode('/',$dirs);
return md5( strtolower( trim( $email ) ) ).'?s=32&d='.urlencode('http://'.$_SERVER['HTTP_HOST'].$dir.'/commentanything/css/images/default.gif');
}
?>
Ultima modifica di karl94 : 28-04-2014 alle ore 19.21.16 Motivo: formattazione del codice
Allora la tabella può essere qualcosa del genere
la query per il controlloCodice PHP:
CREATE TABLE 'controllo' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'ip' varchar(20) NOT NULL,
'ora' int(11) NOT NULL,
PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
$microtime sta per una funzione che restituisce solo i secondi della funzione microtime() (inutile controllare i centesimi di secondo) in particolare solo la parte evidenziata del risultato tipico di una microtime()Codice PHP:
SELECT * FROM controllo WHERE ora < '".$microtime2."'
0.21706100 1398703860
$microtime2 è $microtime +30min (in secondi)
Questa la query per aggiungere quando un utente ti invia un email
Questa la query per ripulire dai dati vecchiCodice PHP:
INSERT INTO controllo (ip, ora) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$microtime."')
Questa la puoi usare per ottenere i secondi da microtimeCodice PHP:
DELETE FROM controllo WHERE ora < '".$microtime2)."'
Spero sia corretto (sia come codice che logicamente) non ho avuto modo di testarloCodice PHP:
function microtime_s()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$sec);
}
mi da questo errore #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''controllo' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'ip' varchar(20) NOT NUL' at line 1.
tutte le query dove devo metterla di preciso, vicino dove si commenta?
Scusa non ci sono tutti gli apici nel comando SQL per creare la tabella.
Le query le metti nello script che processa l'invio dell'email, il controllo all'invio, l'aggiunta della riga dopo l'invio e l'ultima query in fondo al file.
Se prima hai scritto il codice che prende i dati dal form li elabora e ti invia l'email non avrai problemi ora a inserire tre query.
ahh okei ma tutto nello stesso script php devo inserire questi codici?
bhè si direi di si sono però stai attento che se la query che verifica se l'utente ha già scritto restituisce un ip coincidente con il suo devi escludere tutto il resto del codice e dare subito un errore.
Tra le altre cose ho visto che puoi più semplicemente modificare la query di controllo includendo direttamente nel WHERE anche il controllo dell'ip WHERE ip LIKE .. AND ..
grazie mille poi lo sistemerò piano piano. posso chiederti un'altra cosa riguardo al database?