/website/profile_games_widget.php

https://github.com/nbauernfeind/aichallenge · PHP · 182 lines · 154 code · 13 blank · 15 comment · 30 complexity · 9ed37d0daf87afa3c5d93abf3f149f8f MD5 · raw file

  1. <?php
  2. include_once "pagination.php";
  3. /*
  4. * getGamesTableString
  5. *
  6. * Returns Games Table as a string,
  7. * if $viewmore is true (default), it outputs $viewresults rows and has an underlink to page given
  8. * if $viewmore is false, it uses pagination with $viewresults rows per page
  9. * page linking is done with $viewlink
  10. *
  11. */
  12. function getGamesTableString($user_id, $viewmore = true, $viewresults = 10, $viewlink, $page=0)
  13. {
  14. // Avoid SQL injections
  15. if(!filter_var($user_id, FILTER_VALIDATE_INT)) {
  16. return "";
  17. } else {
  18. $user_id = intval($user_id);
  19. }
  20. if (!filter_var($page, FILTER_VALIDATE_INT)) {
  21. $page = 0;
  22. } else {
  23. $page = intval($page);
  24. }
  25. // Fetch user's current submission's id
  26. $submission_query = <<<EOT
  27. select
  28. max(s.submission_id) as id
  29. from
  30. submission s
  31. where
  32. s.user_id = $user_id
  33. EOT;
  34. $submission_data = mysql_query($submission_query);
  35. if ($submission_data) {
  36. list($submission) = mysql_fetch_row($submission_data);
  37. } else {
  38. $submission = -1;
  39. }
  40. // Fetch Row Count
  41. $rowcount_query = <<<EOT
  42. select
  43. count(1)
  44. from
  45. game g
  46. where
  47. (g.player_one = $submission or g.player_two = $submission)
  48. EOT;
  49. $rowcount_data = mysql_query($rowcount_query);
  50. if ($rowcount_data) {
  51. list($rowcount) = mysql_fetch_row($rowcount_data);
  52. } else {
  53. $rowcount = 0;
  54. }
  55. // Fetch Game Information For Users Current Submission
  56. $games_query = <<<EOT
  57. (select
  58. u.username as opp_name,
  59. u.user_id as opp_id,
  60. g.game_id,
  61. g.draw,
  62. date_format(g.timestamp,'%b %D %H:%i:%S') as date,
  63. g.timestamp,
  64. if( g.draw = 0, 'Win', 'Draw' ) as outcome
  65. from
  66. game g USE INDEX (winner_3)
  67. inner join submission s USE INDEX (submission_id) on s.submission_id = g.loser
  68. inner join user u USE INDEX (user_id) on u.user_id = s.user_id
  69. where g.winner = $submission
  70. )
  71. union
  72. (select
  73. u.username as opp_name,
  74. u.user_id as opp_id,
  75. g.game_id,
  76. g.draw,
  77. date_format(g.timestamp,'%b %D %H:%i:%S') as date,
  78. g.timestamp,
  79. if( g.draw = 0, 'Loss', 'Draw' ) as outcome
  80. from
  81. game g USE INDEX (loser_3)
  82. inner join submission s USE INDEX (submission_id) on s.submission_id = g.winner
  83. inner join user u USE INDEX (user_id) on u.user_id = s.user_id
  84. where g.loser = $submission
  85. )
  86. union
  87. (select
  88. u.username as opp_name,
  89. u.user_id as opp_id,
  90. g.game_id,
  91. g.draw,
  92. date_format(g.timestamp,'%b %D %H:%i:%S') as date,
  93. g.timestamp,
  94. 'Draw' as outcome
  95. from
  96. game g
  97. inner join submission s USE INDEX (submission_id)
  98. on s.submission_id = g.player_two
  99. inner join user u USE INDEX (user_id) on u.user_id = s.user_id
  100. where g.player_one = $submission AND g.draw = 1
  101. )
  102. union
  103. (select
  104. u.username as opp_name,
  105. u.user_id as opp_id,
  106. g.game_id,
  107. g.draw,
  108. date_format(g.timestamp,'%b %D %H:%i:%S') as date,
  109. g.timestamp,
  110. 'Draw' as outcome
  111. from
  112. games g
  113. inner join submission s USE INDEX (submission_id)
  114. on s.submission_id = g.player_one
  115. inner join user u USE INDEX (user_id) on u.user_id = s.user_id
  116. where g.player_two = $submission AND g.draw = 1
  117. )
  118. order by
  119. timestamp desc
  120. EOT;
  121. if ($viewmore) {
  122. $games_query .= " limit $viewresults";
  123. } else if ($page != 0) {
  124. $games_query .= " limit $viewresults OFFSET " . ($viewresults * ($page-1));
  125. }
  126. $games_results = mysql_query($games_query);
  127. // If query fails
  128. if (!$games_results || $rowcount == 0) {
  129. return "<p>No game information available at this time.</p>";
  130. }
  131. // Build table
  132. $table = "";
  133. if (!$viewmore) {
  134. $table .= getPaginationString($page, $rowcount, $viewresults, $viewlink);
  135. }
  136. $table .= "<table class=\"submissions\"><thead><tr><th>Time</th><th>Opponent</th><th>Outcome</th><th>&nbsp;</th></tr></thead>";
  137. $table .= "<tbody>";
  138. for ($i = 1; $row = mysql_fetch_assoc($games_results); $i += 1) {
  139. $opp_name = htmlentities($row["opp_name"], ENT_COMPAT, "UTF-8");
  140. $opp_id = $row["opp_id"];
  141. $game_id = $row["game_id"];
  142. $outcome = $row["outcome"];
  143. $datetime = $row["date"];
  144. if ($row["draw"] == 1) {
  145. $outcome = "Draw";
  146. }
  147. if ($outcome == "Win") {
  148. $outcome_class = "game_win";
  149. } else if ($outcome == "Loss") {
  150. $outcome_class = "game_loss";
  151. } else {
  152. $outcome_class = "game_draw";
  153. }
  154. $timestamp = $row["timestamp"];
  155. $row_class = $i % 2 == 0 ? "even" : "odd";
  156. $table .= " <tr class=\"$row_class\">";
  157. $table .= " <td>$datetime</td>";
  158. $table .= " <td><a href=\"profile.php?user=$opp_id\">$opp_name</a></td>";
  159. $table .= " <td class=\"$outcome_class\">$outcome</td>";
  160. $table .= " <td><a href=\"visualizer.php?game_id=$game_id\">View Game &gt;&gt;</a></td>";
  161. $table .= " </tr>";
  162. }
  163. $table .= "</tbody></table>";
  164. if ($viewmore && $rowcount > $viewresults) {
  165. $table .= "<a href=\"$viewlink\">View More</a>";
  166. }
  167. return $table;
  168. }
  169. ?>