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

/php/mysql_performance/db.class.php

http://timoseven.googlecode.com/
PHP | 416 lines | 279 code | 13 blank | 124 comment | 64 complexity | a7fa10c34194b36342f817e5979b05c6 MD5 | raw file
Possible License(s): MIT, LGPL-2.1, MPL-2.0-no-copyleft-exception, GPL-3.0, AGPL-1.0
  1. <?php
  2. /**
  3. * phpmysql??????@oswind.com
  4. * ??????????
  5. * @version 0.1
  6. * @author ????? sunli1223ATgmail.com
  7. * @copyright (c) 2007 http://oswind.com All rights reserved.
  8. */
  9. function C(){
  10. return false;
  11. }
  12. class BaseDb {
  13. private $upwd = '';
  14. private $uname = 'root';
  15. private $host = 'localhost';
  16. private $dbname = 'v';
  17. private $pconnect = 0;
  18. private $isConnected = false;
  19. private $querynum = 0;
  20. private $conn;
  21. private $charset;
  22. private $msg = array ();
  23. private $errnum = 0;
  24. private $sql = "";
  25. public function __construct($host, $uname, $upwd, $dbname, $pconnect = 0, $encoding = "utf8") {
  26. $this->host = $host;
  27. $this->uname = $uname;
  28. $this->upwd = $upwd;
  29. $this->dbname = $dbname;
  30. $this->pconnect = $pconnect;
  31. $this->charset = $encoding;
  32. $this->connection ();
  33. }
  34. /**
  35. * ????????
  36. *
  37. */
  38. private function connection() {
  39. $this->pconnect == 0 ? $this->isConnected = mysql_connect ( $this->host, $this->uname, $this->upwd ) : $this->isConnected = mysql_pconnect ( $this->host, $this->uname, $this->upwd );
  40. mysql_errno () != 0 && $this->halt ( "Connect($pconnect) to MySQL failed" );
  41. mysql_query ( "SET character_set_connection=" . $this->charset . ", character_set_results=" . $this->charset . ", character_set_client=binary" );
  42. mysql_query ( "SET NAMES " . $this->charset );
  43. if ($this->dbname) {
  44. $this->select_db ( $this->dbname );
  45. }
  46. }
  47. /**
  48. * ?????
  49. *
  50. * @param String $dbname ????
  51. */
  52. public function select_db($dbname) {
  53. if (! @mysql_select_db ( $dbname )) {
  54. $this->halt ( 'Cannot use database' );
  55. }
  56. }
  57. /**
  58. * ????????
  59. *
  60. * @return string ???????
  61. */
  62. public function server_info() {
  63. return mysql_get_server_info ();
  64. }
  65. /**
  66. * ?????
  67. *
  68. * @param string $sql
  69. * @param string $method
  70. * @return resource
  71. */
  72. public function query($sql, $method = '') {
  73. $this->sql = $sql;
  74. $this->debug ( $sql );
  75. if ($method == 'U_B' && function_exists ( 'mysql_unbuffered_query' )) {
  76. $query = mysql_unbuffered_query ( $sql );
  77. } else {
  78. $query = mysql_query ( $sql );
  79. }
  80. $this->querynum ++;
  81. if (! $query)
  82. $this->halt ( 'Query Error: ' . $sql );
  83. return $query;
  84. }
  85. /**
  86. * Enter description here...
  87. *
  88. * @param unknown_type $sql
  89. * @return unknown
  90. */
  91. public function get_one($sql) {
  92. $query = $this->query ( $sql, 'U_B' );
  93. $rs = & mysql_fetch_array ( $query, MYSQL_ASSOC );
  94. return $rs;
  95. }
  96. /**
  97. * ??????
  98. *
  99. * @param string $sql
  100. * @param int $lp
  101. * @return bool
  102. */
  103. public function updateBySql($sql, $lp = 1) {
  104. $this->sql = $sql;
  105. $this->debug ( $sql );
  106. if (function_exists ( 'mysql_unbuffered_query' )) {
  107. $query = mysql_unbuffered_query ( $sql );
  108. } else {
  109. $query = mysql_query ( $sql );
  110. }
  111. $this->query_num ++;
  112. if (! $query) {
  113. $this->halt ( 'Update Error: ' . $sql );
  114. $this->errnum ++;
  115. }
  116. return $query;
  117. }
  118. /**
  119. * ?????
  120. *
  121. * @param string $table
  122. * @return bool
  123. */
  124. public function deleteTable($table) {
  125. return $this->updateBySql ( "DROP TABLE $table" );
  126. }
  127. public function get_array($result, $result_type = MYSQL_ASSOC) {
  128. return mysql_fetch_array ( $result, $result_type );
  129. }
  130. /**
  131. * ????? INSERT ????? ID
  132. * ?????????? AUTO_INCREMENT ???
  133. * ? mysql_insert_id() ?? 0??????????????
  134. * ????????????????? lastid()?
  135. *
  136. * @return int
  137. */
  138. public function lastid() {
  139. return mysql_insert_id ();
  140. }
  141. public function close() {
  142. return mysql_close ();
  143. }
  144. public function affected_rows() {
  145. return mysql_affected_rows ();
  146. }
  147. function free_result($query) {
  148. return mysql_free_result ( $query );
  149. }
  150. function insert_id() {
  151. $id = mysql_insert_id ();
  152. return $id;
  153. }
  154. public function halt($msg) {
  155. array_push ( $this->msg, $msg );
  156. $this->errnum ++;
  157. if (C ( "showdberr" ) == true) {
  158. echo "<pre>$msg</pre>";
  159. echo '<pre>' . mysql_errno () . ' : ' . mysql_error () . '</pre>';
  160. ;
  161. }
  162. }
  163. /**
  164. * ????????0
  165. *
  166. */
  167. public function ini_errnum() {
  168. $this->errnum = 0;
  169. }
  170. public function get_errnum() {
  171. return $this->errnum;
  172. }
  173. public function get_msg() {
  174. return $this->msg;
  175. }
  176. public function get_querynum() {
  177. return $this->querynum;
  178. }
  179. public function get_host() {
  180. return $this->host;
  181. }
  182. /**
  183. * ???????sql??
  184. *
  185. * @return string sql??
  186. */
  187. public function getSql() {
  188. return $this->sql;
  189. }
  190. public function timestamp() {
  191. date_default_timezone_set ( "prc" );
  192. return date ( "Y-m-d H:i:s" );
  193. }
  194. public function debug($str) {
  195. if (C ( "DEBUG" ) == true) {
  196. $str = str_replace ( " FROM", " \r\n\tFROM", $str );
  197. echo '<pre>' . $str . '</pre>';
  198. }
  199. }
  200. }
  201. /**
  202. * ????
  203. *
  204. */
  205. class Db extends BaseDb {
  206. public function beginTtransaction() {
  207. $this->ini_errnum (); //???????0
  208. $this->query ( "SET AUTOCOMMIT=0" ); //????????
  209. $this->query ( "START TRANSACTION" ); //????
  210. }
  211. /**
  212. * ????
  213. *
  214. */
  215. public function rollback() {
  216. $this->query ( "ROLLBACK" );
  217. $this->query ( "SET AUTOCOMMIT=1" ); //?????????
  218. }
  219. public function endTtransaction() {
  220. if ($this->get_errnum () > 0) {
  221. $this->rollback ();
  222. return false;
  223. } else {
  224. $this->query ( "COMMIT" ); //????
  225. $this->query ( "SET AUTOCOMMIT=1" ); //?????????
  226. return true;
  227. }
  228. }
  229. /**
  230. * ?????
  231. *
  232. * @param string $table ???
  233. * @param array $array ?????????????key=>value???
  234. */
  235. public function insert($table, $array) {
  236. $field = "";
  237. $values = "";
  238. foreach ( $array as $key => $value ) {
  239. $field .= "`" . $key . "`,";
  240. $values .= "'" . $value . "',";
  241. }
  242. $field = trim ( $field, "," );
  243. $values = trim ( $values, "," );
  244. $sql = "INSERT INTO " . $table . " (" . $field . ")VALUES (" . $values . ")";
  245. return $this->updateBySql ( $sql );
  246. }
  247. /**
  248. * ??????
  249. *
  250. * @param string $table ??
  251. * @param array $array ????
  252. * @example <code>
  253. * $data[0]['id']=1;
  254. * $data[0]['uname']='tom';
  255. * $data[1]['id']=2;
  256. * $data[2]['uname']='jack';
  257. * </code>
  258. * @return int
  259. */
  260. public function insertMutiRow($table, $arraydata) {
  261. $field = "";
  262. $valueSql = "";
  263. for($i = 0, $len = count ( $arraydata ); $i < $len; $i ++) {
  264. $values = "";
  265. $array = $arraydata [$i];
  266. foreach ( $array as $key => $value ) {
  267. if ($i == 0) {
  268. $field .= "`" . $key . "`,";
  269. }
  270. $values .= "'" . $value . "',";
  271. }
  272. if ($i == 0) {
  273. $field = trim ( $field, "," );
  274. }
  275. $values = trim ( $values, "," );
  276. $valueSql .= "(" . $values . "),";
  277. }
  278. $valueSql = trim ( $valueSql, "," );
  279. $sql = "INSERT INTO " . $table . " (" . $field . ")VALUES $valueSql";
  280. return $this->updateBySql ( $sql );
  281. }
  282. /**
  283. * ??????update("table",array("name"=>"oswind"),array("id")=>6);
  284. * update("table",array("name"=>"oswind"), "id=6 or id=4");update("table",level=level+1, "id=6 or id=4");
  285. * <code>
  286. *
  287. * </code>
  288. * @param string $table ?????
  289. * @param Mixed $array ?????????????key=>value???????sql????????,????set a=a+1??????????
  290. * @param Mixed $where ????????????????key=>value???????sql????????(id=5 or uid=6)
  291. * @return bool ????true, ????false
  292. */
  293. public function update($table, $array, $where) {
  294. $str = "";
  295. $w = "";
  296. if (is_array ( $array )) {
  297. $str = $this->listArray ( $array, "," );
  298. } else {
  299. $str = $array;
  300. }
  301. if (is_array ( $where )) {
  302. $w = $this->listArray ( $where, "AND" );
  303. } else {
  304. $w = $where;
  305. }
  306. unset ( $array, $where );
  307. $sql = "UPDATE `" . $table . "` SET " . $str . " WHERE " . $w;
  308. return $this->updateBySql ( $sql );
  309. }
  310. /**
  311. * ??sql??????????????????????????$p?$pagesize????sql???????
  312. *
  313. * @param string $sql ????
  314. * @param int $p [??????] ???null
  315. * @param int $pagesize [???????]????null
  316. * @return array
  317. */
  318. public function find($sql, $p = null, $pagesize = null) {
  319. if (is_numeric ( $p ) && is_numeric ( $pagesize )) {
  320. $p < 1 && $p = 1;
  321. $pagesize < 1 && $pagesize = 10;
  322. $offset = $pagesize * ($p - 1);
  323. $sql .= " LIMIT $offset,$pagesize";
  324. }
  325. $result = $this->query ( $sql );
  326. while ( $rs = $this->get_array ( $result ) ) {
  327. $list [] = $rs;
  328. }
  329. return $list;
  330. }
  331. /**
  332. * ??????????????AND???????????????????????where??
  333. *
  334. * @param string $table ?????
  335. * @param Mixed $where ???????????
  336. * @return bool
  337. */
  338. public function delete($table, $where) {
  339. if (is_array ( $where )) {
  340. $w = $this->listArray ( $where, "AND" );
  341. } else {
  342. $w = $where;
  343. }
  344. $sql = "DELETE FROM $table WHERE $w";
  345. return $this->updateBySql ( $sql );
  346. }
  347. public function splitpage($pagesize, $num, $query, $p) {
  348. $pagestr = "";
  349. ! $p && $p = 1;
  350. $page = ceil ( $num / $pagesize ); //????
  351. if ($page < 10) {
  352. $pagestr .= "<a href=\"" . $query . "\">[??]</a>&nbsp;";
  353. ($p > 1) && $pagestr .= "<a href=\"" . $query . "&p=" . ($p - 1) . "\">[???]</a>&nbsp;";
  354. for($i = 1; $i <= $page; $i ++) {
  355. $i == $p ? $pagestr .= "[" . $i . "]&nbsp;" : $pagestr .= "<a href=\"" . $query . "&p=" . $i . "\">[" . $i . "]</a>&nbsp;";
  356. }
  357. $p < $page && $pagestr .= "<a href=\"" . $query . "&p=" . ($p + 1) . "\">[???]</a>&nbsp;";
  358. } else if ($page > 10) {
  359. $t = ceil ( $p / 10 );
  360. ($mini = ($t - 1) * 10) == 0 && $mini = 1; //???????$p
  361. ($max = $t * 10) > $page && $max = $page; //??
  362. $pagestr .= "<a href=\"" . $query . "&p=1\">[??]</a>&nbsp;";
  363. $p > 1 && $pagestr .= "<a href=\"" . $query . "&p=" . ($p - 1) . "\">[???]</a>&nbsp;";
  364. for($i = $mini; $i <= $max; $i ++) {
  365. $i == $p ? $pagestr .= "[" . $i . "]&nbsp;" : $pagestr .= "<a href=\"" . $query . "&p=" . $i . "\">[" . $i . "]</a>&nbsp;";
  366. }
  367. $p < $page && $pagestr .= "<a href=\"" . $query . "&p=" . ($p + 1) . "\">[???]</a>&nbsp;";
  368. $pagestr .= "<a href=\"" . $query . "&p=" . $page . "\">[??]</a>";
  369. }
  370. return $pagestr;
  371. }
  372. /**
  373. * ???key,value?????????????????????????sql??
  374. *
  375. * @param array $array
  376. * @param string $mark ????
  377. * @return string
  378. */
  379. public function listArray($array, $mark, $table = null) {
  380. $w = "";
  381. foreach ( $array as $key => $value ) {
  382. if (! $value)
  383. continue;
  384. $ty = gettype ( $value );
  385. if ($ty == 'integer' || $ty == 'boolean' || $ty == 'double') {
  386. if ($table != null) {
  387. $w .= "$table.`" . $key . "`=" . $value . " $mark";
  388. } else {
  389. $w .= "`" . $key . "`=" . $value . " $mark";
  390. }
  391. } else {
  392. if ($table != null) {
  393. $w .= "$table.`" . $key . "`='" . $value . "' $mark";
  394. } else {
  395. $w .= "`" . $key . "`='" . $value . "' $mark";
  396. }
  397. }
  398. }
  399. $w = trim ( $w, " $mark" );
  400. return $w;
  401. }
  402. }
  403. ?>