封装PDO类,方便使用:

<?php
header('content-type:text/html;charset=utf-8');
/**
* 封装PDODB类
*/
// 加载接口
// include './I_DB.interface.php';
class PDODB{
/**
* 定义相关属性
*/
private $host; //主机地址
private $port; //端口号
private $user; //用户名
private $pass; //密码
private $dbname; //数据库名
private $charset;//字符集
private $dsn; //数据源名称
private $pdo; //用于存放PDO的一个对象
// 静态私有属性用于保存单例对象
private static $instance; /**
* [__construct 构造方法]
* @param [array] $config [配置数组]
*/
private function __construct($config) {
// 初始化属性
$this->initParams($config);
// 初始化dsn
$this->initDSN();
// 实例化PDO对象
$this->initPDO();
// 初始化PDO对象的属性
$this->initAttribute();
} /**
* [getInstance 获取PDO单例对象的公开方法]
* @param [array] $config [description]
* @return [PDOobject] self::$instance [pdo对象]
*/
public static function getInstance($config) {
if (!self::$instance instanceof self) {
self::$instance = new self($config);
}
return self::$instance;
} /**
* [initParams 初始化属性]
* @param [array] $config [配置数组]
*/
private function initParams($config) {
$this->host = isset($config['host'])?$config['host']:'localhost';
$this->port = isset($config['port'])?$config['port']:'3306';
$this->user = isset($config['user'])?$config['user']:'root';
$this->pass = isset($config['pass'])?$config['pass']:'';
$this->dbname = isset($config['dbname'])?$config['dbname']:'';
$this->charset = isset($config['charset'])?$config['charset']:'utf8';
}
/**
* [initDSN 初始化dsn]
*/
private function initDSN() {
$this->dsn = "mysql:host=$this->host;port=$this->port;dbname=$this->dbname;charset=$this->charset";
} /**
* [initPDO 实例化PDO对象]
* @return [boolean] [false|none]
*/
private function initPDO() {
// 在实例化PDO对象的时候自动的走异常模式(也是唯一走异常模式的地方)
try{
$this->pdo = new PDO($this->dsn,$this->user,$this->pass);
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
} /**
* [initAttribute 初始化PDO对象属性]
* @return [boolean] [false|none]
*/
private function initAttribute() {
// 修改错误模式为异常模式
$this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} /**
* [my_error 输出异常信息]
* @param [PDOException] $e [异常对象]
* @return [boolean] [false|none]
*/
private function my_error($e,$sql) {
echo "执行sql语句失败!<br/>";
echo "错误语句为:",$sql,"<br/>";
echo "错误的代码是:",$e->getCode(),"<br/>";
echo "错误的信息是:",$e->getMessage(),"<br/>";
echo "错误的脚本是:",$e->getFile(),"<br/>";
echo "错误的行号是:",$e->getLine(),'<br/>';
return false;
} /**
* [my_query 执行一条sql语句,实现增删改]
* @param [string] $sql [sql语句]
* @return [array] $result [资源结果集]
*/
public function my_query($sql) {
// 其实就是调用pdo对象中的exec方法
try{
$result = $this->pdo->exec($sql);
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $result;
} /**
* [fetchAll 查询所有]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchAll($sql) {
// 其实就是调用PDOStatment对象里面的fetchAll方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $result;
} /**
* [fetchRow 查询一条]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchRow($sql) {
// 其实就是调用PDOStatment对象里面的fetch方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $result;
} /**
* [fetchColumn 查询单行单列]
* @param [string] $sql [sql语句]
* @return [arry] $result [资源结果集]
*/
public function fetchColumn($sql) {
// 其实就是调用PDOStatment对象里面的fetchColumn方法
try{
$stmt = $this->pdo->query($sql);
$result = $stmt->fetchColumn();
// 关闭游标,释放结果集
$stmt->closeCursor();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $result;
}
/**
* [my_prepare sql预处理]
* @param [string] $sql [有占位符的sql语句]
* @param [array] $arr [对象数组]
*/
public function my_prepare($sql,$arr) {
try{
$stmt = $this->pdo->prepare($sql);
$result = $stmt->execute($arr);
}catch(PDOException $e){
$this->my_error($e,$sql);
}
}
/**
* [my_rowCount 查询结果中的总行数]
* @param [string] $sql [有占位符的sql语句]
* @return [string] $count [查询结果的总行数]
*/
public function my_rowCount($sql) {
try{
$stmt = $this->pdo->query($sql);
$count = $stmt->rowCount();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $count;
} /**
* [my_rowCount 获取查询结果中的总列数(总字段数)]
* @param [string] $sql [有占位符的sql语句]
* @return [string] $count [获取查询结果中的总列数(总字段数)]
*/
public function my_columnCount($sql) {
try{
$stmt = $this->pdo->query($sql);
$count = $stmt->columnCount();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $count;
}
/**
* [fetchObject 查询一个对象]
* @param [string] $sql [查询一行的sql语句]
* @return [object] $object [目标对象]
*/
public function fetchObject($sql) {
try{
$stmt = $this->pdo->query($sql);
//$stmt->fetch(PDO::FETCH_BOJ);
$object = $stmt->fetchObject();
}catch(PDOException $e) {
$this->my_error($e,$sql);
}
return $object;
} /**
* [__clone 私有化克隆方法,保护单例模式]
*/
private function __clone() {} /**
* [__set 为一个不可访问的属性赋值的时候自动触发]
* @param [string] $name [属性名]
* @param [mixed] $value [属性值]
*/
public function __set($name,$value) {
$allow_set = array('host','port','user','pass','dbname','charset');
if(in_array($name,$allow_set)) {
//当前属性可以被赋值
$this->$name = $value;
}
} /**
* [__get *获得一个不可访问的属性的值的时候自动触发]
* @param [string] $name [属性名]
* @return [string] $name的value [该属性名的值]
*/
public function __get($name) {
$allow_get = array('host','port','user','pass','dbname','charset');
if (in_array($name,$allow_get)) {
return $this->$name;
}
} /**
* [__call 访问一个不可访问的对象方法的时候触发]
* @param [string] $name [属性名]
* @param [array] $argument [参数列表]
*/
public function __call($name, $argument) {
echo "对不起,您访问的".$name."()方法不存在!<br/>";
} /**
* [__callstatic 访问一个不可访问的类方法(静态方法)的时候触发]
* @param [string] $name [属性名]
* @param [array] $argument [参数列表]
*/
public static function __callStatic($name, $argument) {
echo "对不起,您访问的".$name."()静态方法不存在!<br/>";
}
}

封装好的PDO类的更多相关文章

  1. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

  2. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  3. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  4. 一个PDO类

    下面是在网上借鉴的一个PDO类: <?php class Database{ private $host = DB_HOST; private $user = DB_USER; private ...

  5. 【Android】19.3 ContentProvider及安卓进一步封装后的相关类

    分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF ...

  6. SpringMVC 中,当前台传入多个参数时,可将参数封装成一个bean类

    在实际业务场景中,当前台通过 url 向后台传送多个参数时,可以将参数封装成一个bean类,在bean类中对各个参数进行非空,默认值等的设置. 前台 url ,想后台传送两个参数,userName 和 ...

  7. 第33天:封装自己的class类

    封装自己的class类,实现浏览器兼容. <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  8. Python_selenium封装一个浏览器引擎类

    Python_selenium封装一个浏览器引擎类 现在我们在编写一个类,叫浏览器引擎类(此例为:启动浏览器),将文件名命名为browser.py,代码下面通过更改一个字符串的值,运用if语句判断和控 ...

  9. PHP基于单例模式编写PDO类的方法

    一.单例模式简介 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 二.为什么要使用PHP单例模式? 1.php的应用主要在于数据库应用, 所以一个应用中会存在 ...

随机推荐

  1. mysql中的字符集和校对规则(mysql校对集)

    1.简要说明介绍 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则. MySql在collation提供较强的支持,oracel在这方面没查到相应的资料. 不同字符 ...

  2. python实现简单的百度翻译

    这段时间,一直在学python,想找点东西实现一下,练手,所以我想通过python代码来实现翻译,话不多说,看吧! 以chrome为例 1  打开百度翻译 https://fanyi.baidu.co ...

  3. 享元模式(Flyweight、FlyweightFactory)(围棋棋子共享)

    (使用共享对象可有效地支持大量的细粒度的对象.) 假设开发一个围棋程序,围棋程序的围棋的棋子包含了颜色.大小.位置等信息.在定义一个棋盘容器来存放这些棋子. 我们可以发现,棋盘的成员变量包含了一个棋子 ...

  4. python利用paramiko执行服务器命令

    话不多说直接上代码 封装连接 @staticmethod def connect(ip, server_user, server_port, server_path): ""&qu ...

  5. agc014F Strange Sorting

    这套题比较简单,以为自己能够独立A掉D和E,或许就能自己A掉F,看来还真是想多了 题意:给一个$n$的全排列,每次操作把$max(a[1],a[2],...,a[i]) = a[i]$的记为$high ...

  6. mybatis深入理解(一)-----Mybatis初始化机制详解

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 一. MyBatis的初始化做了什么 1.configuration ...

  7. 【JZOJ5231】【NOIP2017模拟A组模拟8.5】序列问题 线段树

    题面 100 在\(O(n^2)\)的基础上,我们可以用线段树来加速. 枚举了左端点之后,需要知道以这个左端点为起点的前缀max,前缀min. 这里只讨论前缀max,前缀min同理. 当我们倒序枚举左 ...

  8. 基础篇-1.4Java流程语句的基础

    1 条件语句 条件语句,即类似 if...else... 的语句,一个if语句包含了一个布尔表达式,以及一个或多个语句. if语句语法 if(布尔表达式) { // 布尔表达式为true时执行的语句块 ...

  9. swagger暴露程序接口文档

    Swagger2是一个帮助用户.团队.企业快速.高效.准确地生产API服务的工具组件,同时还提供了部分测试功能,它的官方网站是https://swagger.io/. 1.引入Maven <de ...

  10. linux学习 网络系统&文件查找

    被用来配置和操作网络系统的命令数目非常巨大,这里仅仅介绍一些经常会使用的 这一章会介绍ssh远程登录程序哦 ping 命令(掠过) traceroute 会显示主机到指定的主机要经过的跳数的网络流量列 ...