一款简单实用的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 相关文章推荐
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
迁移PHP版本到PHP7
Feb 06 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
php车辆违章查询数据示例
Oct 14 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 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 imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
Python通过解析网页实现看报程序的方法
2014/08/04 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
2014年外联部工作总结
2014/11/17 职场文书
师德先进个人材料
2014/12/20 职场文书
教师节班会开场白
2015/06/01 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android