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数据库引擎的更多相关文章

  1. mysql 数据库引擎

    一.数据库引擎 数据库引擎是用于存储.处理和保护数据的核心服务.利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求. 使用数据库引擎创建用于联机事务处理或 ...

  2. mysql 有两种数据库引擎发音

    mysql 有两种数据库引擎 一种是 MyISAM,一种是 InnoDB MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db&quo ...

  3. 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 ...

  4. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  5. 常用mysql数据库引擎——MyISAM和InnoDB区别

    背景: 昨天做项目时,发现使用事务后回滚不了,后来把数据库引擎从MyISAM换成InnoDB后果断好了,如下图: 正文: MyISAM和InnoDB是mysql常用的数据库引擎,他们的区别如下: 数据 ...

  6. 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问

    简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL S ...

  7. [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  8. [转]MySQL数据库引擎

    经常用MySQL数据库,但是,你在用的时候注意过没有,数据库的存储引擎,可能有注意但是并不清楚什么意思,可能根本没注意过这个问题,使用了默认的数据库引擎,当然我之前属于后者,后来成了前者,然后就有了这 ...

  9. MySQL的数据库引擎

    Mysql的数据库引擎有很多,最重要的就是MyISAM.InnoDB.heap(memory),此外还有BDB.archive数据表.csv.ndb.federated InnoDB   优点: 1. ...

随机推荐

  1. python 首次安装 报错

    最近python很火,想在空余时间学习一波,但是安装完Python后运行发现居然报错了,错误代码是0xc000007b,于是通过往上查找发现是因为首次安装Python缺乏VC++库的原因 错误提示如下 ...

  2. 最佳加法表达式(dp)

    题目描述: 有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 (本题只能用于整数) 解题思路: 假定数字串长度是n,添完加号 ...

  3. Win10系列:VC++绘制几何图形2

    新建了Direct2D中的资源后,接下来初始化用于绘制图形的应用窗口.在解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的 ...

  4. 对大学生学习Linux系统的七项实用建议

    你现在的工作是你所渴望的理想工作吗?或者说这只是你整个职业生涯中的一段插曲?虽然我们每个人都不一定能够说出自己所想的是什么,但是我们心里其实跟明镜似的.相信许多人对于自己喜好的工作投入精力不会有问题, ...

  5. 每天CSS学习之caption-side

    caption-side是CSS2的属性,其作用是规定标题的位置在表格的上面还是下面. 1.top:默认值,将表格标题定位在表格之上.如下例子: caption{ caption-side:top; ...

  6. zabbix安装部署(server部分)

    Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...

  7. 理解AXI Quad Serial Peripheral Interface(SPI) IP核

    reference :   PG153-AXI Quad SPI v3.2 LogiCORE IP Product Guide.pdf 在使用MicroBlaze过程中,调用了此IP,所以有必须仔细学 ...

  8. LeetCode 43 字符串相乘

    题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  9. IE浏览器兼容的处理方式之一,使用特殊的注释 <!--[if IE]> ....<![endif]-->

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

  10. DevExpress WPF v18.2新版亮点(五)

    买 DevExpress Universal Subscription  免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...