# 一、php封装pdo操作类
## 为什么使用PDO?
简单粗暴啊,不同数据库,只需要更改下数据库连接方式即可,通俗来说,就是万金油!
而且PDO更安全!
具体和其它操作数据库的扩展的不同,可以去查询
# 一.如何安装PDO连接数据库
PDO从PHP5.1开始,就携带了此扩展,如果你的PHP不支持,请升级到5.1或者更高版本
开启方式:找到php.ini
如果你的php版本<5.3
你需要加入以下内容:
`extension=php_pdo.dll`
如果你的PHP版本>=5.3
你只需要在配置文件加入以下内容:
如果你操作的是其它数据库,请选择其它扩展
如果你的页面存在此内容,请删除其前面的 ; 以打开此扩展
此时,重启你的PHP即可!
如果你使用的是本教程推荐的phpstudy,你可以更简单的开启pdo扩展
选择其它选项->PHP扩展及设置->PHP扩展->如果已经打钩说明已经开启,否则点击此扩展,然后点击重启即可
# 二.PDO如何连接数据库
我们直接来看个例子
```
$db = new PDO("mysql:host=localhost;dbname=myblog","root","root");
var_dump($db);
$res = $db->query('select * from od_admin ');
$res = $res->fetchAll(PDO::FETCH_ASSOC);
echo "";
print_r($res);
echo "";
exit;
```
#### 注意,请自行在数据库myblog中的admin表添加数据
我们可以看到,他输出了三条数据,这三条数据是我刚才加入的数据
这样,表示我们已经成功连接到数据库,并且执行了简单的sql语句,我们来分析下
```
$db = new PDO("mysql:host=localhost;dbname=myblog","root","root");
```
这里的localhost就是我们的数据库地址,也可以写作 127.0.0.1
dbname 就填写你的数据库名词
最后面两个参数是账号 密码,根据你实际情况填写即可!
```
$db->query('select * from od_admin ');
```
$db,就是我们刚才实例化的PDO类的对象,query就是PDO底层给我提供的执行sql语句的方法
这句就是查询所有admin表下的数据
```
$res = $res->fetchAll(PDO::FETCH_ASSOC);
```
这句的意思就是说将返回所有的数据以数组的方式返回,并且如果不加 FETCH\_ASSOC ,
返回的数据是字段为一个元素,值为一个元素,
# 三.封装PDO操作类 (这才是重点)
我们开发中,并不需要每次都去连接数据库进行操作,而且我们想使用一些便捷的查询语句,而不是
每次都去写sql语句怎么办?
我们可以封装成一个数据库操作类,每次使用的时候实例化他即可!
①.我们先写一个名字叫做DbDriver.php的脚本
②.我们说过,类的关键词是class, 并且+类名和花括号,所以,你应该有一下代码
```
<?php
class DbDriver
{
}
```
③.接下来我们开始分析如何去写这个类
首先呢,连接数据库,肯定要有数据库地址,账号密码等,所以我们申明一个属性,叫做config
```
protected $config;
```
我们连接数据库成功,肯定还要有一个属性去接受数据库连接成功后返回对象
```
private $pdo;
```
接下来我们写连接的方法
我们在写这种工具类的时候,一般情况下,最好是实例化好这个类的时候,就可以使用了
所以,我们在构造方法里去写数据库连接
```
function __construct($config)
{
//判断这个属性是否为空,为空则去实例化,否则直接返回
if(is_null($this->pdo)){
//把传递过来配置文件传递赋给属性
$this->config = $config;
$dsn = 'mysql:dbname=' . $this->config["DBNAME"] . ';host=' . $this->config["HOST"] . '';
try {
//设置输出编码为UTF8
$this->pdo = new PDO($dsn, $this->config["USER"], $this->config["PWD"], array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
//设置 ATTR_ERRMODE 的值为ERRMODE_EXCEPTION(抛出异常)
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//这是值取消 PHP本地模拟prepare,也就是会把参数和sql发送给数据库去进行转义处理[防注入]
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
//这两个方法是PDO提供的,一个是获取错误内容,一个是错误位置
throw new PDOException($e->getMessage(), $e->getCode());
}
}else{
return $this->pdo;
}
}
```
这也,我们就在实例化的时候实例化好了数据库操作类!
下面封装了一些常用的sql操作方法
### 大家可以直接使用
### 大家可以直接使用
### 大家可以直接使用
```
<?php
namespace Db;
use PDOException;
use PDO;
/**
* Created by PhpStorm.
* User: Wei
* Date: 2017/5/22
* Time: 9:12
*/
class DbDriver extends PDOException
{
protected $config;
private $pdo;
public $lastSql = '';
/**
* 事务开启状态
* @var
*/
public $Transactions = false;
function __construct()
{
if(empty($this->pdo)){
include_once "../../Lib/function.php";
$config = load_config('../../Config/config.php');
$this->config = $config;
$dsn = 'mysql:dbname=' . $this->config["DBNAME"] . ';host=' . $this->config["HOST"] . '';
try {
$this->pdo = new PDO($dsn, $this->config["USER"], $this->config["PWD"], array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->bConnected = true;
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), $e->getCode());
}
}else{
return $this->pdo;
}
}
/**
* 关闭链接
*/
public function closeConnect()
{
$this->pdo = null;
}
/**
* 转义字符串
* @param $string
* @return bool
* @throws Exception
*/
public function escapeString($string)
{
//参数分析
if (!$string) {
throw new Exception('$string parameter is null');
}
$_quoteString = $this->pdo->quote($string);
if ($_quoteString === false) {
throw new Exception('the driver does not support quoting in this way');
} else {
return $_quoteString;
}
}
/**
* 获取数据库错误信息
* @return mixed
*/
public function errorMsg()
{
$info = $this->pdo->errorInfo();
return $info[2];
}
/**
* 获取数据库错误信息代码
*
* @access public
* @return int
*/
public function errorNum()
{
return $this->pdo->errorCode();
}
/**
* 得到插入id
* @return string
*/
public function lastInsertId()
{
return $this->pdo->lastInsertId();
}
/**
* 得到最近执行的一条sql语句
* @return string
*/
public function getLastSql()
{
return $this->lastSql;
}
/**
* 开始事务
* @return bool
*/
public function startTrans()
{
if ($this->Transactions == false) {
$this->pdo->beginTransaction();
$this->Transactions = true;
}
return true;
}
/**
* 提交事务
* @return bool
*/
public function commit()
{
if ($this->Transactions == true) {
if ($this->pdo->commit()) {
$this->Transactions = false;
}
}
return true;
}
/**
* 事务回滚
*/
public function rollback()
{
if ($this->Transactions == true) {
if ($this->pdo->rollBack()) {
$this->Transactions = false;
}
}
}
/**
* @param $sql
* @return PDOStatement
* @throws Exception|boolean
*/
public function query($sql)
{
if (!$sql) {
throw new Exception('sql parameter is null');
}
$this->lastSql = $sql;
$result = $this->pdo->query($sql);//返回 true or false
return $result->fetch(PDO::FETCH_ASSOC);;
}
/**
* 返回执行sql后影响的行数
* @param $sql
* @return int
* @throws Exception
*/
public function exec($sql)
{
if (!$sql) {
throw new Exception('sql parameter is null');
}
$this->lastSql = $sql;
$result = $this->pdo->exec($sql);
return $result;
}
public function getRow($sql)
{
if (!$sql) {
throw new Exception('sql parameter is null');
}
$this->lastSql = $sql;
$result = $this->pdo->query($sql);
if ($result === false) {
throw new Exception('sql execute failed ' . $this->getLastSql());
}
$row = $result->fetch(PDO::FETCH_ASSOC);
$result = null;
return $row;
}
public function getAll($sql)
{
if (!$sql) {
throw new Exception('sql parameter is null');
}
$this->lastSql = $sql;
$result = $this->pdo->query($sql);
if ($result === false) {
throw new Exception('sql execute failed ' . $this->getLastSql());
}
return $result->fetchAll(PDO::FETCH_ASSOC);
}
/**
* @param $table
* @param $arr_data
* @return bool
* @throws Exception
*/
public function insert($table, $arr_data)
{
if (!$table || !$arr_data) {
throw new Exception('table name and arr_data are null');
}
$keys_arr = [];
$values_arr = [];
$replace_values = [];
foreach ($arr_data as $key => $value) {
$keys_arr[] = '`' . $key . '`';
$values_arr[] = ':' . $key;
$replace_values[':' . $key] = $value;
}
$keys_str = implode(',', $keys_arr);
$values_str = implode(',', $values_arr);
$sql = sprintf('insert into `%s` (%s) values (%s)', $table, $keys_str, $values_str);
$this->lastSql = $sql;
$statement = $this->pdo->prepare($sql);
return $statement->execute($replace_values);
}
public function delete($table, $sql_where)
{
if (!$table || !$sql_where) {
throw new Exception('table name and sql_where are null');
}
$sql = sprintf('delete from `%s` where %s', $table, $sql_where);
$this->lastSql = $sql;
$result = $this->pdo->exec($sql);
if ($result === false) {
throw new Exception('sql execute failed ' . $this->getLastSql());
}
return $result;
}
public function update($table, $set, $sql_where)
{
if (!$table || !$sql_where) {
throw new Exception('table name and sql_where are null');
}
$sql = sprintf('update `%s` %s %s', $table, $set, $sql_where);
$this->lastSql = $sql;
$result = $this->pdo->exec($sql);
if ($result === false) {
throw new Exception('sql execute failed ' . $this->getLastSql());
}
return $result;
}
public function select($fields = '*', $table, $sql_where)
{
$fields_str = "*";
$fields_arr = [];
$temp = [];
if ($fields != '*' && !empty($fields)) {
$fields_arr = explode(',', $fields);
foreach ($fields_arr as $k => $v) {
$temp[] = '`' . $v . '`';
}
$fields_str = implode(',', $temp);
}else{
$fields_arr = "*";
}
if(!empty($sql_where)){
$sql = sprintf('select %s from %s where %s ', $fields_str, $table, $sql_where);
}else{
$sql = sprintf('select %s from ', $fields_str, $table);
}
$this->lastSql = $sql;
$result = $this->pdo->query($sql);
if ($result === false) {
throw new Exception('sql execute failed ' . $this->getLastSql());
}
return $this->fetch($result);
}
protected function fetch($result){
return $result->fetchAll(PDO::FETCH_ASSOC);
}
}
```
下面贴出来如何调用这个类
```
include "DbDriver.php";
$config = array(
//'配置项'=>'配置值'
'TYPE'=>'mysql',
'HOST'=>'127.0.0.1',
'DBNAME'=>'myblog',
'USER'=>'root',
'PWD'=>'root',
'PORT'=>'3306',
);
$pdo = new DbDriver($config);
$res = $pdo->select("id",'admin','');
echo $pdo->errorInfo();
var_dump($res);die;
```
- 一、php封装pdo操作类
- 二、PHP 3des 加密类
- 三、PHP 调用webserver服务器详解
- 四、命名空间的USE 和 require include require_once include_once详解
- 五、thinkphp集成小米推送
- 六、PHP实现上传文件进度条
- 七、PHP根据地址新建路径下载地址文件
- 八、PHP使用AJAX上传图片即时预览
- 九、强制CDN更新静态资源文件
- 十、THINKPHP集成支付宝APP支付并提供接口
- 十一、THINKPHP集成支付宝APP支付 错误详解 支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247 dengg
- 十二、PHP生成二维码图片或带logo的二维码
- 十三、蛋疼的bom头 恶心了我好久[json无法解析]
- 十四、php windows安装imagick扩展
- 十五、windows下Composer的安装与使用
- 十六、[2017]最新支付宝wap支付集成THINKPHP3.2.3 demo
- 十七、VUE.JS 安装与发布
- 十八、PHP 执行 linux 命令行 操作示例
- 十九、关于CSP 减少XSS攻击的介绍