关于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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理