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://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
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
PHP中的MySQLi扩展学习(一)MySQLi介绍的更多相关文章
- PHP中的MySQLi扩展学习(六)MySQLI_result对象操作
在之前的文章中,我们就已经接触过 MYSQLI_result 相关的内容.它的作用其实就是一个查询的结果集.不过在 PDO 中,一般直接通过 query() 或者 PDOStatement 对象进行查 ...
- PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作
就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...
- PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句
对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本.我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容.所以在这里,我们就不再多讲理论方面的 ...
- PHP中的MySQLi扩展学习(三)mysqli的基本操作
我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...
- PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法
虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法.就当是扩展一下自己的知识体系. 切换用户 首先就是切换 ...
- phpmyadmin中缺少mysqli扩展 的结解办法
修改 ;extension=php_mysqli.dll 去掉前面的 ; 以及 调整 php文件夹的目录位置. 这个办法是不是好使,我不确定.这个方法只适合 用win系统 这个,貌似 ...
- PHPMyAdmin 显示缺mysqli 扩展的解决方法
今天在学PHP100视频教程时,装了phpMyAdmin.一开始下载的是最新版本phpMyAdmin-4.1.4-all-languages, 直接500错误,页面怎么也打不开.我用的PHP版本是老版 ...
- phpMyAdmin配置及 错误 缺少 mysqli 扩展。请检查 PHP 配置
PHPMyadmin配置文件config.inc.php内容如下,在需要设置的地方增加了相关注释. 非常适合对数据库操作命令不熟悉的数据库管理者,下面我就说下怎么安装该工具: 1.先到网上下载 ...
- PHP开启mysqli扩展
Call to undefined function mysqli_connect()解决这个问题需要开启mysqli扩展开启mysqli扩展需要这两个步骤缺一不可1.在php.ini中搜索php_m ...
随机推荐
- 线程的分离状态(detached state)
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: [cpp] view plaincopyprint? int pt ...
- Linux 鸟叔的私房菜--完全结束
2018年10月22日 我不想再拖下去了,一本书看不完就无法进行下一本书的阅读,可能算是我的一个强迫症(借口吧) 之前看05年第一版<鸟叔的Linux私房菜>停在脚本语言那里,迟迟没有前进 ...
- 不懂Ribbon原理的可以进来看看哦,分析RibbonClientConfiguration完成了哪些核心初始操作
本文在前一篇文章的基础上来继续分析Ribbon的核心内容. 不懂Ribbon原理的可以进来看看哦,分析SpringBoot自动装配完成了Ribbon哪些核心操作 RibbonClientConfi ...
- Java 多线程与并发【原理第一部分笔记】
Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...
- 精简ABP的模块依赖
ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能,对于ABP自身提供的模块间的依赖关系想一探究竟,并且试着把不必要的模块拆掉,找到那部分核心模块.本次使用的是AspNetBoilerpla ...
- pikachu Unsafe Filedownload 不安全的文件下载
不安全的文件下载概述文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件 ...
- 冰蝎&哥斯拉 流量特征分析
1.冰蝎(Behinder) 下载链接:https://github.com/rebeyond/Behinder/releases 截止至我发贴时,冰蝎最新版本是3.0,客户端兼容性有所提升(但仍不是 ...
- jpa中遇到关键字
@Column(name = "`rank`") 或者 @Column(name = "\"use\"")
- WPF 附件路由事件
public class Person { public static readonly RoutedEvent NameChangedEvent = EventManager.RegisterRou ...
- commandBinding 的命令
<Window x:Class="WpfApplication1.Window29" xmlns="http://schemas.microsoft.com/win ...