一款简单实用的php操作mysql数据库类


Posted in PHP onDecember 08, 2014

本文实例讲述了一款简单实用的php操作mysql数据库类。分享给大家供大家参考。具体如下:

/* 

本款数据库连接类,他会自动加载sql防注入功能,过滤一些敏感的sql查询关键词,同时还可以增加判断字段 show table status的性质与show table类 获取数据库所有表名等。*/ 

@ini_set('mysql.trace_mode','off'); 

class mysql 

{

 public $dblink; 

 public $pconnect; 

 private $search = array('/union(s*(/*.**/)?s*)+select/i', '/load_file(s*(/*.**/)?s*)+(/i', '/into(s*(/*.**/)?s*)+outfile/i'); 

 private $replace = array('union   select', 'load_file   (', 'into   outfile'); 

 private $rs; 

 

 function __construct($hostname,$username,$userpwd,$database,$pconnect=false,$charset='utf8') 

 { 

  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>');  

  $this->pconnect=$pconnect; 

  $this->dblink=$pconnect?mysql_pconnect($hostname,$username,$userpwd):mysql_connect($hostname,$username,$userpwd); 

  (!$this->dblink||!is_resource($this->dblink)) && fatal_error("connect to the database unsuccessfully!"); 

  @mysql_unbuffered_query("set names {$charset}"); 

  if($this->version()>'5.0.1') 

  { 

   @mysql_unbuffered_query("set sql_mode = ''"); 

  } 

  @mysql_select_db($database) or fatal_error("can not select table!"); 

  return $this->dblink; 

 } 

 

 function query($sql,$unbuffered=false) 

 { 

  //echo $sql.'<br>'; 

  $this->rs=$unbuffered?mysql_unbuffered_query($sql,$this->dblink):mysql_query($sql,$this->dblink); 

  //(!$this->rs||!is_resource($this->rs)) && fatal_error("execute the query unsuccessfully! error:".mysql_error()); 

  if(!$this->rs)fatal_error('在执行sql语句 '.$sql.' 时发生以下错误:'.mysql_error()); 

  return $this->rs; 

 } 

 

 function fetch_one($sql) 

 { 

  $this->rs=$this->query($sql); 

  return dircms_strips教程lashes($this->filter_pass(mysql_fetch_array($this->rs,mysql_assoc))); 

 } 

 

 function get_maxfield($filed='id',$table) // 获取$table表中$filed字段的最大值 

 { 

  $r=$this->fetch_one("select {$table}.{$filed} from `{$table}` order by `{$table}`.`{$filed}` desc limit 0,1"); 

  return $r[$filed]; 

 } 

 

 function fetch_all($sql) 

 { 

  $this->rs=$this->query($sql); 

  $result=array(); 

  while($rows=mysql_fetch_array($this->rs,mysql_assoc)) 

  { 

   $result[]=$rows; 

  } 

   

  mysql_free_result($this->rs); 

  return dircms_stripslashes($this->filter_pass($result));  

 } 

 

 function fetch_all_withkey($sql,$key='id') 

 { 

  $this->rs=$this->query($sql); 

  $result=array(); 

  while($rows=mysql_fetch_array($this->rs,mysql_assoc)) 

  { 

   $result[$rows[$key]]=$rows; 

  } 

   

  mysql_free_result($this->rs); 

  return dircms_stripslashes($this->filter_pass($result));  

 } 

 

 function last_insert_id() 

 { 

  if(($insertid=mysql_insert_id($this->dblink))>0)return $insertid; 

  else //如果 auto_increment 的列的类型是 bigint,则 mysql_insert_id() 返回的值将不正确. 

  { 

   $result=$this->fetch_one('select last_insert_id() as insertid'); 

   return $result['insertid']; 

  } 

 } 

 

 function insert($tbname,$varray,$replace=false) 

 { 

  $varray=$this->escape($varray); 

  $tb_fields=$this->get_fields($tbname); // 升级一下,增加判断字段是否存在 

   

  foreach($varray as $key => $value) 

  { 

   if(in_array($key,$tb_fields)) 

   { 

    $fileds[]='`'.$key.'`'; 

    $values[]=is_string($value)?'''.$value.''':$value; 

   } 

  } 

 

  if($fileds) 

  { 

   $fileds=implode(',',$fileds); 

   $fileds=str_replace(''','`',$fileds); 

   $values=implode(',',$values); 

   $sql=$replace?"replace into {$tbname}({$fileds}) values ({$values})":"insert into {$tbname}({$fileds}) values ({$values})"; 

   $this->query($sql,true); 

   return $this->last_insert_id(); 

  } 

  else return false; 

 } 

 

 function update($tbname, $array, $where = '') 

 { 

  $array=$this->escape($array); 

  if($where) 

  { 

   $tb_fields=$this->get_fields($tbname); // 增加判断字段是否存在 

    

   $sql = ''; 

   foreach($array as $k=>$v) 

   { 

    if(in_array($k,$tb_fields)) 

    { 

     $k=str_replace(''','',$k); 

     $sql .= ", `$k`='$v'"; 

    } 

   } 

