Odziedziczyłem po kimś system statystyk w grze. Z zapisem danych do bazy nie mam problemów, natomiast są problemy z odczytem. Wklejam cały skrypt:
<?php
$servername = "127.0.0.1";
$username = "";
$password = "";
$dbname = "";
$find_ip = $_GET["ip"];
$find_name = $_GET["nick"];
if(isset($_GET["format"])) {
$format = $_GET["format"];
}
else
{
$format = "include";
}
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error)
{
ReturnError("NO_CONNECTION");
}
function ReturnError($error)
{
if($format == "mod")
die("!DATA!ERROR:" .$error. "!DATA!"); else
}
function ReturnData($data)
{
if($format == "mod")
die("!DATA!SUCCESS:" .$data. "!DATA!"); else
}
function GetServerIP()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP'];
else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
else
return $_SERVER['REMOTE_ADDR'];
}
function GetTimestamp()
{
$now->format("m-d-Y H:i:s.u");
$local = $now->setTimeZone(new DateTimeZone('Europe/Prague'));
return $local->getTimestamp();
}
function GetFormatedTime()
{
$now->format("m-d-Y H:i:s.u");
$local = $now->setTimeZone(new DateTimeZone('Europe/Prague'));
return $local->format("Y-m-d H:i:s.u");
}
function AddAddress($addr)
{
{
return false;
}
else
{
return true;
}
}
function AddTime($time)
{
{
return false;
}
else
{
return true;
}
}
function AddNickname($nick)
{
{
return false;
}
else
{
return true;
}
}
function AddServer($server)
{
{
return false;
}
else
{
return true;
}
}
function LookForIPs($ip)
{
$sql = "SELECT * FROM `connections` WHERE `IP` = '".$ip."'";
$result = $conn->query($sql);
if ($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
AddAddress($row["IP"]);
AddServer($row["serverIP"]);
AddTime
(Array($row["datestamp"], $row["datestring"], $row["serverIP"]));
if(AddNickname($row["nickname"]) && $row["nickname"] != "Player" && $row["nickname"] != "A_Edition_V2")
{
LookForNicknames($row["nickname"]);
}
}
return true;
}
else
{
return false;
}
}
function LookForNicknames($nick)
{
$sql = "SELECT * FROM `connections` WHERE `nickname` LIKE '".$nick."'";
$result = $conn->query($sql);
if ($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
AddNickname($row["nickname"]);
AddServer($row["serverIP"]);
AddTime
(Array($row["datestamp"], $row["datestring"], $row["serverIP"]));
if(AddAddress($row["IP"]))
{
LookForIPs($row["IP"]);
}
}
return true;
}
else
{
return false;
}
}
function SortTimes()
{
$good = false;
while($good == false)
{
$good = true;
for($i = 0; $i < count($times); $i++) {
if($i+1
== count($times)) continue;
if($times[$i][0] < $times[$i + 1][0])
{
$tmp = $times[$i];
$times[$i] = $times[$i + 1];
$times[$i+1] = $tmp;
$good = false;
}
}
}
}
function GenerateLastSeenString($fromTime)
{
$time_now = GetTimestamp();
if($time_now < $fromTime)
{
return "N/A";
}
if($fromTime == 0 || $fromTime =="")
{
return "N/A";
}
$ss = $time_now - $fromTime;
$seconds = $ss%60;
$minutes = floor(($ss%3600
)/60
); $hours = floor(($ss%86400
)/3600
); $days = floor(($ss%2592000
)/86400
); $months = floor($ss/2592000
);
$str = "";
if($months != 0)
{
if($str != "")
$str = $str . " ";
if($days == 1)
$str = $str . $months . " month";
else
$str = $str . $months . " months";
}
if($days != 0)
{
if($str != "")
$str = $str . " ";
if($days == 1)
$str = $str . $days . " day";
else
$str = $str . $days . " days";
}
if($hours != 0)
{
if($str != "")
$str = $str . " ";
if($hours == 1)
$str = $str . $hours . " hour";
else
$str = $str . $hours . " hours";
}
if($minutes != 0)
{
if($str != "")
$str = $str . " ";
if($minutes == 1)
$str = $str . $minutes . " minute";
else
$str = $str . $minutes . " minutes";
}
if($seconds != 0)
{
if($str != "")
$str = $str . " ";
if($seconds == 1)
$str = $str . $seconds . " second";
else
$str = $str . $seconds . " seconds";
}
return $str. " ago";
}
function ClearResult($arr)
{
for($i = 0; $i < count($arr); $i++) {
{
//echo "Found bool at $i";
}
}
return $arr;
}
function PrintArray($arr)
{
for($i = 0; $i < count($arr); $i++) {
if($i + 1
!= count($arr)) {
}
}
}
if($format == "mod")
{
LookForNicknames($find_name);
LookForIPs($find_ip);
$nicknames = ClearResult($nicknames);
$addresses = ClearResult($addresses);
$servers = ClearResult($servers);
$conn->close();
/*if (!filter_var($find_ip, FILTER_VALIDATE_EMAIL) && $find_ip != "")
{
$find_ip = $addresses[0];
}*/
if($find_ip == "")
{
$find_ip = $addresses[0];
}
if($find_ip == "")
{
$find_ip = "0.0.0.0";
}
if(count($nicknames) == 0
&& count($addresses) == 0) {
ReturnError("NOT_FOUND");
}
echo "Nicknames used: "; PrintArray
($nicknames); echo "*-*"; SortTimes();
if(GetTimestamp() - $times[0][0] < 60 * 60)
echo "Last seen: " . GenerateLastSeenString
($times[1][0]) . "*-*"; else
echo "Last seen: " . GenerateLastSeenString
($times[0][0]) . "*-*";
echo "First seen: " . GenerateLastSeenString
($times[count($times)-1
][0
]); }
else if($format == "debug")
{
LookForNicknames($find_name);
LookForIPs($find_ip);
$nicknames = ClearResult($nicknames);
$addresses = ClearResult($addresses);
$servers = ClearResult($servers);
$conn->close();
/*if (!filter_var($find_ip, FILTER_VALIDATE_EMAIL) && $find_ip != "")
{
$find_ip = $addresses[0];
}*/
if($find_ip == "")
{
$find_ip = $addresses[0];
}
if($find_ip == "")
{
$find_ip = "0.0.0.0";
}
if(count($nicknames) == 0
&& count($addresses) == 0) {
ReturnError("NOT_FOUND");
}
echo "Nicknames used: "; PrintArray
($nicknames); echo "<br>"; echo "IPs used: "; PrintArray
($addresses); echo "<br>"; SortTimes();
echo "Last seen: " . GenerateLastSeenString
($times[0][0]) . "<br>"; echo "First seen: " . GenerateLastSeenString
($times[count($times)-1][0]) . "<br>"; }
?>
Problem polega na tym, że w zależności od tego jakiego nickname'a dane chcę pobrać, skrypt albo zwraca poprawne informacje, albo wyrzuca całą bazę która ma już 15000 linii. Przykład tego jak to powinno wyglądać:
a czasami zwraca coś takiego:
mimo że sam nickname był unikalny. A tak wygląda sama baza:
Jestem zbyt początkujący w PHP, żeby ogarnąć gdzie jest błąd. Jeśli komuś chciałoby się przejrzeć skrypt, byłbym wdzięczny.