sqlbuild.init.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. if (!defined('IS_INITPHP')) exit('Access Denied!');
  3. /*********************************************************************************
  4. * InitPHP 3.8.2 国产PHP开发框架 Dao-sqlbuild 数据字段安全封装类
  5. *-------------------------------------------------------------------------------
  6. * 版权所有: CopyRight By initphp.com
  7. * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
  8. *-------------------------------------------------------------------------------
  9. * $Author:zhuli
  10. * $Dtime:2013-5-29
  11. ***********************************************************************************/
  12. require_once("dbhandler.init.php");
  13. class sqlbuildInit extends dbhandlerInit {
  14. /**
  15. * SQL组装-组装INSERT语句
  16. * 返回:('key') VALUES ('value')
  17. * DAO中使用方法:$this->dao->db->build_insert($val)
  18. * @param array $val 参数 array('key' => 'value')
  19. * @return string
  20. */
  21. public function build_insert($val) {
  22. if (!is_array($val) || empty($val)) return '';
  23. $temp_v = '(' . $this->build_implode($val). ')';
  24. $val = array_keys($val);
  25. $temp_k = '(' . $this->build_implode($val, 1). ')';
  26. return $temp_k . ' VALUES ' . $temp_v;
  27. }
  28. /**
  29. * SQL组装-组装多条语句插入
  30. * 返回:('key') VALUES ('value'),('value2')
  31. * DAO中使用方法:$this->dao->db->build_insertmore($field, $data)
  32. * @param array $field 字段
  33. * @param array $data 对应的值,array(array('test1'),array('test2'))
  34. * @return string
  35. */
  36. public function build_insertmore($field, $data) {
  37. $field = ' (' . $this->build_implode($field, 1) . ') '; //字段组装
  38. $temp_data = array();
  39. $data = (array) $data;
  40. foreach ($data as $val) {
  41. $temp_data[] = '(' . $this->build_implode($val) . ')';
  42. }
  43. $temp_data = implode(',', $temp_data);
  44. return $field . ' VALUES ' . $temp_data;
  45. }
  46. /**
  47. * SQL组装-组装UPDATE语句
  48. * 返回:SET name = 'aaaaa'
  49. * DAO中使用方法:$this->dao->db->build_update($val)
  50. * @param array $val array('key' => 'value')
  51. * @return string `key` = 'value'
  52. */
  53. public function build_update($val) {
  54. if (!is_array($val) || empty($val)) return '';
  55. $temp = array();
  56. foreach ($val as $k => $v) {
  57. $temp[] = $this->build_kv($k, $v);
  58. }
  59. return 'SET ' . implode(',', $temp);
  60. }
  61. /**
  62. * SQL组装-组装LIMIT语句
  63. * 返回:LIMIT 0,10
  64. * DAO中使用方法:$this->dao->db->build_limit($start, $num = NULL)
  65. * @param int $start 开始
  66. * @param int $num 条数
  67. * @return string
  68. */
  69. public function build_limit($start, $num = NULL) {
  70. $start = (int) $start;
  71. $start = ($start < 0) ? 0 : $start;
  72. if ($num === NULL) {
  73. return '';
  74. } else {
  75. $num = abs((int) $num);
  76. return 'LIMIT ' . $start .' ,'. $num;
  77. }
  78. }
  79. /**
  80. * SQL组装-组装IN语句
  81. * 返回:('1','2','3')
  82. * DAO中使用方法:$this->dao->db->build_in($val)
  83. * @param array $val 数组值 例如:ID:array(1,2,3)
  84. * @return string
  85. */
  86. public function build_in($val) {
  87. $val = $this->build_implode($val);
  88. return ' IN (' . $val . ')';
  89. }
  90. /**
  91. * SQL组装-组装AND符号的WHERE语句
  92. * 支持复杂类型:例如:$val = array("name" => array("like" => "sdasd"));
  93. * 返回:WHERE a = 'a' AND b = 'b'
  94. * DAO中使用方法:$this->dao->db->build_where($val)
  95. * @param array $val array('key' => 'val')
  96. * @return string
  97. */
  98. public function build_where($val) {
  99. if (!is_array($val) || empty($val)) return '';
  100. $temp = array();
  101. foreach ($val as $k => $v) {
  102. if (is_array($v)) {
  103. $ktmp = $this->build_escape($k, 1);
  104. if (array_keys($v) !== range(0, count($v) - 1)) {
  105. foreach($v as $op => $value) {
  106. $temp[] = $ktmp .' '. $op .' '. $this->build_escape($value);
  107. }
  108. } else {
  109. $temp[] = $ktmp . $this->build_in($v);
  110. }
  111. }else{
  112. $temp[] = $this->build_kv($k, $v);
  113. }
  114. }
  115. return ' WHERE ' . implode(' AND ', $temp);
  116. }
  117. /**
  118. * SQL组装-单个或数组参数过滤
  119. * DAO中使用方法:$this->dao->db->build_escape($val, $iskey = 0)
  120. * @param string|array $val
  121. * @param int $iskey 0-过滤value值,1-过滤字段
  122. * @return string
  123. */
  124. public function build_escape($val, $iskey = 0) {
  125. if (is_array($val)) {
  126. foreach ($val as $k => $v) {
  127. $val[$k] = trim($this->build_escape_single($v, $iskey));
  128. }
  129. return $val;
  130. }
  131. return $this->build_escape_single($val, $iskey);
  132. }
  133. /**
  134. * SQL组装-组装KEY=VALUE形式
  135. * 返回:a = 'a'
  136. * DAO中使用方法:$this->dao->db->build_kv($k, $v)
  137. * @param string $k KEY值
  138. * @param string $v VALUE值
  139. * @return string
  140. */
  141. public function build_kv($k, $v) {
  142. return $this->build_escape($k, 1) . ' = ' . $this->build_escape($v);
  143. }
  144. /**
  145. * SQL组装-将数组值通过,隔开
  146. * 返回:'1','2','3'
  147. * DAO中使用方法:$this->dao->db->build_implode($val, $iskey = 0)
  148. * @param array $val 值
  149. * @param int $iskey 0-过滤value值,1-过滤字段
  150. * @return string
  151. */
  152. public function build_implode($val, $iskey = 0) {
  153. if (!is_array($val) || empty($val)) return '';
  154. return implode(',', $this->build_escape($val, $iskey));
  155. }
  156. /**
  157. * SQL组装-检查DAO中进来的数组参数是否key键存在
  158. * DAO中使用方法:$this->dao->db->build_key($data, $fields)
  159. * @param array $data 例如:array("username" => 'asdasd')
  160. * @param string $fields 例如:"username,password"
  161. */
  162. public function build_key($data, $fields) {
  163. $fields = explode(',', $fields);
  164. $temp = array();
  165. foreach ($data as $key => $value) {
  166. if (in_array($key, $fields)) {
  167. $temp[$key] = $value;
  168. }
  169. }
  170. return $temp;
  171. }
  172. /**
  173. * SQL组装-私有SQL过滤
  174. *
  175. * @param string $val 过滤的值
  176. * @param int $iskey 0-过滤value值,1-过滤字段
  177. * @return string
  178. */
  179. private function build_escape_single($val, $iskey = 0) {
  180. if ($iskey === 0) {
  181. if (is_numeric($val)) {
  182. return " '" . $val . "' ";
  183. } else {
  184. return " '" . addslashes(stripslashes($val)) . "' ";
  185. }
  186. } else {
  187. $val = str_replace(array('`', ' '), '', $val);
  188. return ' `'.addslashes(stripslashes($val)).'` ';
  189. }
  190. }
  191. }