   $sql = substr($sql, 1); 

    

   if($sql)$sql = "update `$tbname` set $sql where $where"; 

   else return true; 

  } 

  else 

  { 

   $sql = "replace into `$tbname`(`".implode('`,`', array_keys($array))."`) values('".implode("','", $array)."')"; 

  } 

  return $this->query($sql,true); 

 } 

  

 function mysql_delete($tbname,$idarray,$filedname='id') 

 { 

  $idwhere=is_array($idarray)?implode(',',$idarray):intval($idarray); 

  $where=is_array($idarray)?"{$tbname}.{$filedname} in ({$idwhere})":" {$tbname}.{$filedname}={$idwhere}"; 

 

  return $this->query("delete from {$tbname} where {$where}",true); 

 } 

 

 function get_fields($table) 

 { 

  $fields=array(); 

  $result=$this->fetch_all("show columns from `{$table}`"); 

  foreach($result as $val) 

  { 

   $fields[]=$val['field']; 

  } 

  return $fields; 

 } 

 

 function get_table_status($database) 

 { 

  $status=array(); 

  $r=$this->fetch_all("show table status from `".$database."`"); /////// show table status的性质与show table类似,不过,可以提供每个表的大量信息。 

  foreach($r as $v) 

  { 

   $status[]=$v; 

  } 

  return $status; 

 } 

 

 function get_one_table_status($table) 

 { 

  return $this->fetch_one("show table status like '$table'"); 

 } 

 

 function create_fields($tbname,$fieldname,$size=0,$type='varchar') // 2010-5-14 修正一下 

 {   

  if($size) 

  { 

   $size=strtoupper($type)=='varchar'?$size:8; 

   $this->query("alter table `{$tbname}` add `$fieldname` {$type}( {$size} )  not null",true); 

  } 

  else $this->query("alter table `{$tbname}` add `$fieldname` mediumtext  not null",true); 

  return true; 

 } 

 

 function get_tables() //获取所有表表名 

 { 

  $tables=array(); 

  $r=$this->fetch_all("show tables"); 

  foreach($r as $v) 

  { 

   foreach($v as $v_) 

   { 

    $tables[]=$v_; 

   } 

  } 

  return $tables; 

 } 

 

 function create_model_table($tbname) //创建一个内容模型表(start:初始只有字段contentid int(20),用于内容表,/////////////////////// update:2010-5-20     默认加入`content` mediumtext not null,字段) 

 { 

  if(in_array($tbname,$this->get_tables())) return false;  ///////////////////// 当表名已经存在时,返回 false 

  if($this->query("create table `{$tbname}` ( 

`contentid` mediumint(8) not null , 

`content` mediumtext not null, 

key ( `contentid` )  

) engine = myisam default charset=utf8",true))return true;   ////////////////////  成功则返回 true 

  return false; //////////////失败返回 false 

 } 

 

 function create_table($tbname) //创建一个会员模型空表(初始只有字段userid int(20),用于会员表,2010-4-26) 

 { 

  if(in_array($tbname,$this->get_tables())) return false; 

  if($this->query("create table `{$tbname}` ( 

`userid` mediumint(8) not null , 

key ( `userid` )  

) engine = myisam default charset=utf8",true))return true; 

  return false; 

 } 

 

 function escape($str) // 过滤危险字符 

 { 

  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)); 

  foreach($str as $key=>$val) $str[$key] = $this->escape($val); 

  return $str; 

 } 

 

 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')) 

 { 

  if(is_array($string)) 

  { 

   foreach($string as $key => $val) $string[$key] = $this->filter_pass($val, allowed_htmltags); 

  } 

  else 

  { 

   $string = preg_replace('/s('.implode('|', $disabledattributes).').*?([s>])/', '', preg_replace('/<(.*?)>/ie', "'<'.preg_replace(array('/网页特效:[^"']*/i', '/(".implode('|', $disabledattributes).")[ ]*=[ ]*["'][^"']*["']/i', '/s+/'), array('', '', ' '), stripslashes('')) . '>'", strip_tags($string, $allowedtags))); 

  } 

  return $string; 

 } 

 

 function drop_table($tbname) 

 { 

  return $this->query("drop table if exists `{$tbname}`",true); 

 } 

 

 function version() 

 { 

  return mysql_get_server_info($this->dblink); 

 } 

}

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP下10件你也许并不了解的事情
Sep 11 PHP
php 获取本地IP代码
Jun 23 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
PHP中比较时间大小实例
Aug 21 PHP
php获取twitter最新消息的方法
Apr 14 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
php表单敏感字符过滤类
Dec 08 #PHP
php网页病毒清除类
Dec 08 #PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 #PHP
简单实用的PHP防注入类实例
Dec 05 #PHP
ThinkPHP连接数据库的方式汇总
Dec 05 #PHP
PHP生成RSS文件类实例
Dec 05 #PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 #PHP
You might like
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
告诉大家什么是JSON
2008/06/10 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
Vue面试题及Vue知识点整理
2018/10/07 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
Html5之title吸顶功能
2018/06/04 HTML / CSS
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
餐馆开业致辞
2015/08/01 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书