/search.php

https://github.com/wmorganjr/epictome · PHP · 126 lines · 98 code · 28 blank · 0 comment · 16 complexity · 26d280945a1073a74ac6a5f0b69337a4 MD5 · raw file

  1. <?php
  2. include_once('util.php');
  3. function search_results() {
  4. if (! ($link = db_connect())) {
  5. return NULL;
  6. }
  7. $clauses = build_clauses($link);
  8. $query = build_query($clauses);
  9. if (! ($result = mysql_query($query))) {
  10. return NULL;
  11. }
  12. $results = result_to_array($result);
  13. mysql_free_result($result);
  14. mysql_close($link);
  15. return $results;
  16. }
  17. function build_clauses($link) {
  18. $clauses = "TRUE";
  19. $clauses = add_exact_params($clauses, $link);
  20. $clauses = add_approx_params($clauses, $link);
  21. if ($_GET["instock"]) {
  22. $clauses .= " AND stock.qty > 0";
  23. }
  24. return $clauses;
  25. }
  26. function add_exact_params($clauses, $link) {
  27. $exact_params = array("alignment", "origin", "card_type", "cost", "set_name",
  28. "rarity", "speed", "instantaneous", "gift");
  29. foreach ($exact_params as $param_name) {
  30. $param = $_GET[$param_name];
  31. if (is_array($param)) {
  32. if (count($param) > 0 && strlen($param[0]) > 0) {
  33. $clauses .= build_disjunction($param_name, $param, $link);
  34. }
  35. } elseif (strlen($param) > 0) {
  36. $param = mysql_real_escape_string($param, $link);
  37. $clauses .= " AND cards.$param_name = " . bool_or_quote($param);
  38. }
  39. }
  40. return $clauses;
  41. }
  42. function build_disjunction($param_name, $param_values, $link) {
  43. $rtn = " AND (FALSE";
  44. foreach ($param_values as $value) {
  45. $value = mysql_real_escape_string($value, $link);
  46. $rtn .= " OR cards.$param_name = " . bool_or_quote($value);
  47. }
  48. $rtn .= ")";
  49. return $rtn;
  50. }
  51. function add_approx_params($clauses, $link) {
  52. $approx_params = array("card_name", "text");
  53. foreach ($approx_params as $param_name) {
  54. $param = $_GET[$param_name];
  55. if ($param) {
  56. $param = mysql_real_escape_string($param, $link);
  57. $clauses .= " AND $param_name LIKE '%$param%'";
  58. }
  59. }
  60. return $clauses;
  61. }
  62. function build_query($clauses) {
  63. $join_on = "cards.set_name = stock.set_name AND " .
  64. "cards.set_number = stock.set_number";
  65. $table = "cards LEFT JOIN stock ON ($join_on)";
  66. $query = "SELECT * FROM $table WHERE $clauses ORDER BY card_name;";
  67. return $query;
  68. }
  69. function result_to_array($result) {
  70. $rtn = array();
  71. while ($row = mysql_fetch_assoc($result)) {
  72. $arr = array();
  73. foreach ($row as $fieldname => $fieldvalue) {
  74. $arr[$fieldname] = bool_to_string($fieldvalue);
  75. }
  76. array_push($rtn, $arr);
  77. }
  78. return $rtn;
  79. }
  80. function bool_or_quote($x) {
  81. if ($x == "true") {
  82. return 1;
  83. } elseif ($x == "false") {
  84. return 0;
  85. } else {
  86. return "'$x'";
  87. }
  88. }
  89. function bool_to_string($x) {
  90. if ($x == "\0") {
  91. return false;
  92. } elseif ($x == "\1") {
  93. return true;
  94. } else {
  95. return $x;
  96. }
  97. }
  98. ?>