php中关于mysqli和mysql区别的一些知识点分析

一: PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性。而 PDO (PHP Data Object)则是提供了一个 Abstraction Layer 来操作资料库,用讲的其实看不出来有有什麽差别,所以就直接看程式吧… 首先,先来看一段用 PHP-MySQL 写成的程式码,这类的范例常用在世界各地:

乍看之下没什麽问题,但其实背后有些学问… 这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及mysql_real_escape_string()来解决这个问题,不过这麽一搞,整个叙述会变得複杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…

在 PHP-MySQLi 中有了不少进步,除了透过 Bind Column 来解决上述问题,而且也多援 Transaction, Multi Query ,并且同时提供了 Object oriented style (下面这段 PHP-MySQLi 范例的写法) 和 Procedural style (上面 PHP-MySQL 范例的写法)两种写法…等等。

但看到这边又发现了一些缺点,例如得 Bind Result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(Abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始… 于是 PDO 就出现了(备注:目前 Ubuntu 和 Debian 来说,PDO 并没有直接的套件可以安装,而是必须透过 PECL 安装)。

当透过 PECL 安装装好后,就可以透过以下方式来操作资料库:

乍看之下,PDO 的程式码好像也没有比较短,那到底好处是什麽呢? 1. PDO 连接资料库时透过 Connection String 来决定连接何种资料库。 2. PDO 可以透过 PDO::setAttribute 来决定连线时的设定,像是 Persistent Connection, 回传错误的方式(Exception, E_WARNING, NULL)。甚至是回传栏位名称的大小写…等等。 2. PDO 支援 Bind Column 的功能,除了基本的 Prepare, Execute 以外,也可以 Bind 单一栏位,并且指定栏位型态。 4. PDO 是 Abstraction Layer 所以就算更换储存媒介,需要花的功夫比起来是最少的。 可惜的是,儘管这些东西都已经出现很久了,但还是不够大众化。我想或许是肇因于大家习惯看坊间的书籍学习,但那些书本往往只会介绍最简单最传统的方式。导致很多人还是在用 MySQL 这种方直接连资料库。 不过,目前来说我个人还是最喜爱透过 DBI 来连接资料库,像是 ActiveRecord 以及 Propel ORM(Object-Relational Mapping)。 例如说以 ActiveRecord 为例,如果要实现这样的 SQL 叙述… INSERT INTO `users` (id, name, gender, location) VALUES(1, 'roga', 'male', 'tpe') 以 PDO 来写是:

后者在语法上是不是简洁很多呢,而且也大幅降低对 SQL 语言的依赖性!(不同资料库对 SQL 实作的问题可参考 Comparison of different SQL implementations) 以上是一些简单的介绍,如有疏漏谬误也欢迎大家补充。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏bboysoul

linux 服务器带宽测试脚本ZBench

很郁闷,今天我的vultr服务器的ip被ban了,无奈只能换服务器,今天给大家推荐一个vps的带宽测速脚本ZBench可以一键测试你的服务器到国内和国外的速度

56420
来自专栏ChaMd5安全团队

N1CTF2018 APFS&Lipstick题解

APFS题目描述 Apple released the brand new APFS on WWDC 2017 with a bunch of new feat...

377100
来自专栏吉浦迅科技

DAY3:阅读CUDA C编程接口

27430
来自专栏即时通讯技术

手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途。如本文内容有不妥之处,请联系JackJiang进行处理!

1.1K20
来自专栏JadePeng的技术博客

Html 5 video/audio 格式转换 ogg

Html5 开始支持video和audio标签,但是各个浏览器支持的格式不一样,见下图 Codec support in modern desktop brow...

520100
来自专栏zhisheng

Elasticsearch 可用的中文分词器使用

采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速处理能力。

1.4K20
来自专栏Hadoop实操

如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引

78640
来自专栏码洞

轻量级框架Spark快速入门

尝试过Python/Ruby/Nodejs/Golang语言开发的人往往难以适应Java Web框架,相对于这些语言提供的web框架来说,Java的Web框架显...

15620
来自专栏cmazxiaoma的架构师之路

蛋疼的ElasticSearch(四)之基本用法、高级查询

ElasticSearch系列文章: 1.蛋疼的ElasticSearch(一)之安装ElasticSearch 2.蛋疼的ElasticSearch(二)...

10240
来自专栏农夫安全

如何移除Android应用广告

0x00 前言 我用以前做过的一个小游戏为例,源代码地址:http://git.oschina.net/androidsourcecode/parity,如果不...

50160

扫码关注云+社区

领取腾讯云代金券