一、前言

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. SQL 游标介绍及使用

    游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...

  2. Linux 的三种软件安装包介绍

    通过RPM软件包来安装 说起RPM(RedHat Package Management)标准的软件包,大家可能都会想起大名鼎鼎的REDHAT公司,正是RPM软件包发行方式的出现,使Linux中的应用软 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:中型和大型设备

    <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 中型和大型设备</title> &l ...

  4. netty实现websocket客户端(附:测试服务端代码)

    1,客户端启动类 package test3; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import ...

  5. 全排列next_permutation()用法和构造函数赋值

    全排列next_permutation()用法 在头文件aglorithm里 就是1~n数组的现在的字典序到最大的字典序的依次增加.(最多可以是n!种情况) int a[n]; do{ }while( ...

  6. JS获取光标在input 或 texterea 中下标位置

    <textarea placeholder="请输入表达式" id="methodInput" ></textarea> 获取位置: v ...

  7. python 之并发编程更新版进程池与进程池比较与回调函数

    一.更新版进程池与进程池比较 from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os, tim ...

  8. 操作系统OS - 反置页表

    1. https://blog.csdn.net/wuyuegb2312/article/details/16359821 2. https://www.youtube.com/watch?v=YQ3 ...

  9. IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题

    1.版本,2019.2.2. 2.这个问题貌似是个bug,就是选中变色后会一直在,目前没有找到对应方法或者配置,如果你找到了,欢迎在评论中分享一下. 3.我这里只能先简单粗暴处理下,通过设置选中时不设 ...

  10. 标签UILabel的讲解

    首先,我先自定义几个名词,方便接下来的讲解工作.如下图所示: 接下来,通过五个方面来讲解我们能对UILabel做出哪些改变或者称之为设置: 1.文字 1.1普通文字:内容text.字体大小font.字 ...