Kiedyś prowadząc grę widziałem, że było to zrobione w dość prosty sposób, niewymagający wielkiego nakładu sił, a przynoszący dobre efekty.
1) Zrób plik np
multicheck.php. W części html'owej daj forma gdzie wpisuje się
id początkowe i i
d końcowe przedziału. W php zrób zapytanie, które pokaże Ci graczy o takim samym IP z tego przedziału.
<form method="post" action="multicheck.php"> id początkowe:
<input type="text" name="id1"/>id końcowe:
<input type="text" name="id2"/><input type="submit" value="Wyszukaj" />
A w części php daj zapytanie i prześlij później wynik do html. Masz zapytanie, zmienisz tabele i kolumny i będzie si:
$result = $db -> EXECUTE("SELECT
p.ip,
p.id as pl1_id,
p.user as pl1_nick,
p.email as pl1_email,
p2.id as pl2_id,
p2.user as pl2_nick,
p2.email as pl2_email
FROM `players` p JOIN players p2 USING(ip)
WHERE p.id!=p2.id
AND ip!=''
AND p.id BETWEEN $_POST[id1] AND $_POST[id2]
ORDER BY ip, pl1_id, pl2_id");
2) Zrób w modułach plik zapisujący do bazy każdą akcję użytkownika, zapisując tam datę, id, id2(gracza, któremu coś przekazujemy etc.), ip, co zostało wpisane w okienko form/textarea, nazwę pliku.
3) Zrób przeglądarkę tych logów. W html daj forma, w którego wpisuje się daną rzecz (tę datę/ip/coś innego) i obok checkboxa, odwracającego wynik. Czyli np jeśli wpiszesz w id 50 i zaznaczysz checkboxa, to wynikiem będzie każde id poza 50. Pokażę Ci tpl'kę i php żebyś miał porównanie, przerobisz sobie:
<form method="post" action="logi.php?step=do">
<td><input type="checkbox" name="d" value="true"><input type="text" name="datestamp" size="5"></td> <td><input type="checkbox" name="f" value="true"><input type="text" name="fid" size="5"></td> <td><input type="checkbox" name="s" value="true"><input type="text" name="sid" size="5"></td> <td><input type="checkbox" name="i" value="true"><input type="text" name="ip" size="5"></td> <td><input type="checkbox" name="w" value="true"><input type="text" name="what" size="5"></td> <td><input type="checkbox" name="m" value="true"><input type="text" name="much" size="5"></td> <td><input type="submit" value="Szukaj!"></td> {if $step == 'do'}
{section=list}
<td>{$list.datestamp}
</td> {/section}
{$error}
{else}
{/if}
<?php
define('LOGGS_PER_PAGE', 300
); if (!isset($_GET['step'])) $_GET['step'] = ''; if(!isset($_SESSION['logtab'])) $_SESSION['logtab']='logging';
if ($_GET['step'] == 'do'){
if(empty($_POST['from'])) $_POST['from']=0; if(!empty($_POST['datestamp'])) $qq[] = 'datestamp '.(empty($_POST['d'])?
'' : 'not ').'like \'%'.$_POST['datestamp'].'%\''; if(!empty($_POST['fid'])) $qq[] = 'fid'.(empty($_POST['f'])?
'' : '!').'='.$_POST['fid']; if(!empty($_POST['sid'])) $qq[] = 'sid'.(empty($_POST['s'])?
'' : '!').'='.$_POST['sid']; if(!empty($_POST['ip'])) $qq[] = 'ip '.(empty($_POST['i'])?
'' : 'not ').'like \'%'.$_POST['ip'].'%\''; if(!empty($_POST['what'])) $qq[] = 'what '.(empty($_POST['w'])?
'' : 'not ').'like \'%'.$_POST['what'].'%\''; if(!empty($_POST['much'])) $qq[] = 'much '.(empty($_POST['m'])?
'' : 'not ').'like \'%'.$_POST['much'].'%\''; {
$query = $db -> Execute('SELECT * FROM '.$_SESSION['logtab'].' where '.implode(' and ', $qq).' order by datestamp ASC limit '.$_POST['from'].', '.LOGGS_PER_PAGE
); while($query && !$query -> EOF){
if($query -> fields['what'] == 'login') $query -> fields['much'] = false;
$loggs[] = $query -> fields;
$query -> MoveNext();
}
if($query)
$query->Close();
}
"list" =>$loggs,
"next" => count($loggs)==LOGGS_PER_PAGE
, ));
}
$tpl -> assign ("step", $_GET['step']);
$tpl -> parse('loggs.tpl');
?>
Później tylko w multicheck sprawdzasz podejrzane konta i sprawdzasz ich akcje w logach- czy logują się jedno po drugim, czy zawsze mają to samo ip, czy przesyłają sobie surowce, czy komunikują się przez pocztę z tymi samymi osobami, etc. Sprawdzenie, czy dwa dane konta są multikontami zajmuje około 5 minut.