模仿thinkphp封装的类库

<?php
/**
* MySql操作类2015版
* 作者:咖啡兽兽 287962566@qq.com
* 使用说明:
* //包含文件
* inclode 'Mysql.class.php';
* //写个方法来实例化数据库对象
* function newMySQL($table){
* //DSN参数,建议从配置文件获取
* $dsn = array(
* 'DB_HOST' => 'loaclhost', //主机地址
* 'DB_NAME' => 'mydb', //数据库名
* 'DB_PORT' => 3306, //端口
* 'DB_PREFIX' => 'kf', //表前缀
* 'DB_CHARSET' => 'utf8', //数据库编码
* 'DB_USER' => 'root', //用户名
* 'DB_PWD' => '123456', //密码
* );
* //表名
* $dsn['DB_TABLE'] = $table;
* //返回数据库对象
* return Mysql::start($dsn);
* }
* //传入表名,获取数据库对象
* $Sql = newMySQL('user');
* //若要切换操作表,可直接给table成员属性赋值
* $Sql->table = 'product';
* //插入数据
* $data['name'] = '小白';
* $data['pwd'] = md5('123456');
* $data['age'] = 25;
* $data['sex'] = '男';
* $Sql->add($data);
*
* //更新数据
* $data['name'] = '小黑';
* $where = "id=1";
* $Sql->where($where)->save($data);
* //指定字段加1
* $Sql->where($where)->sum('age');
* //指定字段加N
* $Sql->where($where)->sum('age',10);
*
* //查询数据
* $where = "sex='男' and age>20";
* //取回所有符合条件的数据
* $arr = $Sql->where($where)->select();
* //可用field指定要取回的字段
* $arr = $Sql->field('name,sex')->where($where)->select();
* //取回指定范围 limit 两个参数都是整数型
* $arr = $Sql->where($where)->limit(偏移量,最大行数)->select();
* //指定排序 desc or asc 可指定多个字段,以","隔开
* $arr = $Sql->where($where)->order("sex desc")->select();
* //取回第一行
* $find = $Sql->where($where)->find();
* //单独取回指定字段,若符合条件的数据 >1行,则返回数组
* $field = $Sql->where('id=1')->getField('name');
* //取符合条件的总行数
* $count = $Sql->where($where)->getCount();
*
* //删除数据
* $Sql->where($where)->delete();
*/
class Mysql
{
private $host; //主机地址
private $dbname; //数据库名
private $port; //数据库端口
private $username; //用户名
private $password; //密码
private $charset; //数据库编码
static $SQL; //数据库对象
static $obj = null;
public $table; //操作表
private $pre = null;
private $opt; //选项 /**
* 初始化数据库
* @param Array $dsn 数据库连接参数
*/
private function __construct($dsn){
$this->host = $dsn['DB_HOST'];
$this->dbname = $dsn['DB_NAME'];
$this->username = $dsn['DB_USER'];
$this->password = $dsn['DB_PWD'];
$this->port = $dsn['DB_PORT'];
$this->charset = $dsn['DB_CHARSET'];
//$this->table = $dsn['DB_PREFIX'].$dsn['DB_TABLE'];
$this->opt['where'] = '';
$this->opt['order'] = '';
$this->opt['limit'] = '';
$this->opt['field'] = null;
$this->connect();
} /*
* Lee:
* 还原默认纯洁的配置环境
* */
public function reset()
{
$this->opt['where'] = '';
$this->opt['order'] = '';
$this->opt['limit'] = '';
$this->opt['field'] = null;
} /**
* 连接数据库
* @return Bool
*/
private function connect(){
try{
$dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname.';port='.$this->port;
$options = array(
PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.$this->charset,
);
self::$SQL = new PDO ($dsn,$this->username,$this->password,$options);
//设置错误报告
self::$SQL->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}
return true;
} /**
* @param Array $dsn 数据库连接参数(DB_HOST[主机],DB_NAME[数据库名],DB_PORT[端口],DB_CHARSET[编码],DB_USER[帐户],DB_PWD[密码],DB_TABLE[表名])
* @return Object
*/
static function start($dsn){
//判断对象是否存在,若已存在则直接返回该对象
//if(is_null(self::$obj)){
self::$obj = null;
self::$obj = new self($dsn);
//}
return self::$obj;
} /**
* 插入数据(成功返回新插入的 自动增长主键,失败返回0)
* @param Array $data 欲插入的数据,对应表中的键与值
* @param Int 0 准备语句 ,1 执行语句,2(默认)准备并执行语句
* @return Int
*/
public function add($data,$type = 2){
try{
//构造SQL语句
$count = 0;
$a = '';
foreach($data as $k=>$v){
if($count != 0){
$a = ',';
}
@$key .= $a.$k;
@$bind .=$a.":$k";
$count++;
}
$s = "insert into {$this->table}({$key}) values({$bind})"; //发送语句
if($type != 1){
$this->pre = self::$SQL->prepare($s);
if($type == 0 && is_object($this->pre) == true){
return 1;
}
}
//执行语句
if($type != 0){
$this->pre->execute($data);
}
//重置各种条件
$this->reset();
//返回最新主键
return self::$SQL->lastinsertid();
}catch(PDOException $e){
exit("错误:".$e->getMessage());
} }
/**
* 更新数据(返回受影响行)
* @param void $data 传入更新数组
* @return Int
*/
public function save($data){
try{
//构造SQL语句
$count = 0;
$a = '';
foreach($data as $k=>$v)
{
if($count != 0){
$a = ',';
}
@$bind .=$a."$k='$v'";
$count++;
}
$s = "update {$this->table} set {$bind} {$this->opt['where']}";
//发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute($data);
//重置各种条件
$this->reset();
//返回受影响行
return $this->pre->rowCount();
}catch(PDOException $e){
exit("错误:".$e->getMessage());
}
} /**
* 指定字段加N,默认加1
* @param String $key 字段
* @param Int $num [可选]裕增加的数值,默认1
* @return Int
*/
public function sum($key,$num){
try{
$s = "update {$this->table} set {$key}={$key}+{$num} {$this->opt['where']}"; //发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//返回受影响行
return $this->pre->rowCount();
}catch(PDOException $e){
exit("错误:".$e->getMessage());
}
} /**
* 删除数据(返回受影响行)
* @return Int
*/
public function delete(){
try{
$s = "delete from {$this->table} {$this->opt['where']}";
//发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//返回受影响行
return $this->pre->rowCount();
}catch(PDOException $e){
exit("错误:".$e->getMessage());
}
} /*
* Lee函数:
* 只推荐不存在任何参数的sql语句使用该函数
* */
public function query($str)
{
try
{
$s = $str;
//发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//设置返回关联数组
$this->pre->setFetchMode(PDO::FETCH_ASSOC);
//重置各种条件
$this->reset();
return $this->pre->fetchAll();
}
catch(PDOException $e)
{
exit("错误:".$e->getMessage());
}
} /*
* Lee函数:
* 只推荐不存在任何参数的sql语句使用该函数
* */
public function send($str)
{
try
{
$s = $str;
//发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//重置各种条件
$this->reset();
}
catch(PDOException $e)
{
exit("错误:".$e->getMessage());
}
} /**
* 取数据集(返回符合条件的所有数据)
* @return array
*/
public function select(){
try{
$s = "select ".($this->opt['field']? $this->opt['field']:'*')." from {$this->table} {$this->opt['where']} {$this->opt['order']} {$this->opt['limit']}"; //发送语句
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//设置返回关联数组
$this->pre->setFetchMode(PDO::FETCH_ASSOC);
//重置各种条件
$this->reset();
return $this->pre->fetchAll();
}
catch(PDOException $e)
{
exit("错误:".$e->getMessage());
}
}
/**
* 取一行数据(只返回第一条数据)
* @return array
*/
public function find(){
try{
$s = "select ".($this->opt['field']? $this->opt['field']:'*')." from {$this->table} {$this->opt['where']} {$this->opt['order']} limit 1"; $this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
//设置返回关联数组
$this->pre->setFetchMode(PDO::FETCH_ASSOC);
$arr = $this->pre->fetchAll();
//重置各种条件
$this->reset();
return @$arr[0];
}catch(PDOException $e){
exit("错误:".$e->getMessage());
}
}
/**
* 取指定字段值(当只有一条数据时,直接返回键值,否则返回数组,失败返回false)
* @param String $key 指定字段名
* @return mixed
*/
public function getField($key){
$opt['field'] = $key;
$selArr = $this->select();
foreach($selArr as $number=>$value){
$retuls[$number] = $value[$key];
} if(@$retuls == null) $retuls=false;
//判断是否单只有一条数据
if(count($retuls) == 1 and $retuls != false){
$retuls = $retuls[0];
}
return $retuls;
} /**
* 设定指定字段值
* @param String $key 指定字段名
* @param mixed $value 字段值
* @return mixed
*/
public function setField($key,$value){
return $this->save(array($key=>$value));
} /**
* 取符合条件的数据总行数
*/
public function getCount(){
try{
$s = "select count(*) from {$this->table} {$this->opt['where']}";
$this->pre = self::$SQL->prepare($s);
//执行语句
$this->pre->execute();
$count = $this->pre->fetch();
return Intval($count[0]);
}catch(PDOException $e){
exit("错误:".$e->getMessage());
}
}
/**
* 查询条件
* @param String $where 查询条件
* @return this
*/
public function where($where){
$this->opt['where'] = $where? "where ".$where:'';
return $this;
} /**
* 指定排序
* @param String $order 排序规则 desc.倒序 asc.正序
* @return this
*/
public function order($order){
$this->opt['order'] = $order? "order by ".$order:'';
return $this;
} /**
* 指定欲取的数据条数
* @param Int $min 只传一个参数时,传入欲取的数据条数;否则传入记录偏移量,从0开始
* @param Int $max 欲取的的数据条数
* @return this
*/
public function limit($min,$max=null){
$this->opt['limit'] = "limit ".intval($min).($max? ','.intval($max):'');
return $this;
} /**
* 指定欲取的字段
* @param String $field 指定字段名称,多个请以(,)分号隔开
* @param this
*/
public function field($field){
$this->opt['field'] = $field;
return $this;
} } ?>

