/sql.php

https://github.com/episcopus/r8www · PHP · 137 lines · 92 code · 26 blank · 19 comment · 5 complexity · 0429518963bdf0e6ac4dd4ca3c4220aa MD5 · raw file

  1. <?php
  2. require_once('sql_config.php');
  3. class r8DB {
  4. private $conn;
  5. function __construct() {
  6. $this->conn = $this->connect();
  7. }
  8. function __destruct() {
  9. $this->closeConnection();
  10. }
  11. public function getLeaderboardData() {
  12. $query = "select s.initials, s.longname, s.score, r.createdAt, (select date_add(date(sr.createdAt),interval -1 day) from Scores ss join Runs sr on sr.id = ss.runId where ss.initials = s.initials and ss.score = s.score order by sr.id limit 1) as 'setAt' from Scores s join Runs r on r.id=s.runId where s.runId = (select id from Runs order by id desc limit 1) order by s.score desc";
  13. $sqlResult = $this->query($query);
  14. return $sqlResult;
  15. }
  16. public function getStatsData() {
  17. $query = "select s.lsc, s.msc, s.rsc, s.tc, s.eme, s.ptm, s.mp, s.cp from Stats s join Runs r on r.id= s.runId where s.runId = (select id from Runs order by id desc limit 1)";
  18. $sqlResult = $this->query($query);
  19. return $sqlResult;
  20. }
  21. public function getScoreChartData() {
  22. $query = "select r.id, date_add(date(r.createdAt), interval -1 day) as 'day', (select s.initials from Scores s where s.runId = r.id order by s.score desc limit 1) as 'topInitial', (select s.score from Scores s where s.runId = r.id order by s.score desc limit 1) as 'topScore', (select s.initials from Scores s where s.runId = r.id order by s.score asc limit 1) as 'lowInitial', (select s.score from Scores s where s.runId = r.id order by s.score asc limit 1) as 'lowScore' from Runs r";
  23. $sqlResult = $this->query($query);
  24. return $sqlResult;
  25. }
  26. public function getPtmChartData() {
  27. $query = "select r.id as 'runId', IF(cast((a.ptm - v.ptm) as signed) >= 0, a.ptm - v.ptm, a.ptm) as 'delta' from (select id, ptm, (select count(id) from Stats s where s.id <= l.id) as 'ranking' from Stats l) v left join (select id, ptm, runId, (select count(id) from Stats s where s.id <= l.id) as 'ranking' from Stats l) a on (a.ranking = v.ranking + 1) left join Runs r on r.id = a.runId where a.id is not null order by r.createdAt asc";
  28. $sqlResult = $this->query($query);
  29. $result = array();
  30. while ($row = $sqlResult->fetch_assoc()) {
  31. $result[$row["runId"]] = $row["delta"];
  32. }
  33. return $result;
  34. }
  35. public function createRun() {
  36. $escName = $this->conn->real_escape_string($name);
  37. $escDesc = $this->conn->real_escape_string($desc);
  38. $query = "INSERT INTO Runs (createdAt) values (NOW())";
  39. $this->query($query);
  40. // Retrieve ID of newly inserted row and pass back to client.
  41. $query = "SELECT LAST_INSERT_ID() AS 'id'";
  42. $result = $this->query($query);
  43. $row = $result->fetch_assoc();
  44. $id = intval($row["id"]);
  45. return $id;
  46. }
  47. public function saveStats($runId, $stats) {
  48. $escRunId = $this->conn->real_escape_string($runId);
  49. /* array(8) { */
  50. /* ["left slot coins"]=> */
  51. /* int(4) */
  52. /* ["middle slot coins"]=> */
  53. /* int(0) */
  54. /* ["right slot coins"]=> */
  55. /* int(0) */
  56. /* ["total coins"]=> */
  57. /* int(4) */
  58. /* ["extra men earned"]=> */
  59. /* int(12) */
  60. /* ["play time in minutes"]=> */
  61. /* int(6) */
  62. /* ["men played"]=> */
  63. /* int(24) */
  64. /* ["credits played"]=> */
  65. /* int(4) */
  66. /* } */
  67. $query = "INSERT INTO Stats (lsc, msc, rsc, tc, eme, ptm, mp, cp, runId) VALUES ({$stats['left slot coins']}, {$stats['middle slot coins']}, {$stats['right slot coins']}, {$stats['total coins']}, {$stats['extra men earned']}, {$stats['play time in minutes']}, {$stats['men played']}, {$stats['credits played']}, $runId)";
  68. $result = $this->query($query);
  69. return $result;
  70. }
  71. public function saveScores($runId, $scores) {
  72. $escRunId = $this->conn->real_escape_string($runId);
  73. foreach ($scores as $score) {
  74. $query = "INSERT INTO Scores (initials, longname, score, runId) VALUES ('{$score['name']}', '{$score['longname']}', '{$score['score']}', $runId)";
  75. $result = $this->query($query);
  76. }
  77. return $result;
  78. }
  79. private function query($query) {
  80. if (!$this->conn) {
  81. return false;
  82. }
  83. $result = $this->conn->query($query);
  84. if (empty($result)) {
  85. $errorStr = "R8: Failed to run query: $query, error: " . $this->conn->error;
  86. error_log($errorStr);
  87. throw new Exception($errorStr);
  88. }
  89. return $result;
  90. }
  91. private function connect() {
  92. $conn = mysqli_init();
  93. if (!$conn->real_connect(R8_DB_HOST, R8_DB_USER, R8_DB_PASS, R8_DB_NAME, 3306)) {
  94. $errorStr = "R8: Failed to connect to T8 DB, err no: " . mysqli_connect_errno();
  95. error_log($errorStr);
  96. $conn = false;
  97. throw new Exception($errorStr);
  98. }
  99. return $conn;
  100. }
  101. private function closeConnection() {
  102. if (!empty($this->conn)) {
  103. try {
  104. $this->conn->close();
  105. }
  106. catch (Exception $e) {
  107. error_log("R8: Failed to close connection, error: " . $e->getMessage());
  108. }
  109. }
  110. }
  111. }