一款简单实用的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 项目的方法
Jan 02 PHP
php htmlspecialchars加强版
Feb 16 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
PHP CURL获取返回值的方法
May 04 PHP
php简单计算页面加载时间的方法
Jun 19 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
php图像验证码生成代码
Jun 08 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 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 cron中的批处理
2008/09/16 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
js正确获取元素样式详解
2009/08/07 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
vue watch关于对象内的属性监听
2019/04/22 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Django框架封装外部函数示例
2019/05/28 Python
python 代码运行时间获取方式详解
2020/09/18 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
财务会计毕业生自荐信
2013/11/02 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Python基础之数据类型知识汇总
2021/05/18 Python
Python+tkinter实现高清图片保存
2022/03/13 Python
cypress测试本地web应用
2022/06/01 Javascript
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript