乐趣区

关于php:PHP中的MySQLi扩展学习一MySQLi介绍

对于 PDO 的学习咱们告一段落,从这篇文章开始,咱们持续学习另外一个 MySQL 扩大,也就是除了 PDO 之外的最外围的 MySQLi 扩大。能够说它的先人,也就是 MySQL(原始)扩大是咱们很多人刚开始学习 PHP 时连贯数据库的入门导师。不过随着时代的变迁,MySQL(原始)扩大在 PHP7 中曾经被彻底废除了。当初如果想要应用过程式的代码来操作数据库,只能应用 mysqli 扩大了。当然,mysqli 扩大也是反对面向对象式的写法的。

什么是 MySQLi

MySQLi 扩大容许咱们拜访 MySQL4.1 及以上版本的数据库所提供的性能。它是专门针对于 MySQL 数据库的,不像 PDO 能够通过不同的 dns 来连贯不同的数据库。

与 MySQL 和 PDO 的区别与分割

首先,咱们还是回顾一下最早的 MySQL 扩大。

  • 只面向过程
  • 不反对 存储过程、多语句执行、预处理语句
  • PHP7 中曾经删除了并且齐全不反对

而后是 PDO。

  • 仅反对面向对象形式应用
  • 能够连贯多种数据库,切换数据库带来的变更少,甚至可能不必批改代码
  • 反对 存储过程、多语句执行、预处理语句

最初就是 MySQLi。

  • 反对面向对象和面向过程两种写法
  • 仅反对 MySQL 数据库
  • 反对 存储过程、多语句执行、预处理语句
  • 追随 PHP 及 MySQL 的版本更新,能够更疾速地反对更多的 MySQL 高级个性

从它们三个的这些特点来看,MySQL(原始)扩大必定是不举荐了,就算是老的我的项目,只有是反对 PDO 或 MySQLi 的 PHP 版本,都应该思考将数据库的连贯转换成这两种形式之一。如果你还在 PHP5 的环境中学习 MySQL(原始)扩大的应用的话,也能够放下了。

而对于 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 来加密用户明码。

面向过程式

上文说过,MySQLi 是反对两种写法的,也就是面向对象和面向过程。简略地了解就是一种是 MySQL(原始)扩大的写法,另一种写法是相似于 PDO 的写法。咱们先来看看面向过程的写法。

$mysqli = mysqli_connect("localhost", "root", "","blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_test_user");
$row = mysqli_fetch_assoc($res);
print_r($row);

是不是感觉 MySQL(原始)扩大的代码要移植过去真的很不便。办法名上全副改成 mysqli_xxx 就能够了。

面向对象式

面向对象式的就有点像 PDO。咱们要先取得一个连贯句柄类,而后操作这个类就能够了。

$mysqli = new mysqli("localhost", "root", "","blog_test");
$res = $mysqli->query("SELECT * FROM zyblog_test_user");
$row = $res->fetch_assoc();
print_r($row);

面向对象和面向过程混用

另外,这两种形式还能够混合应用,不过并不举荐。混合起来应用的话很容易让看代码的人昏头昏脑。所以,最好还是在一个我的项目中就保持应用一种形式。

$mysqli = new mysqli("localhost", "root", "","blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_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

各自媒体平台均可搜寻【硬核项目经理】

退出移动版