PDO 小知识
一、前言
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 小知识的更多相关文章
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
- iOS APP开发的小知识(分享)
亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...
- Unix系统小知识(转)
Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
- salesforce 零基础开发入门学习(十)IDE便捷小知识
在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...
- Jquery:小知识;
Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器 上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...
- HTML小知识---Label
今天知道了一个html小知识: <input type="checkbox" id="chkVersion" /> ...
- Unicode和汉字编码小知识
Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...
- Java异常的一个小知识
有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...
随机推荐
- eclipse配置tomcat后修改server.xml文件(如编码等)无效问题
我们用eclipse配置好tomcat后,在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml等文件. 修改后重启Tomcat服务器时发现xml文件又被还原了. 因为Tomc ...
- 定义列表dl中标签 dt 与标签dd对齐方法,标签ul与标签li对齐
不定义css样式时(默认情况): 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- java 编译java文件 以及生成可执行jar
1.新建java project: 2.src下新建包以及class文件: 3.打包: 5.选取目标mainclass 很关键决定jar是否可执行: 7.build jar : 8:artifact ...
- Steam 游戏 《Sudoku Universe(数独宇宙)》——[数独基本局分析]
日期:2020.02.12 博客期:152 星期三 老师给的任务都做完了,15篇博客也都写好了,剩下的几天居然还要每天写一篇~唉~为难我 PH ,剩下的几天就把 我的数独要义分享一下吧! 1.基本局规 ...
- OC与JS交互
https://www.jianshu.com/p/bb666b71e104 一.简述 目前原生与JS交互的方式有以下几种 JavaScriptCore WKWebView 拦截URL WebView ...
- char **argv 与char *argv[]
1.char **argv 分析:argv是一个指针变量,argv的指向(*argv)是char *,也就是argv指向的也是一个指针 : *argv的指向(**argv)是char. 2.char ...
- splash-简介及入门
splash 1. splash简介 Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库.利用它,我 ...
- 吴裕雄--天生自然TensorFlow2教程:多输出感知机及其梯度
import tensorflow as tf x = tf.random.normal([2, 4]) w = tf.random.normal([4, 3]) b = tf.zeros([3]) ...
- vue-cli项目结构详解
vue-cli的webpack模板项目配置文件分析 https://blog.csdn.net/hongchh/article/details/55113751/ 由于最近在vue-cli生成的web ...
- 洛谷P1346 电车(需要稍加思索的最短路)
题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定 ...