php连接mysql数据库mysql.class.php

本文章是一款比较实例的php 连接mysql数据库的连接类,比起一般的php mysql数据库函数要实用方法了很多,操作维护起来也很简单,只要处理这一个文伯就KO了,实例类代码如下:

  1. /*
  2. ​+-----------------------------------------------------------------------
  3. | 文件概要:php连接mysql数据库
  4. | 文件名称:mysql.class.php
  5. | 创建时间:2010-9-7
  6. +-----------------------------------------------------------------------
  7. */
  8. class mysql {
  9. private $server; //服务器名
  10. private $user; //数据库用户名
  11. private $password; //数据库密码
  12. private $database; //数据库名
  13. private $link; //mysql连接标识符
  14. private $charset = "utf8"; //数据库编码,默认为utf8
  15. /*=====================================================
  16. * 方法:__construct
  17. * 功能:构造函数
  18. * 参数:$server,$user,$password,$database,$charset
  19. * 说明:实例化时自动连接数据库.
  20. ====================================================*/
  21. function __construct($server, $user, $password, $database, $charset) {
  22. $this->server = $server;
  23. $this->user = $user;
  24. $this->password = $password;
  25. $this->database = $database;
  26. $this->charset = $charset;
  27. $this->connect();
  28. }
  29. /*====================================================
  30. * 方法:connect
  31. * 功能:连接数据库
  32. * 参数:无
  33. * 说明:连接mysql服务器,连接数据库,设置字符编码
  34. ===================================================*/
  35. function connect() {
  36. $this->link = mysql_connect($this->server, $this->user, $this->password) or die($this->error("数据库服务器连接出错!"));
  37. mysql_select_db($this->database, $this->link) or die($this->error("数据库连接出错!"));
  38. mysql_query("set names '$this->charset'");
  39. }
  40. /*===================================================
  41. * 方法:query
  42. * 功能:执行sql
  43. * 参数:$sql
  44. * 说明:对传过来的sql语句执行,并返回结果$result资源标识符
  45. ==================================================*/
  46. function query($sql) {
  47. $result = mysql_query($sql, $this->link);
  48. if (!$result) {
  49. $this->error($sql . "语句执行失败!");
  50. return false;
  51. } else {
  52. return $result;
  53. }
  54. }
  55. /*===================================================
  56. * 方法:fetcharray
  57. * 功能:从结果集中取一行做为数组
  58. * 参数:$result资源标识符
  59. * 说明:需要提供sql语句执行返回的资源标识符
  60. ==================================================*/
  61. function fetcharray($result) {
  62. return mysql_fetch_array($result);
  63. }
  64. /*===================================================
  65. * 方法:fetchall
  66. * 功能:从结果集中取出所有记录做为二维数组$arr
  67. * 参数:$result资源标识符
  68. * 说明:循环取所有记录保存为$arr
  69. ==================================================*/
  70. function fetchall($result) {
  71. $arr[] = array ();
  72. while ($row = mysql_fetch_array($result)) {
  73. $arr[] = $row;
  74. }
  75. mysql_free_result($result);
  76. return $arr;
  77. }
  78. /*===================================================
  79. * 方法:numrows
  80. * 功能:统计结果集中记录数
  81. * 参数:$result资源标识符
  82. * 说明:统计行数
  83. ==================================================*/
  84. function numrows($result) {
  85. return mysql_num_rows($result);
  86. }
  87. /*===================================================
  88. * 方法:numfields
  89. * 功能:统计结果集中字段数
  90. * 参数:$result资源标识符
  91. * 说明:统计字段数
  92. ==================================================*/
  93. function numfields($result) {
  94. return mysql_num_fields($result);
  95. }
  96. /*===================================================
  97. * 方法:affectedrows
  98. * 功能:取得前一次mysql操作所影响的记录行数
  99. * 参数:无
  100. * 说明:取得前一次mysql操作所影响的记录行数
  101. ==================================================*/
  102. function affectedrows() {
  103. return mysql_affected_rows($this->link);
  104. }
  105. /*===================================================
  106. * 方法:version
  107. * 功能:取得mysql版本
  108. * 参数:无
  109. * 说明:取得当前数据库服务器mysql的版本
  110. ==================================================*/
  111. function version() {
  112. return mysql_get_server_info();
  113. }
  114. /*===================================================
  115. * 方法:insertid
  116. * 功能:取得上一步insert操作产生的id
  117. * 参数:无
  118. * 说明:取得上一步insert操作产生的自增字段id
  119. ==================================================*/
  120. function insertid() {
  121. return mysql_insert_id($this->link);
  122. }
  123. /*===================================================
  124. * 方法:checksql
  125. * 功能:检查sql语句
  126. * 参数:sql语句
  127. * 说明:关闭非永久数据库连接
  128. ==================================================*/
  129. function checksql($db_string, $querytype = 'select') {
  130. $clean = '';
  131. $old_pos = 0;
  132. $pos = - 1;
  133. //如果是普通查询语句,直接过滤一些特殊语法
  134. if ($querytype == 'select') {
  135. $notallow1 = "[^0-9a-z@._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@.-]{1,}";
  136. //$notallow2 = "--|/*";
  137. if (eregi ( $notallow1, $db_string )) {
  138. exit ( "<font size='5' color='red'>safe alert: request error step 1 !</font>" );
  139. }
  140. }
  141. //完整的sql检查
  142. while ( true ) {
  143. $pos = strpos ( $db_string, ''', $pos + 1 );
  144. if ($pos === false) {
  145. break;
  146. }
  147. $clean .= substr ( $db_string, $old_pos, $pos - $old_pos );
  148. while ( true ) {
  149. $pos1 = strpos ( $db_string, ''', $pos + 1 );
  150. $pos2 = strpos ( $db_string, '', $pos + 1 );
  151. if ($pos1 === false) {
  152. break;
  153. } elseif ($pos2 == false || $pos2 > $pos1) {
  154. $pos = $pos1;
  155. break;
  156. }
  157. $pos = $pos2 + 1;
  158. }
  159. $clean .= '$s$';
  160. $old_pos = $pos + 1;
  161. }
  162. $clean .= substr ( $db_string, $old_pos );
  163. $clean = trim ( strtolower ( preg_replace ( array ('~s+~s' ), array (' ' ), $clean ) ) );
  164. //老版本的mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它
  165. if (strpos ( $clean, 'union' ) !== false && preg_match ( '~(^|[^a-z])union($|[^[a-z])~s', $clean ) != 0) {
  166. $fail = true;
  167. }
  168. //发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们
  169. elseif (strpos ( $clean, '/*' ) > 2 || strpos ( $clean, '--' ) !== false || strpos ( $clean, '#' ) !== false) {
  170. $fail = true;
  171. }
  172. //这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
  173. elseif (strpos ( $clean, 'sleep' ) !== false && preg_match ( '~(^|[^a-z])sleep($|[^[a-z])~s', $clean ) != 0) {
  174. $fail = true;
  175. } elseif (strpos ( $clean, 'benchmark' ) !== false && preg_match ( '~(^|[^a-z])benchmark($|[^[a-z])~s', $clean ) != 0) {
  176. $fail = true;
  177. } elseif (strpos ( $clean, 'load_file' ) !== false && preg_match ( '~(^|[^a-z])load_file($|[^[a-z])~s', $clean ) != 0) {
  178. $fail = true;
  179. } elseif (strpos ( $clean, 'into outfile' ) !== false && preg_match ( '~(^|[^a-z])intos+outfile($|[^[a-z])~s', $clean ) != 0) {
  180. $fail = true;
  181. }
  182. //老版本的mysql不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
  183. elseif (preg_match ( '~([^)]*?select~s', $clean ) != 0) {
  184. $fail = true;
  185. }
  186. if (! emptyempty ( $fail )) {
  187. exit ( "<font size='5' color='red'>safe alert: request error step 2!</font>" );
  188. } else {
  189. return $db_string;
  190. }
  191. }
  192. /*===================================================
  193. * 方法:close
  194. * 功能:关闭连接
  195. * 参数:无
  196. * 说明:关闭非永久数据库连接
  197. ==================================================*/
  198. function close() {
  199. mysql_close($this->link);
  200. }
  201. /*===================================================
  202. * 方法:error
  203. * 功能:提示错误
  204. * 参数:$err_msg
  205. * 说明:对给出的错误提示内容给予echo
  206. ==================================================*/
  207. function error($err_msg = "") {
  208. if ($err_msg == "") {
  209. echo "errno:" . mysql_errno . "</br>";
  210. echo "error:" . mysql_error . "</br>";
  211. } else {
  212. echo $err_msg;
  213. }
  214. }
  215. /*===================================================
  216. * 方法:__destruct
  217. * 功能:析构函数
  218. * 参数:无
  219. * 说明:释放类,关闭连接
  220. ==================================================*/
  221. function __destruct() {
  222. $this->close();
  223. }
  224. }
  225. //数据库连接函数
  226. function conn_db(){
  227. $link_db=new mysql(web_server,web_user,web_pwd,web_db,"utf8");//开源代码phpfensi.com
  228. return $link_db;
  229. }