一、前言

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. python重要的日志模块logging

    一,logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 1.可以通过设置 ...

  2. Hbuilder实用快捷键

    Ctrl + d                   删除整行内容 Ctrl + Shift +R            复制当前行到下一行 Ctrl + Shift +D               ...

  3. 点击<a href="#">阻止自动跳转到顶部方法

    最近开发web项目,遇到一个问题 ,就是在<a>标签加href="#",并增加onclick事件,页面会自动在点击该标签绑定的元素时,自动跳转到页面顶部,在网上寻求了一 ...

  4. 【Go语言系列】1.1、GO语言简介:什么是GO语言

    一.Go的起源 Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感.在 Google I/O 2012 的 Go 设计小组见面会上,Rob Pike 是这样说的: 我们做了大量的 ...

  5. CSS - 引入方法

    1. 外部样式表 <head> <link rel="stylesheet" type="text/css" href="style ...

  6. 下载完idea后需要做的设置

    1.设置字体 2.安装插件 3.设置文件头(C:\Users\用户名\.IntelliJIdea2019.2\config\fileTemplates\includes下有个文件叫做File Head ...

  7. C:C语言中表示进制数

    #include <stdio.h> int main() { int a = 123; //十进制方式赋值 int b = 0123; //八进制方式赋值, 以数字0开头 int c = ...

  8. byte的取值范围

    byte b = Byte.MAX_VALUE;        b+=1;        System.out.println(b); //输出为-128 取值范围为[-128 -  127] 解析: ...

  9. 第二章linux网络基础设置总结!

    一:查看及测试网络 (1)查看活动的网络接头命令:ifconfig (2)查看所有网络接口命令:ifconfig -a (3)查看指定的网络接口(不论该网络接口是否处于激活状态)命令:ifconfig ...

  10. Linux查看当前系统32位还是64位

    getconf LONG_BIT 此方法会直接返回32或64