PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/firstrend/src/core/class/db.class.php

http://ownerpress.googlecode.com/
PHP | 438 lines | 243 code | 41 blank | 154 comment | 37 complexity | 7bed42a14f1c2b99f537be6aaefc47dd MD5 | raw file
Possible License(s): Apache-2.0, AGPL-1.0, GPL-2.0, GPL-3.0, LGPL-2.1
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ?????????? (Build on ThinkPHP)
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2011 http://fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. /**
  8. * ?????????
  9. *
  10. * @package class
  11. * @author awfigq <awfigq@qq.com>
  12. */
  13. class FDB
  14. {
  15. /**
  16. * ???????
  17. * @access public
  18. * @param string $dbclass ???????
  19. * @return object
  20. */
  21. public function &object($dbclass = 'FDbMySql')
  22. {
  23. static $db;
  24. if(empty($db))
  25. $db = new $dbclass();
  26. return $db;
  27. }
  28. /**
  29. * ???????????
  30. * @access public
  31. * @param string $table ??
  32. * @return string
  33. */
  34. public function table($table)
  35. {
  36. return FDB::_execute('tableName', $table);
  37. }
  38. /**
  39. * ????
  40. * @access public
  41. * @param string $table ??
  42. * @param mixed $condition ??(??????)
  43. * @param int $limit ?????????0??????????????
  44. * @param bool $unbuffered ? true(??) ???/????
  45. * @return mixed
  46. */
  47. public function delete($table, $condition, $limit = 0, $unbuffered = true)
  48. {
  49. if(empty($condition))
  50. $where = '1';
  51. elseif(is_array($condition))
  52. $where = FDB::implodeFieldValue($condition, ' AND ');
  53. else
  54. $where = $condition;
  55. $sql = "DELETE FROM ".FDB::table($table)." WHERE $where ".($limit ? "LIMIT $limit" : '');
  56. return FDB::query($sql, ($unbuffered ? '' : ''));
  57. }
  58. /**
  59. * ????
  60. * @access public
  61. * @param string $table ??
  62. * @param array $data ??
  63. * @param bool $return_insert_id ???? INSERT ????? ID ???false???
  64. * @param bool $replace ??????? ???false
  65. * @param bool $silent ????? ???flase(??)
  66. * @return mixed
  67. */
  68. public function insert($table, $data, $return_insert_id = false, $replace = false, $silent = false)
  69. {
  70. $sql = FDB::implodeFieldValue($data);
  71. $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
  72. $table = FDB::table($table);
  73. $silent = $silent ? 'SILENT' : '';
  74. $return = FDB::query("$cmd $table SET $sql", $silent);
  75. return $return_insert_id ? FDB::insertId() : $return;
  76. }
  77. /**
  78. * ????
  79. * @access public
  80. * @param string $table ??
  81. * @param array $data ??
  82. * @param mixed $condition ??(??????)
  83. * @param bool $unbuffered ?????/???? ??false(??/???? )
  84. * @param bool $low_priority ???? ???false
  85. * @return mixed
  86. */
  87. function update($table, $data, $condition, $unbuffered = false, $low_priority = false)
  88. {
  89. $sql = FDB::implodeFieldValue($data);
  90. $cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : '');
  91. $table = FDB::table($table);
  92. $where = '';
  93. if(empty($condition))
  94. $where = '1';
  95. elseif(is_array($condition))
  96. $where = FDB::implodeFieldValue($condition, ' AND ');
  97. else
  98. $where = $condition;
  99. $res = FDB::query("$cmd $table SET $sql WHERE $where", $unbuffered ? 'UNBUFFERED' : '');
  100. return $res;
  101. }
  102. /**
  103. * ??????sql??
  104. * @access public
  105. * @param array $array ??
  106. * @param string $glue ???
  107. * @return string
  108. */
  109. public function implodeFieldValue($array, $glue = ',')
  110. {
  111. $sql = $comma = '';
  112. foreach ($array as $k => $v)
  113. {
  114. $sql .= $comma."`$k`='$v'";
  115. $comma = $glue;
  116. }
  117. return $sql;
  118. }
  119. /**
  120. * ?? INSERT ????? ID
  121. * @return mixed
  122. */
  123. public function insertId()
  124. {
  125. return FDB::_execute('insertId');
  126. }
  127. /**
  128. * ???????????????
  129. * @access public
  130. * @param resource $resourceid ???
  131. * @param string $type ???? MYSQL_ASSOC?MYSQL_NUM?MYSQL_BOTH????MYSQL_ASSOC(???????)
  132. * @return array
  133. */
  134. public function fetch($resourceid, $type = MYSQL_ASSOC)
  135. {
  136. return FDB::_execute('fetchArray', $resourceid, $type);
  137. }
  138. /**
  139. * ?????????????
  140. * @access public
  141. * @param string $sql ????
  142. * @return array
  143. */
  144. public function fetchFirst($sql)
  145. {
  146. FDB::checkQuery($sql);
  147. return FDB::_execute('fetchFirst', $sql);
  148. }
  149. /**
  150. * ????????????
  151. * @access public
  152. * @param string $sql ????
  153. * @return array
  154. */
  155. public function fetchAll($sql)
  156. {
  157. FDB::checkQuery($sql);
  158. return FDB::_execute('fetchAll', $sql);
  159. }
  160. /**
  161. * ??????????????
  162. * @access public
  163. * @param resource $resourceid ???
  164. * @param int/string $row ?????????? ???0(?????)
  165. * @return mixed
  166. */
  167. public function result($resourceid, $row = 0)
  168. {
  169. return FDB::_execute('result', $resourceid, $row);
  170. }
  171. /**
  172. * ???????????????
  173. * @access public
  174. * @param string $sql ????
  175. * @return mixed
  176. */
  177. public function resultFirst($sql)
  178. {
  179. FDB::checkQuery($sql);
  180. return FDB::_execute('resultFirst', $sql);
  181. }
  182. /**
  183. * ????
  184. * @access public
  185. * @param string $sql ????
  186. * @param string $type
  187. * @return mixed
  188. */
  189. public function query($sql, $type = '')
  190. {
  191. FDB::checkQuery($sql);
  192. return FDB::_execute('query', $sql, $type);
  193. }
  194. /**
  195. * ???????
  196. * @access public
  197. * @param resource $resourceid ???(?? SELECT ????)
  198. * @return int
  199. */
  200. public function numRows($resourceid)
  201. {
  202. return FDB::_execute('numRows', $resourceid);
  203. }
  204. /**
  205. * ????? MySQL ??????????(INSERT?UPDATE ? DELETE )
  206. * @return int
  207. */
  208. public function affectedRows()
  209. {
  210. return FDB::_execute('affectedRows');
  211. }
  212. /**
  213. * ????????? result ??????
  214. * @return bool
  215. */
  216. public function freeResult($resourceid)
  217. {
  218. return FDB::_execute('freeResult', $resourceid);
  219. }
  220. /**
  221. * ????????: "IN('a','b')";
  222. *
  223. * @access public
  224. * @param mix $item_list ????????
  225. * @param string $field_name ????
  226. * @return string
  227. */
  228. public function createIN($item_list, $field_name = '')
  229. {
  230. if (empty($item_list))
  231. {
  232. return $field_name . " IN ('') ";
  233. }
  234. else
  235. {
  236. if (! is_array($item_list))
  237. {
  238. $item_list = explode(',', $item_list);
  239. }
  240. $item_list = array_unique($item_list);
  241. $item_list_tmp = '';
  242. foreach ($item_list as $item)
  243. {
  244. if ($item !== '')
  245. {
  246. $item_list_tmp .= $item_list_tmp ? ",'$item'" : "'$item'";
  247. }
  248. }
  249. if (empty($item_list_tmp))
  250. {
  251. return $field_name . " IN ('') ";
  252. }
  253. else
  254. {
  255. return $field_name . ' IN (' . $item_list_tmp . ') ';
  256. }
  257. }
  258. }
  259. function error()
  260. {
  261. return FDB::_execute('error');
  262. }
  263. function errno()
  264. {
  265. return FDB::_execute('errno');
  266. }
  267. /**
  268. * ??????
  269. *
  270. * @access private
  271. * @param string $cmd ????
  272. * @param mixed $arg1 ??1
  273. * @param mixed $arg2 ??2
  274. * @return mixed
  275. */
  276. private function _execute($cmd , $arg1 = '', $arg2 = '')
  277. {
  278. static $db;
  279. if(empty($db)) $db = & FDB::object();
  280. $res = $db->$cmd($arg1, $arg2);
  281. return $res;
  282. }
  283. /**
  284. * ????????
  285. *
  286. * @access private
  287. * @param string $sql ????
  288. * @return bool
  289. */
  290. private function checkQuery($sql)
  291. {
  292. static $status = null, $checkcmd = array('SELECT', 'UPDATE', 'INSERT', 'REPLACE', 'DELETE');
  293. global $_FANWE;
  294. if($status === null)
  295. $status = $_FANWE['config']['security']['query']['status'];
  296. if($status)
  297. {
  298. $cmd = trim(strtoupper(substr($sql, 0, strpos($sql, ' '))));
  299. if(in_array($cmd, $checkcmd))
  300. {
  301. $test = FDB::_doQuerySafe($sql);
  302. //if($test < 1)
  303. //FDB::_execute('halt', 'security_error', $sql);
  304. }
  305. }
  306. return true;
  307. }
  308. /**
  309. * ????
  310. *
  311. * @access private
  312. * @param string $sql ????
  313. * @return int
  314. */
  315. private function _doQuerySafe($sql)
  316. {
  317. static $_CONFIG = null;
  318. global $_FANWE;
  319. if($_CONFIG === null)
  320. $_CONFIG = $_FANWE['config']['security']['query'];
  321. $sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);
  322. $mark = $clean = '';
  323. if(strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {
  324. $clean = preg_replace("/'(.+?)'/s", '', $sql);
  325. } else {
  326. $len = strlen($sql);
  327. $mark = $clean = '';
  328. for ($i = 0; $i <$len; $i++) {
  329. $str = $sql[$i];
  330. switch ($str) {
  331. case '\'':
  332. if(!$mark) {
  333. $mark = '\'';
  334. $clean .= $str;
  335. } elseif ($mark == '\'') {
  336. $mark = '';
  337. }
  338. break;
  339. case '/':
  340. if(empty($mark) && $sql[$i+1] == '*') {
  341. $mark = '/*';
  342. $clean .= $mark;
  343. $i++;
  344. } elseif($mark == '/*' && $sql[$i -1] == '*') {
  345. $mark = '';
  346. $clean .= '*';
  347. }
  348. break;
  349. case '#':
  350. if(empty($mark)) {
  351. $mark = $str;
  352. $clean .= $str;
  353. }
  354. break;
  355. case "\n":
  356. if($mark == '#' || $mark == '--') {
  357. $mark = '';
  358. }
  359. break;
  360. case '-':
  361. if(empty($mark)&& substr($sql, $i, 3) == '-- ') {
  362. $mark = '-- ';
  363. $clean .= $mark;
  364. }
  365. break;
  366. default:
  367. break;
  368. }
  369. $clean .= $mark ? '' : $str;
  370. }
  371. }
  372. $clean = preg_replace("/[^a-z0-9_\-\(\)#\*\/\"]+/is", "", strtolower($clean));
  373. if($_CONFIG['fullnote']) {
  374. $clean = str_replace('/**/','',$clean);
  375. }
  376. /*if(is_array($_CONFIG['function'])) {
  377. foreach($_CONFIG['function'] as $fun) {
  378. if(strpos($clean, $fun.'(') !== false) return '-1';
  379. }
  380. }*/
  381. if(is_array($_CONFIG['action'])) {
  382. foreach($_CONFIG['action'] as $action) {
  383. if(strpos($clean,$action) !== false) return '-3';
  384. }
  385. }
  386. if($_CONFIG['likehex'] && strpos($clean, 'like0x')) {
  387. return '-2';
  388. }
  389. if(is_array($_CONFIG['note'])) {
  390. foreach($_CONFIG['note'] as $note) {
  391. if(strpos($clean,$note) !== false) return '-4';
  392. }
  393. }
  394. return 1;
  395. }
  396. }
  397. ?>