一款简单实用的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生成扭曲及旋转的验证码图片
Jun 07 PHP
探讨php中header的用法详解
Jun 07 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
Jul 15 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
php经典算法集锦
Nov 14 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
php实现的表单验证类完整示例
Aug 13 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
angular2使用简单介绍
2016/03/01 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python显示生日是星期几的方法
2015/05/27 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Python文件读写常见用法总结
2019/02/22 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
django实现用户注册实例讲解
2019/10/30 Python
python调用接口的4种方式代码实例
2019/11/19 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
党员志愿者活动总结
2014/06/26 职场文书
计划生育诚信协议书
2014/11/02 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
怎样写好工作计划
2019/04/10 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
浅谈Redis的事件驱动模型
2022/05/30 Redis