SqlHelper.class.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace KIF\Dao;
  3. use KIF\Exception\ParamsException;
  4. use KIF\Verify;
  5. /*
  6. * Sql助手类
  7. * @author gaoxiaogang@yoka.com
  8. */
  9. class SqlHelper {
  10. /**
  11. * 转义数据
  12. * @param mixed $data
  13. * @param boolean $isQuote 字符串值是否用引号引起来。默认不括起来。
  14. * @return mixed
  15. */
  16. static public function escape($data, $isQuote = false) {
  17. if (is_int($data)) {
  18. return strval($data);
  19. } elseif (is_float($data)) {
  20. return strval($data);
  21. } elseif (is_string($data)) {
  22. if ($isQuote) {
  23. # 判断值是否需要 quote 起来
  24. if (self::isWrapperNoQuote($data)) {
  25. return addslashes(self::UnwrapperNoQuote($data));
  26. } else {
  27. return "'" . addslashes($data) . "'";
  28. }
  29. } else {
  30. return addslashes($data);
  31. }
  32. } elseif (is_bool($data)) {
  33. return strval(intval($data));
  34. } elseif (empty($data)) {
  35. if ($isQuote) {
  36. return "''";
  37. } else {
  38. return '';
  39. }
  40. } elseif (is_array($data)) {
  41. foreach ($data as &$val) {
  42. $val = self::escape($val, $isQuote);
  43. }
  44. return $data;
  45. } else {
  46. return false;
  47. }
  48. }
  49. /**
  50. * 判断给定的值是否是有效的自增主键值
  51. * @param mixid $pk
  52. * @return boolean
  53. */
  54. static public function isValidPK($pk) {
  55. # 对开心用户id的处理有大bug,时间上来不及,先通过所有验证
  56. return true;
  57. if (!Verify::unsignedInt($pk)) {
  58. return false;
  59. }
  60. return true;
  61. }
  62. /**
  63. * 判断给定数组的某个key的值,是否是有效的自增主键值
  64. * @param array $arr
  65. * @param mixid $key
  66. * @return boolean
  67. */
  68. static public function isValidPKWithArray(array $arr, $key) {
  69. if (empty($arr)) {
  70. return false;
  71. }
  72. if (!array_key_exists($key, $arr)) {
  73. return false;
  74. }
  75. return self::isValidPK($arr[$key]);
  76. }
  77. /**
  78. *
  79. * 对值 $str 做包装,表示该值不需要 引(quote) 起来
  80. * @param string $str
  81. * @return string
  82. */
  83. static public function wrapperNoQuote($str) {
  84. if (empty($str)) {
  85. return $str;
  86. }
  87. return "NOQUOTE{$str}NOQUOTE";
  88. }
  89. /**
  90. *
  91. * 是否对值 $str 做了不需要 引(quote) 起来的包装
  92. * @param string $str
  93. * @return Boolean
  94. */
  95. static public function isWrapperNoQuote($str) {
  96. if (strpos($str, 'NOQUOTE') !== 0) {
  97. return false;
  98. }
  99. if (strrpos($str, 'NOQUOTE') !== (strlen($str) - strlen('NOQUOTE'))) {
  100. return false;
  101. }
  102. return true;
  103. }
  104. /**
  105. *
  106. * 去除不 引(quote) 起来的包装
  107. * @param string $str
  108. * @return string
  109. */
  110. static public function UnwrapperNoQuote($str) {
  111. return str_replace('NOQUOTE', '', $str);
  112. }
  113. /**
  114. *
  115. * 将sql里的比较操作符添加到 $val里
  116. * DBAbstract::parseCondition 方法,会调用 SqlHelper::explodeCompareOperator 方法来拆解值与比较操作符
  117. * @param string $operator 比较操作符。如: >= 、 < 、!=
  118. * @param scalar $val 标题数据
  119. * @throws ParamsException '参数val必须是标量scalar类型'
  120. * @return string
  121. */
  122. static public function addCompareOperator($operator, $val) {
  123. if (!is_scalar($val)) {
  124. throw new ParamsException("参数val必须是标量scalar类型");
  125. }
  126. $val = "COMPARE{$operator}COMPARE {$val}";
  127. return $val;
  128. }
  129. /**
  130. *
  131. * 拆解 $val 里的 比较操作符 与 数据。
  132. * 如果含比较操作符,则认为比较操作符是 =
  133. * @param string $val
  134. * @return string
  135. */
  136. static public function explodeCompareOperator($val) {
  137. $pattern = '#^(\'?)COMPARE(.+?)COMPARE\s{4}#';
  138. if (!preg_match($pattern, $val, $match)) {
  139. return " = {$val} ";
  140. }
  141. $compareOperator = $match[2];
  142. $val = preg_replace($pattern, '$1', $val);
  143. return " {$compareOperator} {$val} ";
  144. }
  145. }