Guten Tag allesammt, ich sitze jetzt schon seit längerem an einem Problem fest und habe mich nun dazu entschlossen euch um Hilfe zu fragen. Ich programmiere an einer Multiaccount Klasse für mein Browsergame, die anhand einer log Tabelle Spieler mit der selben IP in eine Tabelle (multiaccount) einträgt. Sollten binnend 30 Tagen zu viele Einträge des Users in der Tabelle sein (Besser gesagt, zu viele Tage mit geteilter IP zwischen mehreren Spielern) wird der Administrator benachrichtigt.
Hier erstmal meine Tabellen:
Code:
--
-- Tabelle: log
--
CREATE TABLE IF NOT EXISTS `log` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` varchar(75) NOT NULL DEFAULT '',
`action` varchar(100) NOT NULL DEFAULT '',
`detail` text,
`time` bigint,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;
--
-- Tabelle: Multiaccount
--
CREATE TABLE IF NOT EXISTS `multiaccount` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` varchar(75) NOT NULL DEFAULT '',
`log_ids` text,
`reason` text,
`time` bigint,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;
An sich sucht die Klasse alle Einträge raus, die die gleiche IP besitzen wie der User (User A), dann werden die betroffenen log_ids in der Tabelle multiaccount eingetragen (um mehrfache Einträge zu verhindern), des Weiteren kann so ein 3 Spieler (User C) mit der gleichen IP erfasst werden, ohne dass die anderen 2 Spieler (User A & B) (die bereits einen Eintrag besitzen) einen Eintrag bekommen.
Das Problem liegt dabei, dass wenn der User A sich ein zweites mal einloggt, ein neuer Eintrag in der log Tabelle hinzugefügt wird und so ein neuer Eintrag in der "multiaccount" Tabelle getätigt wird, obwohl besagter User A bereits mit User B einen Eintrag in der multiaccount Tabelle besitzen. Da dies relativ schwierig zu erklären ist, hier einfach ein gekürzter/vereinfachter Ausschnitt meiner Klasse:
PHP Code:
<?php
$this->user_ids[] = $user_id;//Eigene user id
$time_older = $time-2592000;
$qry_log = mysql_query("SELECT * FROM log WHERE action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id != '".$user_id."'");
if(mysql_num_rows($qry_log) != 0){
while($row_log = mysql_fetch_assoc($qry_log)){
$time_login = $row_log["time"];
$this->user_ids[] = $row_log["user_id"];//Die user_id des Anderen
$this->id_log_array[] = $row_log["id"];
}
//Eigene logs
$qry_log_own = mysql_query("SELECT id FROM log WHERE action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id = '".$user_id."'");
while($row_own_log = mysql_fetch_assoc($qry_log_own)){
$this->id_log_array[] = $row_own_log["id"];
}
$this->id_log_array = array_unique($this->id_log_array);
$this->user_ids = array_unique($this->user_ids);
for($i=0; $i < count($this->user_ids); $i++){
$array_log_ids_usr = array();//Leeren array für jeden user
$array_multi_usr = array();
$list_log_ids_multi = "";
$user_id_multi = $this->user_ids[$i];
$ids_for_qry = join(',',$this->id_log_array); //Alle auffälligen log ids
$qry_usr_multi_log = mysql_query("SELECT id FROM log WHERE id IN ($ids_for_qry) AND action = 'IP'
AND detail = '".$_SERVER['REMOTE_ADDR']."' AND time >= '".$time_older."'
AND user_id = '".$user_id_multi."'");
while($row_log_multi = mysql_fetch_assoc($qry_usr_multi_log)){
//Alle log Ids des spezifischen Benutzers:
$array_log_ids_usr[] = $row_log_multi["id"];
}
//Bereits benutzte ids:
$check_if_multi = mysql_query("SELECT log_ids FROM multiaccount WHERE user_id = '".$user_id_multi."'
AND time >= '".$time_older."'");
while($row = mysql_fetch_assoc($check_if_multi)){
$list_log_ids_multi = $row["log_ids"].",".$list_log_ids_multi;
}
$array_multi_usr = explode(",",$list_log_ids_multi);
$array_multi_usr = array_unique($array_multi_usr);
if(count(array_intersect($array_multi_usr, $array_log_ids_usr)) != count($array_log_ids_usr)){
//Wenn es noch nicht benutzte ids gibt, dem user einen Eintrag verpassen
/*Problem: Wenn User A sich mit der IP X einloggt und der User B tut dies auch werden die beiden log ids in die multiaccount
Tabelle eingefügt. Soweit so gut, wenn sich User A jedoch nochmal einloggt, dann wird noch ein Eintrag getätigt, da es eine neue log_id des Users A gibt */
mysql_query("INSERT INTO multiaccount (user_id, log_ids, reason, time)
VALUES ('".$this->user_ids[$i]."', '".implode(',',$this->id_log_array)."', 'IP', '".$time."')");
}
}
}
?>
mfg