一款简单实用的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制作图型计数器的例子
Oct 09 PHP
建立动态的WML站点(三)
Oct 09 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
PHP 远程关机实现代码
Nov 10 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
Smarty实现页面静态化(生成HTML)的方法
May 23 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
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
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
JavaScript中DOM详解
2015/04/13 Javascript
jquery获取节点名称
2015/04/26 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
Python的高阶函数用法实例分析
2019/04/11 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
《姥姥的剪纸》教学反思
2014/02/25 职场文书
百年校庆节目主持词
2014/03/27 职场文书
企业安全生产责任书
2014/04/14 职场文书
媒体宣传策划方案
2014/05/25 职场文书
工作求职自荐信
2014/06/13 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
团员自我评价范文
2015/03/10 职场文书
教师见习总结范文
2015/06/23 职场文书
小学见习报告
2015/06/23 职场文书