/class/AppSQL.php

https://github.com/riaf/ethna · PHP · 170 lines · 96 code · 11 blank · 63 comment · 19 complexity · 225b56aab953dda96848be7902ba376f MD5 · raw file

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4. * AppSQL.php
  5. *
  6. * @author Masaki Fujimoto <fujimoto@php.net>
  7. * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
  8. * @package Ethna
  9. * @version $Id: fab40c289e17f24d2f915bfacb6b81008cc30c13 $
  10. */
  11. // {{{ Ethna_AppSQL
  12. /**
  13. * アプリケーションSQLベースクラス
  14. *
  15. * @author Masaki Fujimoto <fujimoto@php.net>
  16. * @access public
  17. * @package Ethna
  18. */
  19. class Ethna_AppSQL
  20. {
  21. /**#@+
  22. * @access private
  23. */
  24. /** @protected object Ethna_Controller controllerオブジェクト */
  25. protected $controller;
  26. /**#@-*/
  27. /**
  28. * Ethna_AppSQLのコンストラクタ
  29. *
  30. * @access public
  31. * @param object Ethna_Controller &$controller controllerオブジェクト
  32. */
  33. public function __construct($controller)
  34. {
  35. $this->controller = $controller;
  36. }
  37. /**
  38. * 適切にエスケープされたSQL文を返す
  39. *
  40. * @access public
  41. * @param string $sqlfunc SQL文種別名
  42. * @param array $args 引数一覧
  43. * @return string エスケープされたSQL文
  44. */
  45. public function get($sqlid, $args)
  46. {
  47. Ethna_AppSQL::escapeSQL($args);
  48. return call_user_func_array(array($this, $sqlid), $args);
  49. }
  50. /**
  51. * SQL引数をエスケープする
  52. *
  53. * @access public
  54. * @param mixed &$var エスケープする値
  55. * @static
  56. */
  57. public static function escapeSQL(&$var, $type = null)
  58. {
  59. if (!is_array($var)) {
  60. if (is_null($var)) {
  61. $var = 'NULL';
  62. } else {
  63. if ($type === 'sqlite') {
  64. $var = "'" . sqlite_escape_string($var) . "'";
  65. } else {
  66. $var = "'" . addslashes($var) . "'";
  67. }
  68. }
  69. return;
  70. }
  71. foreach (array_keys($var) as $key) {
  72. Ethna_AppSQL::escapeSQL($var[$key], $type);
  73. }
  74. }
  75. /**
  76. * escapeSQLでエスケープされた文字列をunescapeする
  77. *
  78. * @access public
  79. * @param mixed &$var エスケープを復帰する値
  80. * @static
  81. */
  82. public static function unescapeSQL(&$var, $type = null)
  83. {
  84. if (!is_array($var)) {
  85. if ($var == 'NULL') {
  86. return;
  87. }
  88. $var = substr($var, 1, strlen($var)-2);
  89. $var = stripslashes($var);
  90. return;
  91. }
  92. foreach (array_keys($var) as $key) {
  93. Ethna_AppSQL::unescapeSQL($var[$key], $type);
  94. }
  95. }
  96. /**
  97. * WHERE条件文を生成する
  98. *
  99. * @access public
  100. * @param string $field 検索対象のフィールド
  101. * @param mixed $value 検索値
  102. * @param int $condition 検索条件(OBJECT_CONDITION_NE,...)
  103. * @return string 検索条件文
  104. * @static
  105. */
  106. public static function getCondition($field, $value, $condition = OBJECT_CONDITION_EQ)
  107. {
  108. switch ($condition) {
  109. case OBJECT_CONDITION_EQ:
  110. $op = "="; break;
  111. case OBJECT_CONDITION_NE:
  112. $op = "!="; break;
  113. case OBJECT_CONDITION_LIKE:
  114. $op = "LIKE"; break;
  115. case OBJECT_CONDITION_GT:
  116. $op = ">"; break;
  117. case OBJECT_CONDITION_LT:
  118. $op = "<"; break;
  119. case OBJECT_CONDITION_GE:
  120. $op = ">="; break;
  121. case OBJECT_CONDITION_LE:
  122. $op = "<="; break;
  123. }
  124. // default operand
  125. $operand = $value;
  126. if (is_array($value)) {
  127. if (count($value) > 0) {
  128. switch ($condition) {
  129. case OBJECT_CONDITION_EQ:
  130. $op = "IN"; break;
  131. case OBJECT_CONDITION_NE:
  132. $op = "NOT IN"; break;
  133. }
  134. $operand = sprintf("(%s)", implode(',', $value));
  135. } else {
  136. // always be false
  137. $op = "=";
  138. $operand = "NULL";
  139. }
  140. } else {
  141. if ($value == 'NULL') {
  142. switch ($condition) {
  143. case OBJECT_CONDITION_EQ:
  144. $op = "IS"; break;
  145. case OBJECT_CONDITION_NE:
  146. $op = "IS NOT"; break;
  147. }
  148. }
  149. if ($condition == OBJECT_CONDITION_LIKE) {
  150. Ethna_AppSQL::unescapeSQL($value);
  151. $value = '%' . str_replace('%', '\\%', $value) . '%';
  152. Ethna_AppSQL::escapeSQL($value);
  153. $operand = $value;
  154. }
  155. }
  156. return "$field $op $operand";
  157. }
  158. }
  159. // }}}