PDO数据库引擎
PDO概述
1.PDO是一种数据库访问抽象层,你不必使用以前的 mysqli_xx 之类只能访问 mysql数据库。使用PDO可以连接mysql、msssql、oracle等等,而不必重写代码。
2.PDO也是现在PHP推荐和默认的数据库连接引擎,更为先进。
3.PDO默认情况下需要在PHP5.1以上的版本运行。
连接MySQL
1.使用PDO类来连接MySQL数据库。在PDO的构造参数里,传递数据库信息
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
} catch (PDOException $e) {
//输出错误信息
echo $e->getMessage();
}
增删改查
1.使用exec()方法增删改一条记录,返回影响行数。
(1)删除:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//删除
echo $pdo->exec("DELETE FROM one WHERE id='1'");
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
返回1代表删除成功
(2)修改:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//修改
$pdo->exec("UPDATE one SET user='xixi' WHERE id='1'");
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
2.使用query()方法设置字符集。
设置字符集后修改
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//修改
$pdo->exec("UPDATE one SET user='王西西' WHERE id='1'");
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
(3)新增:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//新增
$pdo->exec("INSERT INTO one (user, math, english, chinese, create_time) VALUES ('西西', 88, 88, 88, NOW())");
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
3.使用 query()方法获取准备对象
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//得到准备对象
$stmt = $pdo->query($sql, PDO::FETCH_NUM);
//输出准备对象
var_dump($stmt);
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
准备对象结果:
object(PDOStatement)[2]
public 'queryString' => string 'SELECT * FROM one' (length=17)
4.使用fetch()方法可以得到当前指针的记录。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//获取当前指针记录,并将指针下移一行
$stmt = $pdo->query($sql, PDO::FETCH_NUM);
//输出指针记录
var_dump($stmt->fetch());
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
第一行指针记录结果:
array (size=6)
0 => string '1' (length=1)
1 => string '王西西' (length=9)
2 => string '90' (length=2)
3 => string '90' (length=2)
4 => string '90' (length=2)
5 => string '2018-02-28 14:27:03' (length=19)
5.使用while循环遍历记录。
6. 使用PDO::FETCH_ASSOC参数,可以选择格式化结果,相对应的还有PDO::FETCH_NUM,默认为:PDO::FETCH_BOTH。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//得到准备对象
$stmt = $pdo->query($sql, PDO::FETCH_NUM);
while ($row = $stmt->fetch()) {
print_r($row);
}
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
FETCH_NUM以索引数组来显示源代码查看
Array
(
[0] => 1
[1] => 王西西
[2] => 90
[3] => 90
[4] => 90
[5] => 2018-02-28 14:27:03
)
Array
(
[0] => 2
[1] => 西西
[2] => 88
[3] => 88
[4] => 88
[5] => 2018-02-28 14:33:17
)
7.使用fetchAll()一次性输出所有记录。
//一次性输出所有数据,如果量大的话,压力大,不推荐
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//得到准备对象
$stmt = $pdo->query($sql);
print_r($stmt->fetchAll());
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
输出结果:
Array
(
[0] => 1
[1] => 王西西
[2] => 90
[3] => 90
[4] => 90
[5] => 2018-02-28 14:27:03
)
Array
(
[0] => 2
[1] => 西西
[2] => 88
[3] => 88
[4] => 88
[5] => 2018-02-28 14:33:17
)
8.使用fetchObject()方法用对象模式输出。
//对象形式输出记录
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//得到准备对象
$stmt = $pdo->query($sql);
while ($object = $stmt->fetchObject()) {
echo $object->user;
echo '<br>';
}
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
打印每一个的user
王西西
西西
预处理语句
1.每次查询发送给 MySQL 服务器时,都必须解析该查询的语法,确保结构正确并能够执行。这是这个过程中必要的步骤,但也确实带来了一些开销。做一次是必要的,但如果反复地执行相同的查询,批量插入多行时就会加大了服务器的负担。准备语句会在服务器上缓存查询的语法和执行过程,而只在服务器和客户端之间传输有变化的列值,以此消除这些额外的开销。
2.PDO 为支持此特性的数据库提供了准备语句功能。因为 MySQL 支持这个特性,所有可以在适当时候使用准备语句。准备语句是使用两个方法实现的:prepare()负责准备要执行的查询,execute()使用一组给定的列参数返回地执行查询。
3.如果采用 prepare 和 execute 方法,还可以防止 SQL 注入等攻击。因为所有的变量都会被自动转义。
4.新增方式,删除和修改均用这模式。
新增方式:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//新增SQL语句
$sql = "INSERT INTO one (user, math, chinese, english, create_time) VALUES ('测试', 88, 88, 88, NOW())";
//获取准备对象把这个语句放进去
$stmt = $pdo->prepare($sql);
//执行
$stmt->execute();
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
5.使用 lastInsertId()方法可以得到最新新增的ID。
//获取最后新增的 ID
echo $pdo->lastInsertId();
6.使用 rowCount()方法获取增删改的影响行数
//增删改的影响行数
echo $stmt->rowCount();
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//新增SQL语句
$sql = "INSERT INTO one (user, math, chinese, english, create_time) VALUES ('测试1', 88, 88, 88, NOW())";
//获取准备对象把这个语句放进去
$stmt = $pdo->prepare($sql);
//执行
$stmt->execute();
//得到最新ID
echo $pdo->lastInsertId();
//影响行数
echo $stmt->rowCount();
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
返回值:
最新ID:4
影响行数:1
7.也可以使用fetchAll、fetch或fetchObject等方法遍历数据。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "SELECT * FROM one";
//获取准备对象
$stmt = $pdo->prepare($sql);
//必须执行SQL
$stmt->execute();
//遍历
while ($obj = $stmt->fetchObject()) {
var_dump($obj);
}
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
查询结果:
object(stdClass)[3]
public 'id' => string '1' (length=1)
public 'user' => string '王西西' (length=9)
public 'math' => string '90' (length=2)
public 'chinese' => string '90' (length=2)
public 'english' => string '90' (length=2)
public 'create_time' => string '2018-02-28 14:27:03' (length=19)
object(stdClass)[4]
public 'id' => string '2' (length=1)
public 'user' => string '西西' (length=6)
public 'math' => string '88' (length=2)
public 'chinese' => string '88' (length=2)
public 'english' => string '88' (length=2)
public 'create_time' => string '2018-02-28 14:33:17' (length=19)
8.重复执行一个 SQL 查询,通过每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高。使用预处理语句,首先需要在数据库服务器中先准备好“一个 SQL 语句”,但并不需要马上执行。PDO 支持使用“占位符”语法,将变量绑定到这个预处理的 SQL 语句中。另外,PDO 几乎为所支持的所有数据库提供了命令占位符模拟,甚至可以为生来就不支持该概念的数据库模拟预处理语句和绑定参数。这是 PHP 向前迈进的积极一步,因为这样可以使开发人员能够用 PHP 编写“企业级”的数据库应用程序,而不必特别关注数据库平台的能力。
9.对于一个准备好的 SQL 语句,如果在每次执行时都要改变一些列值,这种情况必须使用“占位符”而不是具体的列值,或者只要有需要使用变量作为值的地方,就先使用占位符替代,准备好一个没有传值的 SQL 语句,在数据库服务器的缓存区等待处理,然后再去单独赋给占位符具体的值,再通过这个准备好的预处理语句执行。在 PDO 中有两种使用占位符的语法:“命令参数”和“问号参数”,使用哪一种语法看个人的喜好。
10.使用?号语法新增多条记录。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "INSERT INTO one (user, math, chinese, english, create_time) VALUES (?, ?, ?, ?, NOW())";
//获取准备对象
$stmt = $pdo->prepare($sql);
//执行
$stmt->execute(array('西西1', 77, 77, 77));
$stmt->execute(array('西西2', 88, 88, 88));
$stmt->execute(array('西西3', 99, 99, 99));
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
11.使用:名称语法新增多条记录
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = "INSERT INTO one (user, math, chinese, english, create_time) VALUES (:user, :math, :chinese, :english, NOW())";
//获取准备对象
$stmt = $pdo->prepare($sql);
//执行
$stmt->execute(array(':user'=>'西西4', ':math'=>77, ':chinese'=>77, ':english'=>77));
$stmt->execute(array(':user'=>'西西5', ':math'=>88, ':chinese'=>88, ':english'=>88));
$stmt->execute(array(':user'=>'西西6', ':math'=>99, ':chinese'=>99, ':english'=>99));
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
预处理扩展
1.使用:名称实现变量查询。
查询方式一:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = 'SELECT * FROM one WHERE id=:id';
//获得准备对象
$stmt = $pdo->prepare($sql);
//执行查询(查询数组查询第一条)
$stmt->execute(array(':id'=>1));
//输出
var_dump($stmt->fetchObject());
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
查询ID=1结果
object(stdClass)[3]
public 'id' => string '1' (length=1)
public 'user' => string '王西西' (length=9)
public 'math' => string '90' (length=2)
public 'chinese' => string '90' (length=2)
public 'english' => string '90' (length=2)
public 'create_time' => string '2018-02-28 14:27:03' (length=19)
查询方式二:
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = 'SELECT * FROM one WHERE id=?';
//获得准备对象
$stmt = $pdo->prepare($sql);
//执行查询
$stmt->execute(array(1));
//输出
var_dump($stmt->fetchObject());
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
查询ID=1结果
object(stdClass)[3]
public 'id' => string '1' (length=1)
public 'user' => string '王西西' (length=9)
public 'math' => string '90' (length=2)
public 'chinese' => string '90' (length=2)
public 'english' => string '90' (length=2)
public 'create_time' => string '2018-02-28 14:27:03' (length=19)
2.使用bindValue()方法绑定查询参数。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query("SET NAMES UTF8");
//SQL语句
$sql = 'SELECT * FROM one WHERE id=:id';
//获得准备对象
$stmt = $pdo->prepare($sql);
//参数绑定
$stmt->bindValue(':id', 1);
//执行查询
$stmt->execute();
//输出
var_dump($stmt->fetchObject());
} catch (PDOException $e) {
//错误信息
echo $e->getMessage();
}
查询ID=1结果
object(stdClass)[3]
public 'id' => string '1' (length=1)
public 'user' => string '王西西' (length=9)
public 'math' => string '90' (length=2)
public 'chinese' => string '90' (length=2)
public 'english' => string '90' (length=2)
public 'create_time' => string '2018-02-28 14:27:03' (length=19)
3.bindParam()方法和bindValue()一样,唯一的区别就是bindParam只能传递变量,而bindValue均可。
事务处理
1.所谓事务,说白了,就是一组SQL关联的操作,如果其中一条SQL有误没有执行,而其他的SQL都会撤销执行。
2.PDO为能够执行事务的数据库提供了事务支持。有3个PDO 方法可以完成事务任务:beginTransaction()、commit()和 rollback()。
3.MySQL 数据库类型为 InnoDB 方可启用事务处理。
<?php
try {
//PDO连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456'); //设置字符集
$pdo->query("SET NAMES UTF8"); //设置错误异常处理方式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //开启事务
$pdo->beginTransaction(); $pdo->exec('UPDATE one SET math=math+30 WHERE id=1');
$pdo->exec('UPDATE one SET math=math-30 WHERE id=2'); //提交,都正确了
$pdo->commit(); } catch (PDOException $e) {
//错误信息
echo $e->getMessage();
//回滚,撤销所有SQL执行
$pdo->rollBack();
}
错误信息:
SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in '(`xixi`.`one`.`math` - 30)'
PDO数据库引擎的更多相关文章
- mysql 数据库引擎
一.数据库引擎 数据库引擎是用于存储.处理和保护数据的核心服务.利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求. 使用数据库引擎创建用于联机事务处理或 ...
- mysql 有两种数据库引擎发音
mysql 有两种数据库引擎 一种是 MyISAM,一种是 InnoDB MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db&quo ...
- sql 2012日志文件频繁出现:svchost (4892) 数据库引擎已分离数据库(1、C:\Windows\system32\LogFiles\Sum\Current.mdb)
svchost (4892) 数据库引擎已分离数据库(1.C:\Windows\system32\LogFiles\Sum\Current.mdb).(时间=0 秒) 内部计时序列: [1] 0.00 ...
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- 常用mysql数据库引擎——MyISAM和InnoDB区别
背景: 昨天做项目时,发现使用事务后回滚不了,后来把数据库引擎从MyISAM换成InnoDB后果断好了,如下图: 正文: MyISAM和InnoDB是mysql常用的数据库引擎,他们的区别如下: 数据 ...
- 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问
简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL S ...
- [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
- [转]MySQL数据库引擎
经常用MySQL数据库,但是,你在用的时候注意过没有,数据库的存储引擎,可能有注意但是并不清楚什么意思,可能根本没注意过这个问题,使用了默认的数据库引擎,当然我之前属于后者,后来成了前者,然后就有了这 ...
- MySQL的数据库引擎
Mysql的数据库引擎有很多,最重要的就是MyISAM.InnoDB.heap(memory),此外还有BDB.archive数据表.csv.ndb.federated InnoDB 优点: 1. ...
随机推荐
- jformdesigner 开发
jformdesigner 开发 1● 破解jformadesigner 脑补 2● 建立jfd文件 3● 移动关联 <file leaf-file-name=" ...
- 记录一次面试中的HTTP请求相关问题
1.HTTP中的状态码分别代表什么 比较基础,自行百度. 2.HTTP请求,响应头部content-length用来做什么的 答:Content-Length首部告诉浏览器报文中实体主体的大小.这 ...
- Win10系列:JavaScript 的 WinJS库
WinJS 库是由 CSS 和 JavaScript 文件组成的.使用Visual Studio 2012新建一个JavaScript 的Windows应用商店的空白应用程序项目,在项目的引用管理器中 ...
- win10与centos7的双系统U盘安装(二:安装以及配置centos系统)
继续第一篇的讲解,接着就是要进入第二部分——安装以及配置centos系统 特别提醒在安装centos之间,注意自己的win10系统进行备份,便于回复安装失败后的系统 1:安装前准备 安装前准备主要是两 ...
- what’s this?
jdk,jre,jvm三者区别:JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! 包括了java运行环境 JRE(Java Runtim ...
- FFT模板(无讲解)
#include<bits/stdc++.h> using namespace std; ; const double pi=3.1415926535898; ],len; struct ...
- Mysql 数据库意向锁意义
锁:对 “某种范围” 的数据上 “某种锁”1.“某种范围”:行.表 2.“某种锁”2.1 共享锁Shared Locks(S锁)1.兼容性:加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁 ...
- linux 基础储备
ls命令是Linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的用法ls /home 这个命令不但可以添加用户到系统,而且可以默认为新用户 ...
- 归并排序(Merging Sort)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 6.4 C++提取子字符串及字符串的比较
参考:http://www.weixueyuan.net/view/6393.html 总结: 函数substr可以提取string字符串中的子字符串,该函数有两个参数,第一个参数为需要提取的子字符串 ...