php 仿thinkphp的sql类库的更多相关文章

  1. 强大的拉姆表达式转Sql 类库 - SqlSugar 隐藏功能之Lambda

    使用场景 1.Lambda to sql 一直是ORM中最难的功能之一,如果有现成的解析库那么自已写一个ORM难度将大大降低 2.通过Lambda作为KEY进行缓存操作,特别是仓储模式想要拿到表达式进 ...

  2. ThinkPHP(3)SQL查询语句

    ThinkPHP中对查询语句,包含了基本的查询方式.表达方式.快速查询.区间查询.组合查询.SQL查询.动态查询和子查询. 一.查询方式 ThinkPHP提供了三种基本的查询方式:字符串条件查询.索引 ...

  3. ThinkPHP连接sql server数据库

    亲身经历,在网上找连接sql server数据库的方法,还是不好找的,大多数都是照抄一个人的,而这个人的又写的不全,呵呵,先介绍一下我连接的方法吧.如果你是用THINKPHP连接,那么最重要的就是配置 ...

  4. thinkphp 防止sql注入

    防止SQL注入 对于WEB应用来说,SQL注入攻击无疑是首要防范的安全问题,系统底层对于数据安全方面本身进行了很多的处理和相应的防范机制,例如: $User = M("User") ...

  5. thinkphp中的类库与引用import引入机制

    ThinkPHP的类库包括基类库和应用类库 控制器类 模块名+Action 例如 UserAction.InfoAction 模型类 模型名+Model 例如 UserModel.InfoModel ...

  6. thinkphp 打印sql语句方法

    thinkphp 打印数据use think\Db; 引用db 需要查询的sql语句连锁查询 db()->table('business_order')->alias('o')->j ...

  7. ThinkPHP使用SQL函数进行查询

    //SQL函数查询 $products=$pro->where(array("FIND_IN_SET('".$type."',type)",'num'=& ...

  8. ThinkPHP中SQL调试方法

    $admin = D('Admin'); $info = $admin->field('`lastlogintime`,`lastloginip`')->where(array('user ...

  9. ThinkPHP - 自定义扩展类库

    首先在想要使用类库的地方建立文件夹,文件名称随意,不能使用class 然后在配置文件中: 'AUTOLOAD_NAMESPACE' => array( 'Lib' => './Lib', ...

随机推荐

  1. 九度OJ 打印日期 (模拟)

    题目1186:打印日期 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4284 解决:1483 题目描写叙述: 给出年分m和一年中的第n天,算出第n天是几月几号. 输入: 输入包含两个整数 ...

  2. Hyper-V如何应用新的网卡

    最近新装了块网卡,可是在Hyper-V的虚拟机设置里怎么也找不到如何应用这个新网卡.   把我郁闷坏了. 偶尔点点,才发现原来不是在虚拟机的设置里面,而是在上面的一级设置. 新建完后就可以在虚拟机的网 ...

  3. js条件语句之职责链数组

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. SSO是什么?

    SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信仸的应用系统.它包括可以将这次主要的登录映射到其他应用中用亍同一个用户的登录的机制 ...

  5. SpringMVC的入门例子

    MVC框架是什么 模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中解耦.通常,模型负责封装应用程序数 ...

  6. 28种CSS3炫酷载入动画特效

    这是一组效果很炫酷的纯CSS3 Loading载入动画特效.这组loading动画共同拥有27种不同的效果.每一种loading动画都是通过CSS3的keyframes帧动画来完毕的,每个载入动画都构 ...

  7. HTTP协议是如何通信的

    一.什么是HTTP协议 HTTP协议是HyperText Transfer Protocol的缩写,即超文本传输协议.是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何 ...

  8. linux FTP配置详解

    一.vsftpd说明: LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问 ...

  9. Web Service——CXF发布REST服务

    1. 什么是REST REST,英文representational state transfer(表象性状态转变)或者表述性状态转移,REST是web服务的一种架构风格,使用HTTP.URI.XML ...

  10. 如何在Win8中设置虚拟热点共享上网(转)

    摘自:http://www.enet.com.cn/article/2013/0408/A20130408273749.shtml 在Windows 7中,我们可以通过网络与共享中心的“设置新的连接和 ...