Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Skrypt do pobierania danych z bazy
jevgienij
post 21.09.2020, 22:55:42
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 21.09.2020

Ostrzeżenie: (0%)
-----


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:

  1. <?php
  2. error_reporting(E_ERROR | E_WARNING | E_PARSE);
  3. $servername = "127.0.0.1";
  4. $username = "";
  5. $password = "";
  6. $dbname = "";
  7.  
  8. $addresses = Array();
  9. $nicknames = Array();
  10. $servers = Array();
  11. $times = Array();
  12.  
  13. $find_ip = $_GET["ip"];
  14. $find_name = $_GET["nick"];
  15.  
  16. if(isset($_GET["format"]))
  17. {
  18. $format = $_GET["format"];
  19. }
  20. else
  21. {
  22. $format = "include";
  23. }
  24.  
  25. $conn = new mysqli($servername, $username, $password, $dbname);
  26. if ($conn->connect_error)
  27. {
  28. ReturnError("NO_CONNECTION");
  29. }
  30.  
  31. function ReturnError($error)
  32. {
  33. global $format;
  34. if($format == "mod")
  35. die("!DATA!ERROR:" .$error. "!DATA!");
  36. else
  37. die("ERROR:" . $error);
  38.  
  39. }
  40.  
  41. function ReturnData($data)
  42. {
  43. global $format;
  44. if($format == "mod")
  45. die("!DATA!SUCCESS:" .$data. "!DATA!");
  46. else
  47.  
  48. die("SUCCESS:" .$data);
  49. }
  50.  
  51. function GetServerIP()
  52. {
  53. if (!empty($_SERVER['HTTP_CLIENT_IP']))
  54. return $_SERVER['HTTP_CLIENT_IP'];
  55. else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
  56. return $_SERVER['HTTP_X_FORWARDED_FOR'];
  57. else
  58. return $_SERVER['REMOTE_ADDR'];
  59. }
  60.  
  61. function GetTimestamp()
  62. {
  63. $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
  64. $now->format("m-d-Y H:i:s.u");
  65. $local = $now->setTimeZone(new DateTimeZone('Europe/Prague'));
  66. return $local->getTimestamp();
  67. }
  68.  
  69. function GetFormatedTime()
  70. {
  71. $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
  72. $now->format("m-d-Y H:i:s.u");
  73. $local = $now->setTimeZone(new DateTimeZone('Europe/Prague'));
  74. return $local->format("Y-m-d H:i:s.u");
  75. }
  76.  
  77. function AddAddress($addr)
  78. {
  79. global $addresses;
  80. if(in_array($addr, $addresses, true))
  81. {
  82. return false;
  83. }
  84. else
  85. {
  86. array_push($addresses, $addr);
  87. return true;
  88. }
  89. }
  90.  
  91. function AddTime($time)
  92. {
  93. global $times;
  94. if(in_array($time, $times, true))
  95. {
  96. return false;
  97. }
  98. else
  99. {
  100. array_push($times, $time);
  101. return true;
  102. }
  103. }
  104.  
  105. function AddNickname($nick)
  106. {
  107. global $nicknames;
  108. if(in_array($nick, $nicknames, true))
  109. {
  110. return false;
  111. }
  112. else
  113. {
  114. array_push($nicknames, $nick, true);
  115. return true;
  116. }
  117. }
  118.  
  119. function AddServer($server)
  120. {
  121. global $servers;
  122. if(in_array($server, $servers, true))
  123. {
  124. return false;
  125. }
  126. else
  127. {
  128. array_push($servers, $server, true);
  129. return true;
  130. }
  131. }
  132.  
  133. function LookForIPs($ip)
  134. {
  135. global $conn;
  136.  
  137. $sql = "SELECT * FROM `connections` WHERE `IP` = '".$ip."'";
  138. $result = $conn->query($sql);
  139.  
  140. if ($result->num_rows > 0)
  141. {
  142. while($row = $result->fetch_assoc())
  143. {
  144. AddAddress($row["IP"]);
  145. AddServer($row["serverIP"]);
  146. AddTime(Array($row["datestamp"], $row["datestring"], $row["serverIP"]));
  147.  
  148. if(AddNickname($row["nickname"]) && $row["nickname"] != "Player" && $row["nickname"] != "A_Edition_V2")
  149. {
  150. LookForNicknames($row["nickname"]);
  151. }
  152.  
  153. }
  154. return true;
  155. }
  156. else
  157. {
  158. return false;
  159. }
  160. }
  161.  
  162. function LookForNicknames($nick)
  163. {
  164. global $conn;
  165.  
  166. $sql = "SELECT * FROM `connections` WHERE `nickname` LIKE '".$nick."'";
  167. $result = $conn->query($sql);
  168.  
  169. if ($result->num_rows > 0)
  170. {
  171. while($row = $result->fetch_assoc())
  172. {
  173. AddNickname($row["nickname"]);
  174. AddServer($row["serverIP"]);
  175. AddTime(Array($row["datestamp"], $row["datestring"], $row["serverIP"]));
  176.  
  177. if(AddAddress($row["IP"]))
  178. {
  179. LookForIPs($row["IP"]);
  180. }
  181. }
  182. return true;
  183. }
  184. else
  185. {
  186. return false;
  187. }
  188. }
  189.  
  190. function SortTimes()
  191. {
  192. global $times;
  193. $good = false;
  194.  
  195. while($good == false)
  196. {
  197. $good = true;
  198. for($i = 0; $i < count($times); $i++)
  199. {
  200. if($i+1 == count($times))
  201. continue;
  202.  
  203. if($times[$i][0] < $times[$i + 1][0])
  204. {
  205. $tmp = $times[$i];
  206. $times[$i] = $times[$i + 1];
  207. $times[$i+1] = $tmp;
  208.  
  209. $good = false;
  210. }
  211. }
  212. }
  213. }
  214.  
  215. function GenerateLastSeenString($fromTime)
  216. {
  217. $time_now = GetTimestamp();
  218.  
  219. if($time_now < $fromTime)
  220. {
  221. return "N/A";
  222. }
  223. if($fromTime == 0 || $fromTime =="")
  224. {
  225. return "N/A";
  226. }
  227.  
  228. $ss = $time_now - $fromTime;
  229.  
  230. $seconds = $ss%60;
  231. $minutes = floor(($ss%3600)/60);
  232. $hours = floor(($ss%86400)/3600);
  233. $days = floor(($ss%2592000)/86400);
  234. $months = floor($ss/2592000);
  235.  
  236. $str = "";
  237.  
  238. if($months != 0)
  239. {
  240. if($str != "")
  241. $str = $str . " ";
  242. if($days == 1)
  243. $str = $str . $months . " month";
  244. else
  245. $str = $str . $months . " months";
  246. }
  247.  
  248. if($days != 0)
  249. {
  250. if($str != "")
  251. $str = $str . " ";
  252. if($days == 1)
  253. $str = $str . $days . " day";
  254. else
  255. $str = $str . $days . " days";
  256. }
  257.  
  258. if($hours != 0)
  259. {
  260. if($str != "")
  261. $str = $str . " ";
  262. if($hours == 1)
  263. $str = $str . $hours . " hour";
  264. else
  265. $str = $str . $hours . " hours";
  266. }
  267.  
  268. if($minutes != 0)
  269. {
  270. if($str != "")
  271. $str = $str . " ";
  272. if($minutes == 1)
  273. $str = $str . $minutes . " minute";
  274. else
  275. $str = $str . $minutes . " minutes";
  276. }
  277.  
  278. if($seconds != 0)
  279. {
  280. if($str != "")
  281. $str = $str . " ";
  282. if($seconds == 1)
  283. $str = $str . $seconds . " second";
  284. else
  285. $str = $str . $seconds . " seconds";
  286. }
  287.  
  288. return $str. " ago";
  289. }
  290.  
  291. function ClearResult($arr)
  292. {
  293. for($i = 0; $i < count($arr); $i++)
  294. {
  295. if(gettype($arr[$i]) == "boolean")
  296. {
  297. //echo "Found bool at $i";
  298. array_splice($arr, $i, 1);
  299. }
  300. }
  301.  
  302. return $arr;
  303. }
  304.  
  305. function PrintArray($arr)
  306. {
  307. for($i = 0; $i < count($arr); $i++)
  308. {
  309. echo $arr[$i];
  310. if($i + 1 != count($arr))
  311. {
  312. echo ", ";
  313. }
  314. }
  315. }
  316.  
  317. if($format == "mod")
  318. {
  319. LookForNicknames($find_name);
  320. LookForIPs($find_ip);
  321.  
  322. $nicknames = ClearResult($nicknames);
  323. $addresses = ClearResult($addresses);
  324. $servers = ClearResult($servers);
  325. $conn->close();
  326.  
  327. /*if (!filter_var($find_ip, FILTER_VALIDATE_EMAIL) && $find_ip != "")
  328. {
  329. $find_ip = $addresses[0];
  330. }*/
  331.  
  332. if($find_ip == "")
  333. {
  334. $find_ip = $addresses[0];
  335. }
  336.  
  337. if($find_ip == "")
  338. {
  339. $find_ip = "0.0.0.0";
  340. }
  341.  
  342.  
  343. if(count($nicknames) == 0 && count($addresses) == 0)
  344. {
  345. ReturnError("NOT_FOUND");
  346. }
  347.  
  348. echo "!DATA!";
  349. echo "Nicknames used: "; PrintArray($nicknames); echo "*-*";
  350. echo "Total IPs used: "; echo count($addresses); echo "*-*";
  351. echo "Location: "; echo file_get_contents("http://127.0.0.1/db/getlocation.php?ip=$find_ip"); echo "*-*";
  352. echo "Connected: "; echo count($times); echo " times*-*";
  353. SortTimes();
  354.  
  355. if(GetTimestamp() - $times[0][0] < 60 * 60)
  356. echo "Last seen: " . GenerateLastSeenString($times[1][0]) . "*-*";
  357. else
  358. echo "Last seen: " . GenerateLastSeenString($times[0][0]) . "*-*";
  359.  
  360. echo "First seen: " . GenerateLastSeenString($times[count($times)-1][0]);
  361. echo "!DATA!";
  362. }
  363. else if($format == "debug")
  364. {
  365. LookForNicknames($find_name);
  366. LookForIPs($find_ip);
  367.  
  368. $nicknames = ClearResult($nicknames);
  369. $addresses = ClearResult($addresses);
  370. $servers = ClearResult($servers);
  371. $conn->close();
  372.  
  373. /*if (!filter_var($find_ip, FILTER_VALIDATE_EMAIL) && $find_ip != "")
  374. {
  375. $find_ip = $addresses[0];
  376. }*/
  377.  
  378. if($find_ip == "")
  379. {
  380. $find_ip = $addresses[0];
  381. }
  382.  
  383. if($find_ip == "")
  384. {
  385. $find_ip = "0.0.0.0";
  386. }
  387.  
  388. if(count($nicknames) == 0 && count($addresses) == 0)
  389. {
  390. ReturnError("NOT_FOUND");
  391. }
  392.  
  393. echo "Nicknames used: "; PrintArray($nicknames); echo "<br>";
  394. echo "IPs used: "; PrintArray($addresses); echo "<br>";
  395. echo "Location: "; echo file_get_contents("http://127.0.0.1/db/getlocation.php?ip=$find_ip"); echo "<br>";
  396. echo "Connected: "; echo count($times); echo " times<br>";
  397. SortTimes();
  398. echo "Last seen: " . GenerateLastSeenString($times[0][0]) . "<br>";
  399. echo "First seen: " . GenerateLastSeenString($times[count($times)-1][0]) . "<br>";
  400. echo $find_name;
  401. }
  402. ?>


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 08:08