简单封装PHP操作MySQL的类

<?php
/*
类的名称:Model
类的作用:连接数据库执行sql语句
作  者:lim
更新时间:20170812
*/ class Model{ //存放连接数据库的资源
private $link; //构造连接数据库
public function __construct(){
$link = mysqli_connect(HOST,USER,PWD,DBNAME) or die('数据库连接失败');
$this->link = $link;
mysqli_set_charset($this->link,'utf8'); } /*
函数名称:query()
函数作用:处理查询
参  数:$sql: 提交的sql语句
返 回 值:返回一个二维数组
*/
public function query($sql){
//过滤sql
$sql=$this->CheckSql($sql); $res = mysqli_query($this->link,$sql);
$list = array();
if($res){
while($row=mysqli_fetch_assoc($res)){
$list[] = $row;
}
return $list;
}
return "sql语句出错=> {$sql} ";
} /*
函数名称:execute()
函数作用:处理增删改
参  数:$sql: 提交的sql语句
返 回 值:如果是添加返回id 如果是删除和修改返回影响行数
*/
public function execute($sql){
//过滤sql
$sql=$this->CheckSql($sql,"addupddel"); $res = mysqli_query($this->link,$sql);
if($res){
return (mysqli_insert_id($this->link))?mysqli_insert_id($this->link):mysqli_affected_rows($this->link);
}
return "sql语句出错=> {$sql} ";
} /*
函数名称:CheckSql()
函数作用:SQL语句过滤程序,由80sec提供,这里作了适当的修改
参  数:$sql: 处理的sql语句
参  数:$querytype: 类型
返 回 值:返回处理后的sql语句
*/
private function CheckSql($sql, $querytype='select')
{
$clean = '';
$error = '';
$pos = -;
$old_pos = ; //如果是普通查询语句,直接过滤一些特殊语法
if($querytype == 'select')
{
if(preg_match('/[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}/', $sql))
{
die('sql非法!');
}
} //完整的SQL检查
while(true)
{
$pos = strpos($sql, '\'', $pos + );
if($pos === false)
{
break;
}
$clean .= substr($sql, $old_pos, $pos - $old_pos); while(true)
{
$pos1 = strpos($sql, '\'', $pos + );
$pos2 = strpos($sql, '\\', $pos + );
if($pos1 === false)
{
break;
}
else if($pos2 == false || $pos2 > $pos1)
{
$pos = $pos1;
break;
}
$pos = $pos2 + ;
} $clean .= '$s$';
$old_pos = $pos + ;
} $clean .= substr($sql, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean))); //老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它
if(strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != )
{
$fail = true;
$error = 'union detect';
} //发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们
else if(strpos($clean, '/*') > || strpos($clean, '--') !== false || strpos($clean, '#') !== false)
{
$fail = true;
$error = 'comment detect';
} //这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
else if(strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != )
{
$fail = true;
$error = 'slown down detect';
}
else if(strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != )
{
$fail = true;
$error = 'slown down detect';
}
else if(strpos($clean, 'load_file') !== false && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != )
{
$fail = true;
$error = 'file fun detect';
}
else if(strpos($clean, 'into outfile') !== false && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != )
{
$fail = true;
$error = 'file fun detect';
} //老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
else if(preg_match('~\([^)]*?select~s', $clean) != )
{
$fail = true;
$error = 'sub select detect';
} if(!empty($fail))
{
die('sql非法!!');
}
else
{
return $sql;
}
} }

PHP数据库类的更多相关文章

  1. PHP用单例模式实现一个数据库类

    使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些 ...

  2. Dedesql数据库类详解

    今天花点时间讲解下织梦的sql数据库类,近期本来是准备录制一套视频教程的,但由于视频压缩的问题迟迟没有开展工作,如果大家有什么好的视频压缩方式可以通过邮件的方式告诉我:tianya#dedecms.c ...

  3. phpcms 源码分析四: 数据库类实现

    这次是逆雪寒的数据库类分析: <?php /* 这个讲 phpcms 的数据库类 和 phpcms 的文本缓存的实现.看了看 都是很简单的东西.大家看着我注释慢慢看吧.慢慢理解,最好能装了PHP ...

  4. php备份数据库类分享

    本文实例讲述了php实现MySQL数据库备份类.分享给大家供大家参考.具体分析如下:这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的配置好连接地址用户名与数据库即可   ph ...

  5. Python一个简单的数据库类封装

    #encoding:utf-8 #name:mod_db.py '''使用方法:1.在主程序中先实例化DB Mysql数据库操作类.      2.使用方法:db=database()  db.fet ...

  6. dede数据库类使用方法 $dsql(转)

    dede数据库类使用方法 $dsql   dedecms的数据库操作类,非常实用,在二次开发中尤其重要,这个数据库操作类说明算是奉献给大家的小礼物了. 引入common.inc.php文件 ? 1 r ...

  7. Dedesql数据库类详解(二次开发必备教程)(转)

    http://www.dedecms.com/help/development/2009/1028/1076.html 织梦DedeCMS的二次开发不仅仅是会写写织梦的标签,会制作织梦的模板.很多时候 ...

  8. CodeIgniter自带的数据库类使用介绍

    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类: view source ...

  9. CodeIgniter框架——数据库类(配置+快速入门)

    CodeIgniter用户指南——数据库类 数据库配置 入门:用法举例 连接数据库 查询 生成查询结果 查询辅助函数 Active Record 类 事务 表格元数据 字段元数据 自定义函数调用 查询 ...

  10. Dedesql数据库类详解(二次开发必备教程)

    其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介 ...

随机推荐

  1. 【php】set_include_path和get_include_path用法详解

    目的:在框架中方便加载文件 参考:http://blog.sina.com.cn/s/blog_4ce89f200100twbl.html 如果我们没有设置这个值,可能我们需要写一些完全的路径:    ...

  2. Mac & how to uninstall LANDesk

    Mac & how to uninstall LANDesk http://eddiejackson.net/wp/?p=9036 https://community.ivanti.com/d ...

  3. 第202天:js---原型与原型链终极详解

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...

  4. UVA12585_Poker End Games

    题目是这样的,每个人手中有a和b的钱数,c为a和b中间最小的一个. 每个回合,两个人胜利的概率都是0.5,胜利者从失败者手中获得c的钱数. 如果有一个人手中没钱的话,那么他就failer,游戏结束. ...

  5. dom变成jquery对象 先获取dom对象 然后通过$()转换成jquery对象

    dom变成jquery对象   先获取dom对象 然后通过$()转换成jquery对象

  6. 【HLSDK系列】服务端实体 edict_t 和 控制类

    我们来了解一下引擎是怎么管理实体的吧!我们这里就说说服务端的实体(edict_t) 服务端用 edict_t 这个结构体来保存一个实体,可以说一个 edict_t 就是一个 服务端实体,下文简称实体. ...

  7. 配置用户通过Telnet登录设备的身份认证(AAA本地认证)

    背景信息 用户通过Telnet登录设备时,设备上必须配置验证方式,否则用户无法成功登录设备.设备支持不认证.密码认证和AAA认证三种用户界面的验证方式,其中AAA认证方式安全性最高. 采用AAA本地认 ...

  8. ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

  9. 【BZOJ1492】【NOI2007】货币兑换(动态规划,CDQ分治,Splay)

    [BZOJ1492][NOI2007]货币兑换(动态规划,CDQ分治,Splay) 题面 BZOJ 洛谷 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券 ...

  10. 洛谷 P1854 花店橱窗布置 【dp】

    题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...