Ip logger/blokker met MYSQL
Hallo, Script voor het tegengaan van te veel pagina bezoek, of het te veel 'aanwezig' zijn op formulieren. Het bestaat uit een functie die je bijvoorbeeld in je config file kan zetten. De functie accepteert drie argumenten: -aantal bezoeken -de tijd (in minuten) -de id can de pagina Aan de hand van een combinatie tussen de tijd en het aantal bezoeken wordt bepaald of de gebruiker de pagina mag zien. (bv. aantal = 5 en tijd = 1, 5 bezoeken per minuut) Doormiddel van de pagina id kan de fucntie meerdere keren worden aangeroepen in je site omdat er gekeken wordt naar de combinatie van ip en pagina id. Na het verlopen van de ingestelde tijd begint het script weer opnieuw. Als er aanvullingen op zijn hoor ik het graag. Let op, de functie maak gebruik van mysqli. Script geschreven om bots, spam en vervelende bezoekers tegen te gaan. Veel succes ermee!
--------------de functie-----------------
[code]
<?php
Function limitView($views,$time,$paginaid){
$limit = (int) $views; // aantal bezoeken
$error = "<br /><br /><b><center>Sorry, u heeft deze pagina te veel bezocht de afgelopen $time minuten.</center></b>"; // error melding.
$remote_ip = $_SERVER['REMOTE_ADDR'];
$dbc = @mysqli_connect ('localhost', 'root', '', '') OR trigger_error("Databaseverbinding kon niet worden gemaakt.\n<br />MySQL - fout: " . mysqli_connect_error());
//query om te kijken of al bestaat
$q = "SELECT remote_log,id_pagina
FROM tbllog WHERE remote_log = '$remote_ip'
AND id_pagina = '$paginaid'
AND datum_log = CURDATE()";
$r = mysqli_query($dbc, $q);
if(mysqli_num_rows($r) == 0) {//geen resultaten dus aanmaken
$q = "INSERT INTO tbllog (id_pagina,remote_log,time_log,datum_log,log_aantal)
VALUES ('$paginaid', '$remote_ip', CURTIME(),CURDATE(),'1')";
$r = mysqli_query($dbc, $q);
$id = (int) mysqli_insert_id($dbc);//int van maken, niet gelukt dan nul
}else{ //als wel bestaat.
// Verwijderen als langer bestaat dan de opgegeven tijd.
$q1 = "SELECT id_log
FROM tbllog
WHERE MINUTE(TIMEDIFF(CURTIME(), time_log)) >= $time
AND remote_log = '$remote_ip'
AND id_pagina = '$paginaid'";
$r1 = mysqli_query($dbc, $q1);
if (mysqli_num_rows($r1) >= 1) {//verwijderen
while ($id_del = mysqli_fetch_array($r1)) {
$q2 = "DELETE FROM tbllog WHERE id_log = '".$id_del['id_log']."'";
$r2 = mysqli_query($dbc, $q2);
}
}else{
//currente aantal ophalen
$q3 = "SELECT id_pagina,log_aantal
FROM tbllog WHERE remote_log = '$remote_ip'
AND id_pagina = '$paginaid'
AND log_aantal <= '$limit'";
$r3 = mysqli_query($dbc, $q3);
if (mysqli_num_rows($r3) == 1) {//goed, 1 resultaat per gebruiker per pagina
list($id_pagina,$log_aantal) = mysqli_fetch_array($r3);
$log_aantal++;//1 bij optellen
//updaten
$q4 = "UPDATE tbllog
SET log_aantal = '$log_aantal'
WHERE id_pagina = '$id_pagina'
AND remote_log = '$remote_ip'";
$r4 = mysqli_query($dbc, $q4);
}else {//te veel bezoeken:
echo $error;
return TRUE;
}
}//einde else del
}//einde hoofd if/else
//oude record opschonen
$q5 = "DELETE FROM tbllog WHERE datum_log < CURDATE() - INTERVAL 1 DAY";
$r5 = mysqli_query($dbc, $q5);
}//einde functie
?>
[/code]
--------------------De tabel ----------------------
[code]
CREATE TABLE `tbllog` (
`id_log` int(11) NOT NULL auto_increment,
`id_pagina` int(11) NOT NULL,
`remote_log` varchar(15) NOT NULL,
`time_log` time NOT NULL,
`datum_log` date NOT NULL,
`log_aantal` int(11) NOT NULL,
PRIMARY KEY (`id_log`)
)
[/code]
---------gebruik op de pagina-------
[code]
<?php
//funtie aanroepen
$pag = limitView('100','360','15');//honderd views in 6 uur
if ($pag != TRUE ) {//geef maar weer
?>
DE INHOUD
<?php
}else {//page_not is true, de error verschijnt
}
?>
[/code]
Reacties
0