简单封装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. Android Studio- 把项目提交到SVN中操作方法

    第一步 下载SVN,下载完成之后,需要吧command line client tools点击修改安装 然后Crash Reporter点击选择取消安装 如果不进行该操作,则可能在C:\Program ...

  2. 使用JMeter录制Web应用测试脚本

    环境 操作系统:Windows 7 工具:JMeter.Badboy 1. 使用代理录制Web性能测试脚本 使用代理录制脚本来创建测试计划无疑是一个简便的方法,代理所要完成的工作就是录制发往服务器的请 ...

  3. node web 应用热更新

    在每次更改完 node.js 项目后,我们都需要先将 node.js停止(快捷键: Ctrl+C),然后再通过命令再次运行,这样特别麻烦.这里我推荐使用 supervisor工具, npm 安装命令为 ...

  4. 第181天:HTML5——视频、音频

    一.HTML5新增的video.source标签 <video width="320" height="240" controls="contr ...

  5. BZOJ4974 字符串大师(kmp)

    显然最短循环节长度=i-next[i],则相当于给定next数组构造字符串.然后按照kmp的过程模拟即可.虽然这看起来是一个染色问题,但是由图的特殊性,如果next=0只要贪心地选最小的就可以了,稍微 ...

  6. hive 导入数据

    1.load data load data local inpath "/home/hadoop/userinfo.txt" into table userinfo; " ...

  7. python基础(3)

    使用list和tuple list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: ...

  8. java规范(三)-----判空----方法内的为空判断

    一般我们判空或者有判断条件时 都是使用 if(条件成立){ 执行代码 } 这样的逻辑. 但是如果对象的字段很深层次时或者条件很多时就容易形成很多个{}的情况,这样就容易分不出哪个花括号属于哪部分.如下 ...

  9. Hbase(二)hbase建表

    一.建表高级属性 下面几个 shell 命令在 hbase 操作中可以起到很到的作用,且主要体现在建表的过程中,看 下面几个 create 属性 1.bloomfilter 布隆过滤器 默认是 NON ...

  10. jsp 文件无法加载 css、js 的问题

    今天遇到一个问题是,在 jsp 里面引入 css.js,请求的状态是 200,但 css.js 的内容却是空的. 这是因为 servlet 有个 url-pattern,将 css.js 的路径当做 ...