一、前言

PDO(PHP Data Object)提供了一个通用接口访问多种数据库,即抽象的数据模型支持连接多种数据库。

PDO扩展为PHP定义了一个访问数据库的轻量、持久的接口。其本身并不能实现任何数据库操作,必须使用一个特定的数据库PDO驱动访问数据库,实现PDO接口的每一种数据库驱动都能以正则扩展的形式把各自的特色表现出来。意味着不管使用哪种数据库,都可以使用同样一组API对数据库进行操作。

在PHP中,链接MySQL的几种方式:

  • MySQL系列函数(PHP 7已弃用)
  • MySQLi系列函数,是上面的增强版,增加了预编译和参数绑定等新特性
  • PDO

二、PDO预定义的类

详见:https://www.php.net/manual/zh/book.pdo.php

PDO、PDOStatement 和 PDOException

PDO类(代表一个PHP和数据库之间的链接)。

PDOStatement类(代表一条预处理语句以及语句执行后的联合结果集)。

PDOException类 (对Exception的简单重写)。

三、PDO参数绑定与与预编译

PHP使用prepare API默认不是使用参数绑定和预编译,主要是考虑最大兼容性问题,因为有些数据库不支持预编译功能,所以默认使用了SQL拼接来模拟预编译(转移、加单引号)。

如果使用了真正的预编译($pdo->setAttribute(PDO::ATTR_EMULATE_PERPARES, false); //使用本地预处理语句,而非模拟),客户端需要分两次发送:1、SQL模板;2、SQL查询参数,也就是多了一次网络请求开销,但并不会影响性能,因为预编译的过程只发生在第一次请求,一旦编译成功,第二次就能直接使用了,不需要二次编译(是同一Session,即每次请求中的多次调用时只存在一次预编译)。

MySQL支持预编译,但还是比较弱的,仅仅支持Session级别,PHP的每次请求都会是一次全新的会话,所以每次请求必然都需要重新做一次预编译。但是如果使用了连接池技术的话,就能让多次PHP请求使用同一数据连接Session,从而达到提高预编译性能的目的。

四、PDO事务处理

脚本结束或者一个连接要关闭时,如果还有一个未处理完的事务,PDO自动将其回滚。这对于脚本意外终止情况来说是一个安全方案。如果没有明确地提交事务,它将假设发生一些错误,为数据的安全执行回滚。

五、PDO效率问题

来自第三方测试:

PHP5.3、60多个表、2GB的数据,PDO的CURD效率比MySQL直连低5%~15%。

PDO开启长连接后负载高于MySQL直连且比较稳定,连接速度也有优势。

实际应用中,90%的程序是不会进行数据库迁移的,似乎PDO必要性也不大。

综上:推荐新应用中尝试使用PDO,旧应用则没有必要进行重构。其实目前主流框架底层基本是PDO实现。

PDO 小知识的更多相关文章

  1. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  2. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  3. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  4. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

  5. salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...

  6. Jquery:小知识;

    Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器   上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...

  7. HTML小知识---Label

    今天知道了一个html小知识: <input type="checkbox" id="chkVersion" />                 ...

  8. Unicode和汉字编码小知识

    Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...

  9. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

随机推荐

  1. 《MFC dialog中加入OpenGL窗体》

    <MFC dialog中加入OpenGL窗体> 最近学习了如何在MFC对话框程序中加入OpenGL窗体的方法,在这里将自己的实现过程归纳一下. 步骤零: 加入PictureControl控 ...

  2. SUDO_EDITOR

    目录 SUDO_EDITOR 参考 SUDO_EDITOR SUDO_EDITOR

  3. 基于scikitlearn的深度学习环境安装(三)(完整版)

    OS Linux  Ubuntu14.04 安装 pip (python2.7.9或以上自带pip) sudo apt-get install python-pip pip是python环境下安装包的 ...

  4. Jmeter_Http默认请求值

    1.线程组->配置原件->Http请求默认值 2.作用:几个Http 请求参数都是重复的数据 3.优先级:Http请求默认值和单个Http请求数值,使用单个Http请求数值为主 举例如下: ...

  5. dp求解各种子串子序列

    目录 概念 最长上升子序列 最长连续子串 最长公共子序列 最长公共上升子序列 注:dp可能并不是求解该这些问题的最优算法,这里只是做一个dp 算法的简介. 概念 定义:假设现有一个 string = ...

  6. 【Java 二维码】生成二维码

    ZXingCodeEncodeUtils 生成及解析二维码项目 package utils; import java.awt.BasicStroke; import java.awt.Color; i ...

  7. Update(Stage4):Spark Streaming原理_运行过程_高级特性

    Spark Streaming 导读 介绍 入门 原理 操作 Table of Contents 1. Spark Streaming 介绍 2. Spark Streaming 入门 2. 原理 3 ...

  8. Linux vim中方向键变成字母的问题

    使用Ubuntu Desktop 18.04 时 发现 vim 在编辑模式的时候,方向键变成了字母ABCD. 原因: Ubuntu预装的是vim tiny版本,安装vim full版本即可解决. 1. ...

  9. 3.java发展简史

    1991年,James Gosling在SUN(Stanford University Network)公司的工程师小组想要设计这样一种小型计算机语言.该语言主要用于像电视盒这样的消费类电子产品.另外 ...

  10. vue 之 axios Vue路由与element-UI

    一. 在组件中使用axios获取数据 1. 安装和配置axios 默认情况下,我们的项目中并没有对axios包的支持,所以我们需要下载安装. 在项目根目录中使用 npm安装包 npm install ...