而对付 PDO 和 MySQLi 的选择来说,就仁者见仁智者见智了。
本身它们实在并没有什么太大的差别,不过当代化的大型框架中基本都会将 PDO 作为默认的数据库连接来进行封装,毕竟它的可移植性可以方便这些通用框架连接不同的数据库。
而一些小型的框架或项目中,还是能够见到 MySQLi 的身影。
当然,小众并不虞味着不好,就像日常开拓中,我们很少会在 PHP 环境中利用别的数据库,那么在自己的小项目中完备利用一套 MySQLi 来操作数据库反而更加地方便快捷。
同时,老项目如果要切换到 PHP7 版本的话,如果之前利用的是 MySQL(原始)连接的数据库,也能够快速地将 MySQL(原始)的代码很方面地更换到 MySQLi 。

扩展的安装及 MySQL8 须要把稳的地方

MySQLi 的扩展是随 PHP 源码一起发布的,我们在编译 PHP 的时候加上 --with-mysqli 就可以了。
现在默认的数据库驱动都是利用的 mysqlnd ,libmysql 也已经基本淘汰了。
以是在编译时不须要再加上其它的参数,直接进行编译即可。

在连接 MySQL8 的时候须要把稳,由于 MySQL8 做事器会默认利用 caching_sha2_password 作为密码的加密。
而 PHP7.2.4 之前的版本中的 MySQLi 会利用 mysql_native_password 来对连接密码进行加密,这样就会导致无法连接上数据库。
大家可以修正 my.cnf 文件,设置 default_authentication_plugin=mysql_native_password ,让 MySQL8 也利用 mysql_native_password 来加密用户密码。

php的mysqliPHP中的MySQLi扩大进修一MySQLi介绍 AJAX

面向过程式

上文说过,MySQLi 是支持两种写法的,也便是面向工具和面向过程。
大略地理解便是一种是 MySQL(原始)扩展的写法,另一种写法是类似于 PDO 的写法。
我们先来看看面向过程的写法。

$mysqli=mysqli_connect("localhost","root","","blog_test");$res=mysqli_query($mysqli,"SELECTFROMzyblog_test_user");$row=mysqli_fetch_assoc($res);print_r($row);

是不是觉得 MySQL(原始)扩展的代码要移植过来真的很方便。
方法名上全部改成 mysqli_xxx 就可以了。

面向工具式

面向工具式的就有点像 PDO 。
我们要先得到一个连接句柄类,然后操作这个类就可以了。

$mysqli=newmysqli("localhost","root","","blog_test");$res=$mysqli->query("SELECTFROMzyblog_test_user");$row=$res->fetch_assoc();print_r($row);面向工具和面向过程混用

其余,这两种办法还可以稠浊利用,不过并不推举。
稠浊起来利用的话很随意马虎让看代码的人晕头转向。
以是,最好还是在一个项目中就坚持利用一种办法。

$mysqli=newmysqli("localhost","root","","blog_test");$res=mysqli_query($mysqli,"SELECTFROMzyblog_test_user");$row=$res->fetch_assoc();print_r($row);

在这段代码中,我们实例化了一个 mysqli 工具,然后利用面向过程的 mysqli_query() 函数来实行语句,接着又利用面向工具的办法来获取结果集。
是不是很乱?但是它是可以正常运行的。

总结

从上面的内容中可以看出,PDO 的特点是支持多种不同类型的数据库,就像 Java 中的 JDBC 一样。
而 MySQLi 虽然只支持 MySQL 数据库,但它却可以同时支持面向工具和面向过程两种写法。
是我们针对老项目代码进行升级优化的好帮手。
同时,它还是现在入门 PHP 学习干系数据库操作的首选。
在接下来的文章中,我们将默认只利用 面向工具 式的写法来连续学习 MySQLi 扩展干系的知识。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/4.PHP中的MySQLi扩展学习(一)MySQLi先容.php

参考文档:

https://www.php.net/manual/zh/mysqli.requirements.php

https://www.php.net/manual/zh/mysqli.installation.php

https://www.php.net/manual/zh/mysqli.overview.php

https://www.php.net/manual/zh/mysqli.quickstart.dual-interface.php