• 青云网帮助电脑爱好者在各自领域取得成功!QQ群:77719397
  • 友情链接,合作,联盟
雨佳商城
    
首页 > 技术专栏 > 数据库 >

操作mysql数据库的类 class Mysql

www.qy5566.cn    来源:未知    作者:admin    时间:2009-06-22 21:10    点击:
       核心提示:这是一个很经典的类,请大家先不要头晕哦,仔细阅读 代码 ,你可以学到很多! ?php if (!defined( 'AHINC' )){ exit ( RequestError! ); } /** 操作mysql数据库的类 Author:Silence Creatdate:2009-5-30 LastModif

这是一个很经典的类,请大家先不要头晕哦,仔细阅读代码,你可以学到很多!

 

  1. <?php  
  2. if (! defined ( 'AHINC' )) {  
  3. exit ( "Request Error!" );  
  4. }  
  5. /**  
  6. 操作mysql数据库的类  
  7.     Author:Silence  
  8.     Creatdate:2009-5-30  
  9.     LastModify:2009-5-31  
  10. */ 
  11. class Mysql {  
  12. private $server = "";  
  13. private $user = "";  
  14. private $password = "";  
  15. private $database = "";  
  16. private $linkMode = 1;  
  17. private $link_id = 0;  
  18. private $query_id = 0;  
  19. private $query_times = 0;  
  20. private $result = array ();  
  21. private $fetchMode = MYSQL_ASSOC;  
  22. private $err_no = 0;  
  23. private $err_msg;  
  24. private $character;  
  25. //======================================  
  26. // 函数: mysql()  
  27. // 功能: 构造函数  
  28. // 参数: 参数类的变量定义  
  29. // 说明: 构造函数将自动连接数据库  
  30. // 如果想手动连接去掉自动连接函数  
  31. //======================================  
  32. public function __construct($server$user$password$database$character = "UTF8"$linkMode = 0) {  
  33.   if (emptyempty ( $server ) || emptyempty ( $user ) || emptyempty ( $database ))  
  34.    $this->halt ( "提交的数据库信息不完整!请检查服务器地址,用户和数据库是否正确有效" );  
  35.     
  36.   $this->server = $server;  
  37.   $this->user = $user;  
  38.   $this->password = $password;  
  39.   $this->database = $database;  
  40.   $this->linkMode = $linkMode;  
  41.   $this->character = $character;  
  42.   $this->connect ();  
  43. }  
  44. //======================================  
  45. // 函数: connect($server,$user,$password,$database)  
  46. // 功能: 连接数据库  
  47. // 参数: $server 主机名, $user 用户名  
  48. // 参数: $password 密码, $database 数据库名称  
  49. // 返回: 0:失败  
  50. // 说明: 默认使用类中变量的初始值  
  51. //======================================  
  52. public function connect($server = ""$user = ""$password = ""$database = "") {  
  53.   $server = $server ? $server : $this->server;  
  54.   $user = $user ? $user : $this->user;  
  55.   $password = $password ? $password : $this->password;  
  56.   $database = $database ? $database : $this->database;  
  57.     
  58.   $this->link_id = $this->linkMode ? mysql_pconnect ( $server$user$password$database ) : mysql_connect ( $server$user$password$database );  
  59.     
  60.   if (! $this->link_id) {  
  61.    $this->halt ( "数据库连接失败!请检查各项参数!" );  
  62.    return 0;  
  63.   }  
  64.     
  65.   if (! mysql_select_db ( $database$this->link_id )) {  
  66.    $this->halt ( "无法选择数据库" );  
  67.    return 0;  
  68.   }  
  69.     
  70.   if ($this->character != "GBK" && $this->character != "UTF8") {  
  71.    $this->halt ( "输入的编码模式不正确!" );  
  72.    return 0;  
  73.   }  
  74.     
  75.   $this->query ( 'SET NAMES ' . $this->character );  
  76.   return $this->link_id;  
  77. }  
  78. //======================================  
  79. // 函数: query($sql)  
  80. // 功能: 数据查询  
  81. // 参数: $sql 要查询的SQL语句  
  82. // 返回: 0:失败  
  83. //======================================  
  84. public function query($sql) {  
  85.   $this->query_times ++;  
  86.   $this->query_id = mysql_query ( $sql$this->link_id );  
  87.   if (! $this->query_id) {  
  88.    $this->halt ( "<font color=red>" . $sql . "</font> 语句执行不成功!" );  
  89.    return 0;  
  90.   }  
  91.     
  92.   return $this->query_id;  
  93. }  
  94. //======================================  
  95. // 函数: setFetchMode($mode)  
  96. // 功能: 设置取得记录的模式  
  97. // 参数: $mode 模式 MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH  
  98. // 返回: 0:失败  
  99. //======================================  
  100. public function setFetchMode($mode) {  
  101.   if ($mode == MYSQL_ASSOC || $mode == MYSQL_NUM || $mode == MYSQL_BOTH) {  
  102.    $this->fetchMode = $mode;  
  103.    return 1;  
  104.   } else {  
  105.    $this->halt ( "错误的模式." );  
  106.    return 0;  
  107.   }  
  108. }  
  109. //======================================  
  110. // 函数: fetchRow()  
  111. // 功能: 从记录集中取出一条记录  
  112. // 返回: 0: 出错 record: 一条记录  
  113. //======================================  
  114. public function fetchRow() {  
  115.   $this->record = mysql_fetch_array ( $this->query_id, $this->fetchMode );  
  116.     
  117.   return $this->record;  
  118. }  
  119. //======================================  
  120. // 函数: fetchAll()  
  121. // 功能: 从记录集中取出所有记录  
  122. // 返回: 记录集数组  
  123. //======================================  
  124. public function fetchAll() {  
  125.   $arr [] = array ();  
  126.     
  127.   while ( $this->record = mysql_fetch_array ( $this->query_id, $this->fetchMode ) )  
  128.    $arr [] = $this->record;  
  129.     
  130.   mysql_free_result ( $this->query_id );  
  131.   return $arr;  
  132. }  
  133. //======================================  
  134. // 函数: getValue()  
  135. // 功能: 返回记录中指定字段的数据  
  136. // 参数: $field 字段名或字段索引  
  137. // 返回: 指定字段的值  
  138. //======================================  
  139. public function getValue($filed) {  
  140.   return $this->record [$filed];  
  141. }  
  142. //======================================  
  143. // 函数: getquery_id()  
  144. // 功能: 返回查询号  
  145. //======================================      
  146. public function getQuery_id() {  
  147.   return $this->query_id;  
  148. }  
  149. //======================================  
  150. // 函数: affectedRows()  
  151. // 功能: 返回影响的记录数  
  152. //======================================      
  153. public function affectedRows() {  
  154.   return mysql_affected_rows ( $this->link_id );  
  155. }  
  156. //======================================  
  157. // 函数: recordCount()  
  158. // 功能: 返回查询记录的总数  
  159. // 参数: 无  
  160. // 返回: 记录总数  
  161. //======================================      
  162. public function recordCount() {  
  163.   return mysql_num_rows ( $this->query_id );  
  164. }  
  165. //======================================  
  166. // 函数: getquery_times()  
  167. // 功能: 返回查询的次数  
  168. // 参数: 无  
  169. // 返回: 查询的次数  
  170. //======================================      
  171. public function getquery_times() {  
  172.   return $this->query_times;  
  173. }  
  174. //======================================  
  175. // 函数: getVersion()  
  176. // 功能: 返回mysql的版本  
  177. // 参数: 无  
  178. //======================================      
  179. public function getVersion() {  
  180.   $this->query ( "select version() as ver" );  
  181.   $this->fetchRow ();  
  182.   return $this->getValue ( "ver" );  
  183. }  
  184. //======================================  
  185. // 函数: getDBSize($database, $tblPrefix=null)  
  186. // 功能: 返回数据库占用空间大小  
  187. // 参数: $database 数据库名  
  188. // 参数: $tblPrefix 表的前缀,可选  
  189. //======================================      
  190. public function getDBSize($database$tblPrefix = null) {  
  191.   $sql = "SHOW TABLE STATUS FROM " . $database;  
  192.   if ($tblPrefix != null) {  
  193.    $sql .= " LIKE '$tblPrefix%'";  
  194.   }  
  195.   $this->query ( $sql );  
  196.   $size = 0;  
  197.   while ( $this->fetchRow () )  
  198.    $size += $this->getValue ( "Data_length" ) + $this->getValue ( "Index_length" );  
  199.   return $size;  
  200. }  
  201. //======================================   
  202. // 函数: halt($err_msg)  
  203. // 功能: 处理所有出错信息  
  204. // 参数: $err_msg 自定义的出错信息  
  205. //=====================================      
  206. public function halt($err_msg = "") {  
  207.   if ($err_msg == "") {  
  208.    $this->errno = mysql_errno ();  
  209.    $this->error = mysql_error ();  
  210.    echo "<b>mysql error:<b><br>";  
  211.    echo $this->errno . ":" . $this->error . "<br>";  
  212.    exit ();  
  213.   } else {  
  214.    echo "<b>mysql error:<b><br>";  
  215.    echo $err_msg . "<br>";  
  216.    exit ();  
  217.   }  
  218. }  
  219. //======================================  
  220. // 函数: insertID()  
  221. // 功能: 返回最后一次插入的自增ID  
  222. // 参数: 无  
  223. //======================================      
  224. public function insertID() {  
  225.   return mysql_insert_id ();  
  226. }  
  227. //======================================  
  228. //函数:close()  
  229. //功能:关闭非永久的数据库连接  
  230. //参数:无  
  231. //======================================  
  232. public function close() {  
  233.   $link_id = $link_id ? $link_id : $this->link_id;  
  234.   mysql_close ( $link_id );  
  235. }  
  236. //======================================  
  237. // 函数: sqlSelect()  
  238. // 功能: 返回组合的select查询值  
  239. // 参数: $tbname 查询的表名  
  240. // 参数: $where 条件  
  241. // 参数: $fields 字段值   
  242. // 参数: $orderby 按某字段排序   
  243. // 参数: $sort 正序ASC,倒序DESC,$orderby 不为空是有效   
  244. // 参数: $limit 取得记录的条数,0,8  
  245. // 返回: 查询语句  
  246. //======================================   
  247. function sqlSelect($tbname$where = ""$limit = 0, $fields = "*"$orderby = ""$sort = "DESC") {  
  248.   $sql = "SELECT " . $fields . " FROM " . $tbname . ($where ? " WHERE " . $where : "") . ($orderby ? " ORDER BY " . $orderby . " " . $sort : "") . ($limit ? " limit " . $limit : "");  
  249.   return $sql;  
  250. }  
  251. //======================================  
  252. // 函数: sqlInsert()  
  253. // 功能: Insert插入数据函数  
  254. // 参数: $taname 要插入数据的表名  
  255. // 参数: $row 要插入的内容 (数组)  
  256. // 返回: 记录总数  
  257. // 返回: 插入语句   
  258. //======================================   
  259. function sqlInsert($tbname$row) {  
  260.   foreach ( $row as $key => $value ) {  
  261.    $sqlfield .= $key . ",";  
  262.    $sqlvalue .= "'" . $value . "',";  
  263.   }  
  264.   return "INSERT INTO " . $tbname . "(" . substr ( $sqlfield, 0, - 1 ) . ") VALUES (" . substr ( $sqlvalue, 0, - 1 ) . ")";  
  265. }  
  266. //======================================  
  267. // 函数: sqlUpdate()  
  268. // 功能: Update更新数据的函数  
  269. // 参数: $taname 要插入数据的表名  
  270. // 参数: $row 要插入的内容 (数组)  
  271. // 参数: $where 要插入的内容 的条件  
  272. // 返回: Update语句  
  273. //======================================      
  274. function sqlUpdate($tbname$row$where) {  
  275.   foreach ( $row as $key => $value ) {  
  276.    $sqlud .= $key . "= '" . $value . "',";  
  277.   }  
  278.   return "UPDATE " . $tbname . " SET " . substr ( $sqlud, 0, - 1 ) . " WHERE " . $where;  
  279. }  
  280. //======================================  
  281. // 函数: sqlDelete()  
  282. // 功能: 删除指定条件的行  
  283. // 参数: $taname 要插入数据的表名  
  284. // 参数: $where 要插入的内容 的条件  
  285. // 返回: DELETE语句  
  286. //======================================      
  287. function sqlDelete($tbname$where) {  
  288.   if (! $where) {  
  289.    $this->halt ( "删除函数没有指定条件!" );  
  290.    return 0;  
  291.   }  
  292.   return "DELETE FROM " . $tbname . " WHERE " . $where;  
  293. }  
  294.  
  295. //======================================  
  296. //函数:checkSql SQL语句的过滤  
  297. //功能:过滤一些特殊语法  
  298. //参数:$db_string 查询的SQL语句  
  299. //参数:$querytype 查询的类型  
  300. //======================================  
  301. function checkSql($db_string$querytype = 'select') {  
  302.   $clean = '';  
  303.   $old_pos = 0;  
  304.   $pos = - 1;  
  305.     
  306.   //如果是普通查询语句,直接过滤一些特殊语法  
  307.   if ($querytype == 'select') {  
  308.    $notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}";  
  309.      
  310.    //$notallow2 = "--|/\*";  
  311.    if (eregi ( $notallow1$db_string )) {  
  312.     exit ( "<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>" );  
  313.    }  
  314.   }  
  315.     
  316.   //完整的SQL检查  
  317.   while ( true ) {  
  318.    $pos = strpos ( $db_string'\''$pos + 1 );  
  319.    if ($pos === false) {  
  320.     break;  
  321.    }  
  322.    $clean .= substr ( $db_string$old_pos$pos - $old_pos );  
  323.    while ( true ) {  
  324.     $pos1 = strpos ( $db_string'\''$pos + 1 );  
  325.     $pos2 = strpos ( $db_string'\\'$pos + 1 );  
  326.     if ($pos1 === false) {  
  327.      break;  
  328.     } elseif ($pos2 == false || $pos2 > $pos1) {  
  329.      $pos = $pos1;  
  330.      break;  
  331.     }  
  332.     $pos = $pos2 + 1;  
  333.    }  
  334.    $clean .= '$s$';  
  335.    $old_pos = $pos + 1;  
  336.   }  
  337.   $clean .= substr ( $db_string$old_pos );  
  338.   $clean = trim ( strtolower ( preg_replace ( array ('~\s+~s' ), array (' ' ), $clean ) ) );  
  339.     
  340.   //老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它  
  341.   if (strpos ( $clean'union' ) !== false && preg_match ( '~(^|[^a-z])union($|[^[a-z])~s'$clean ) != 0) {  
  342.    $fail = true;  
  343.   }   
  344.   //发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们  
  345.   elseif (strpos ( $clean'/*' ) > 2 || strpos ( $clean'--' ) !== false || strpos ( $clean'#' ) !== false) {  
  346.    $fail = true;  
  347.   }   
  348.   //这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库  
  349.   elseif (strpos ( $clean'sleep' ) !== false && preg_match ( '~(^|[^a-z])sleep($|[^[a-z])~s'$clean ) != 0) {  
  350.    $fail = true;  
  351.   } elseif (strpos ( $clean'benchmark' ) !== false && preg_match ( '~(^|[^a-z])benchmark($|[^[a-z])~s'$clean ) != 0) {  
  352.    $fail = true;  
  353.   } elseif (strpos ( $clean'load_file' ) !== false && preg_match ( '~(^|[^a-z])load_file($|[^[a-z])~s'$clean ) != 0) {  
  354.    $fail = true;  
  355.   } elseif (strpos ( $clean'into outfile' ) !== false && preg_match ( '~(^|[^a-z])into\s+outfile($|[^[a-z])~s'$clean ) != 0) {  
  356.    $fail = true;  
  357.   }   
  358.   //老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息  
  359.   elseif (preg_match ( '~\([^)]*?select~s'$clean ) != 0) {  
  360.    $fail = true;  
  361.   }  
  362.   if (! emptyempty ( $fail )) {  
  363.    exit ( "<font size='5' color='red'>Safe Alert: Request Error step 2!</font>" );  
  364.   } else {  
  365.    return $db_string;  
  366.   }  
  367. }  
  368. //======================================  
  369. //函数:析构函数  
  370. //功能:释放类,关闭非永久的数据库连接  
  371. //参数:无  
  372. //======================================  
  373. public function __destruct() {  
  374.   $this->close ();  
  375. }  
  376. }  
  377. ?>  

 

  + 相关文章   关键字:数据库,操作,//,this,参数,函数,