首页 > 语言 > PHP > 正文

一款实用的php mysql数据库连接类

2024-09-04 11:44:07
字体:
来源:转载
供稿:网友
  1. /* 
  2. 本款数据库连接类,他会自动加载sql防注入功能,过滤一些敏感的sql查询关键词,同时还可以增加判断字段 show table status的性质与show table类 获取数据库所有表名等。*/ 
  3. @ini_set('mysql.trace_mode','off'); 
  4. class mysql 
  5. {//开源代码Vevb.com 
  6.  public $dblink; 
  7.  public $pconnect; 
  8.  private $search = array('/union(s*(/*.**/)?s*)+select/i''/load_file(s*(/*.**/)?s*)+(/i''/into(s*(/*.**/)?s*)+outfile/i'); 
  9.  private $replace = array('union   select''load_file   (''into   outfile'); 
  10.  private $rs; 
  11.  
  12.  function __construct($hostname,$username,$userpwd,$database,$pconnect=false,$charset='utf8'
  13.  { 
  14.   define('allowed_htmltags''<html><embed><title><meta><body><a><p><br><hr><h1><h2><h3><h4><h5><h6><font><u><i><b><strong><div><span><ol><ul><li><img><table><tr><td><map>');  
  15.   $this->pconnect=$pconnect; 
  16.   $this->dblink=$pconnect?mysql_pconnect($hostname,$username,$userpwd):mysql_connect($hostname,$username,$userpwd); 
  17.   (!$this->dblink||!is_resource($this->dblink)) && fatal_error("connect to the database unsuccessfully!"); 
  18.   @mysql_unbuffered_query("set names {$charset}"); 
  19.   if($this->version()>'5.0.1'
  20.   { 
  21.    @mysql_unbuffered_query("set sql_mode = ''"); 
  22.   } 
  23.   @mysql_select_db($database) or fatal_error("can not select table!"); 
  24.   return $this->dblink; 
  25.  } 
  26.  
  27.  function query($sql,$unbuffered=false
  28.  { 
  29.   //echo $sql.'<br>'; 
  30.   $this->rs=$unbuffered?mysql_unbuffered_query($sql,$this->dblink):mysql_query($sql,$this->dblink); 
  31.   //(!$this->rs||!is_resource($this->rs)) && fatal_error("execute the query unsuccessfully! error:".mysql_error()); 
  32.   if(!$this->rs)fatal_error('在执行sql语句 '.$sql.' 时发生以下错误:'.mysql_error()); 
  33.   return $this->rs; 
  34.  } 
  35.  
  36.  function fetch_one($sql) 
  37.  { 
  38.   $this->rs=$this->query($sql); 
  39.   return dircms_strips教程lashes($this->filter_pass(mysql_fetch_array($this->rs,mysql_assoc))); 
  40.  } 
  41.  
  42.  function get_maxfield($filed='id',$table) // 获取$table表中$filed字段的最大值 
  43.  { 
  44.   $r=$this->fetch_one("select {$table}.{$filed} from `{$table}` order by `{$table}`.`{$filed}` desc limit 0,1"); 
  45.   return $r[$filed]; 
  46.  } 
  47.  
  48.  function fetch_all($sql) 
  49.  { 
  50.   $this->rs=$this->query($sql); 
  51.   $result=array(); 
  52.   while($rows=mysql_fetch_array($this->rs,mysql_assoc)) 
  53.   { 
  54.    $result[]=$rows; 
  55.   } 
  56.    
  57.   mysql_free_result($this->rs); 
  58.   return dircms_stripslashes($this->filter_pass($result));  
  59.  } 
  60.  
  61.  function fetch_all_withkey($sql,$key='id'
  62.  { 
  63.   $this->rs=$this->query($sql); 
  64.   $result=array(); 
  65.   while($rows=mysql_fetch_array($this->rs,mysql_assoc)) 
  66.   { 
  67.    $result[$rows[$key]]=$rows; 
  68.   } 
  69.    
  70.   mysql_free_result($this->rs); 
  71.   return dircms_stripslashes($this->filter_pass($result));  
  72.  } 
  73.  
  74.  function last_insert_id() 
  75.  { 
  76.   if(($insertid=mysql_insert_id($this->dblink))>0)return $insertid; 
  77.   else //如果 auto_increment 的列的类型是 bigint,则 mysql_insert_id() 返回的值将不正确. 
  78.   { 
  79.    $result=$this->fetch_one('select last_insert_id() as insertid'); 
  80.    return $result['insertid']; 
  81.   } 
  82.  } 
  83.  
  84.  function insert($tbname,$varray,$replace=false
  85.  { 
  86.   $varray=$this->escape($varray); 
  87.   $tb_fields=$this->get_fields($tbname); // mb.111cn.net 升级一下,增加判断字段是否存在 
  88.    
  89.   foreach($varray as $key => $value) 
  90.   { 
  91.    if(in_array($key,$tb_fields)) 
  92.    { 
  93.     $fileds[]='`'.$key.'`'
  94.     $values[]=is_string($value)?'''.$value.''':$value; 
  95.    } 
  96.   } 
  97.  
  98.   if($fileds) 
  99.   { 
  100.    $fileds=implode(',',$fileds); 
  101.    $fileds=str_replace(''','`',$fileds); 
  102.    $values=implode(',',$values); 
  103.    $sql=$replace?"replace into {$tbname}({$fileds}) values ({$values})":"insert into {$tbname}({$fileds}) values ({$values})"
  104.    $this->query($sql,true); 
  105.    return $this->last_insert_id(); 
  106.   } 
  107.   else return false
  108.  } 
  109.  
  110.  function update($tbname, $array, $where = ''
  111.  { 
  112.   $array=$this->escape($array); 
  113.   if($where) 
  114.   { 
  115.    $tb_fields=$this->get_fields($tbname); // www.111cn.net,增加判断字段是否存在 
  116.     
  117.    $sql = ''
  118.    foreach($array as $k=>$v) 
  119.    { 
  120.     if(in_array($k,$tb_fields)) 
  121.     { 
  122.      $k=str_replace(''','',$k); 
  123.      $sql .= ", `$k`='$v'"
  124.     } 
  125.    } 
  126.    $sql = substr($sql, 1); 
  127.     
  128.    if($sql)$sql = "update `$tbname` set $sql where $where"
  129.    else return true
  130.   } 
  131.   else 
  132.   { 
  133.    $sql = "replace into `$tbname`(`".implode('`,`', array_keys($array))."`) values('".implode("','", $array)."')"
  134.   } 
  135.   return $this->query($sql,true); 
  136.  } 
  137.   
  138.  function mysql_delete($tbname,$idarray,$filedname='id'
  139.  { 
  140.   $idwhere=is_array($idarray)?implode(',',$idarray):intval($idarray); 
  141.   $where=is_array($idarray)?"{$tbname}.{$filedname} in ({$idwhere})":" {$tbname}.{$filedname}={$idwhere}"
  142.  
  143.   return $this->query("delete from {$tbname} where {$where}",true); 
  144.  } 
  145.  
  146.  function get_fields($table) 
  147.  { 
  148.   $fields=array(); 
  149.   $result=$this->fetch_all("show columns from `{$table}`"); 
  150.   foreach($result as $val) 
  151.   { 
  152.    $fields[]=$val['field']; 
  153.   } 
  154.   return $fields; 
  155.  } 
  156.  
  157.  function get_table_status($database) 
  158.  { 
  159.   $status=array(); 
  160.   $r=$this->fetch_all("show table status from `".$database."`"); /////// show table status的性质与show table类似,不过,可以提供每个表的大量信息。 
  161.   foreach($r as $v) 
  162.   { 
  163.    $status[]=$v; 
  164.   } 
  165.   return $status; 
  166.  } 
  167.  
  168.  function get_one_table_status($table) 
  169.  { 
  170.   return $this->fetch_one("show table status like '$table'"); 
  171.  } 
  172.  
  173.  function create_fields($tbname,$fieldname,$size=0,$type='varchar'// 2010-5-14 修正一下 
  174.  {   
  175.   if($size) 
  176.   { 
  177.    $size=strtoupper($type)=='varchar'?$size:8; 
  178.    $this->query("alter table `{$tbname}` add `$fieldname` {$type}( {$size} )  not null",true); 
  179.   } 
  180.   else $this->query("alter table `{$tbname}` add `$fieldname` mediumtext  not null",true); 
  181.   return true
  182.  } 
  183.  
  184.  function get_tables() //获取所有表表名 
  185.  { 
  186.   $tables=array(); 
  187.   $r=$this->fetch_all("show tables"); 
  188.   foreach($r as $v) 
  189.   { 
  190.    foreach($v as $v_) 
  191.    { 
  192.     $tables[]=$v_; 
  193.    } 
  194.   } 
  195.   return $tables; 
  196.  } 
  197.  
  198.  function create_model_table($tbname) //创建一个内容模型表(start:初始只有字段contentid int(20),用于内容表,/////////////////////// update:2010-5-20     默认加入`content` mediumtext not null,字段) 
  199.  { 
  200.   if(in_array($tbname,$this->get_tables())) return false;  ///////////////////// 当表名已经存在时,返回 false 
  201.   if($this->query("create table `{$tbname}` ( 
  202. `contentid` mediumint(8) not null , 
  203. `content` mediumtext not null
  204. key ( `contentid` )  
  205. ) engine = myisam default charset=utf8",true))return true;   ////////////////////  成功则返回 true 
  206.   return false//////////////失败返回 false 
  207.  } 
  208.  
  209.  function create_table($tbname) //创建一个会员模型空表(初始只有字段userid int(20),用于会员表,2010-4-26) 
  210.  { 
  211.   if(in_array($tbname,$this->get_tables())) return false
  212.   if($this->query("create table `{$tbname}` ( 
  213. `userid` mediumint(8) not null , 
  214. key ( `userid` )  
  215. ) engine = myisam default charset=utf8",true))return true
  216.   return false
  217.  } 
  218.  
  219.  function escape($str) // 过滤危险字符 
  220.  { 
  221.   if(!is_array($str)) return str_replace(array('n''r'), array(chr(10), chr(13)),mysql_real_escape_string(preg_replace($this->search,$this->replace, $str), $this->dblink)); 
  222.   foreach($str as $key=>$val) $str[$key] = $this->escape($val); 
  223.   return $str; 
  224.  } 
  225.  
  226.  function filter_pass($string, $allowedtags = '', $disabledattributes = array('onabort''onactivate''onafterprint''onafterupdate''onbeforeactivate''onbeforecopy''onbeforecut''onbeforedeactivate''onbeforeeditfocus''onbeforepaste''onbeforeprint''onbeforeunload''onbeforeupdate''onblur''onbounce''oncellchange''onchange''onclick''oncontextmenu''oncontrolselect''oncopy''oncut''ondataavaible''ondatasetchanged''ondatasetcomplete''ondblclick''ondeactivate''ondrag''ondragdrop''ondragend''ondragenter''ondragleave''ondragover''ondragstart''ondrop''onerror''onerrorupdate''onfilterupdate''onfinish''onfocus''onfocusin''onfocusout''onhelp''onkeydown''onkeypress''onkeyup''onlayoutcomplete''onload''onlosecapture''onmousedown''onmouseenter''onmouseleave''onmousemove''onmoveout''onmouseo教程ver''onmouseup''onmousewheel''onmove''onmoveend''onmovestart''onpaste''onpropertychange''onreadystatechange''onreset''onresize''onresizeend''onresizestart''onrowexit''onrowsdelete''onrowsinserted''onscroll''onselect''onselectionchange''onselectstart''onstart''onstop''onsubmit''onunload')) 
  227.  { 
  228.   if(is_array($string)) 
  229.   { 
  230.    foreach($string as $key => $val) $string[$key] = $this->filter_pass($val, allowed_htmltags); 
  231.   } 
  232.   else 
  233.   { 
  234.    $string = preg_replace('/s('.implode('|', $disabledattributes).').*?([s>])/''', preg_replace('/<(.*?)>/ie'"'<'.preg_replace(array('/网页特效:[^"']*/i', '/(".implode('|', $disabledattributes).")[ ]*=[ ]*["'][^"']*["']/i', '/s+/'), array('', '', ' '), stripslashes('')) . '>'", strip_tags($string, $allowedtags))); 
  235.   } 
  236.   return $string; 
  237.  } 
  238.  
  239.  function drop_table($tbname) 
  240.  { 
  241.   return $this->query("drop table if exists `{$tbname}`",true); 
  242.  } 
  243.  
  244.  function version() 
  245.  { 
  246.   return mysql_get_server_info($this->dblink); 
  247.  } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表