虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法。就当是扩展一下自己的知识体系。

切换用户

首先就是切换一下当前连接数据库的用户。

// 切换用户
$mysqli->change_user('root2', "123", 'blog_test'); // 错误信息
$res = $mysqli->query( "SELECT * FROM zyblog_test_user");
var_dump($res); // bool(false) var_dump($mysqli->error_list);
// array(1) {
// [0]=>
// array(3) {
// ["errno"]=>
// int(1142)
// ["sqlstate"]=>
// string(5) "42000"
// ["error"]=>
// string(78) "SELECT command denied to user 'root2'@'localhost' for table 'zyblog_test_user'"
// }
// }

使用 change_user() 方法就能够方便地在 mysqli 对象已经实例化之后再来进行用户的切换。在这段代码中,我们的 root2 用户没有 blog_test 表的 SELECT 权限,所以返回的 query() 查询结果是空的。通过打印 mysqli 的 error_list 属性就可以看到当前的错误信息。

错误信息

紧接着上一段,对于执行语句的错误信息,我们可以通过几个 mysqli 中的属性来获得。比如上文中的 error_list 。它里面包含的就是所有的错误信息列表,并且是非常详细的错误信息内容。不过我们还可以通过另外两个属性来获得单独的错误号和错误信息的字符串。

var_dump($mysqli->errno); // int(1142)
var_dump($mysqli->error); // string(78) "SELECT command denied to user 'root2'@'localhost' for table 'zyblog_test_user'"

errno 属性里面保存的就是数据库的错误号,error 属性中保存的是错误信息的详细文本说明。这两个错误信息内容都是在执行 SQL 语句之后数据库返回的内容。

连接错误信息

当然,如果在连接数据库的时候就产生了错误,我们也可以通过 connect_errno 和 connect_error 来获得它们的错误号和错误信息内容。

$mysqli2 = @new mysqli("xxx", "root", "", "blog_test");
var_dump($mysqli2->connect_errno); // int(2002)
var_dump($mysqli2->connect_error); // string(90) "php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known"

在这段代码中,我们使用了错误的 host 信息。如果不在实例化的时候加上错误抑制符,那么在实例化的时候就会报出 PHP 的警告信息 Warning 。在这里我们为了测试输出的清晰,加上了错误抑制符。

客户端连接的统计数据

var_dump($mysqli->get_connection_stats());
// array(163) {
// ["bytes_sent"]=>
// string(3) "306"
// ["bytes_received"]=>
// string(3) "287"
// ["packets_sent"]=>
// string(2) "10"
// ["packets_received"]=>
// string(1) "6"
// ["protocol_overhead_in"]=>
// string(2) "24"
// ["protocol_overhead_out"]=>
// string(2) "40"
// ["bytes_received_ok_packet"]=>
// string(1) "0"
// ["bytes_received_eof_packet"]=>
// string(1) "0"
// ……
// ……
// ["bytes_received_real_data_normal"]=>
// string(1) "0"
// ["bytes_received_real_data_ps"]=>
// string(1) "0"
// }

通过 get_connection_stats() 方法,我们可以获得当前数据库连接的一些统计信息。返回的内容非常多,官方也没有具体的每个字段的说明文档。不过从字段名中我们还是可以看到一些有用的信息,比如 bytes_sent 字节发送的数量,bytes_received 字节接收的数量。

字符集

最近这些年,我们使用 PHP + MySQL 开发基本上都已经是统一地在使用 UTF-8 来作为默认的字符集编码了。不过在早些时候,包括 Discuz 、 DedeCMS 这些早期的开源建站程序都会提供一套 UTF-8 和一套 GBK 的源码供大家使用。而 mysqli 则可以方便快捷地获取及切换当前数据库所使用的字符集。

获取数据库字符

// 获取数据库字符
var_dump($mysqli->character_set_name()); // string(4) "utf8"

character_set_name() 不要以为看到一个 set 关键字就是设置或者修改什么,这个方法是获取当前的字符集信息的。

字符集详细信息

var_dump($mysqli->get_charset());
// object(stdClass)#2 (8) {
// ["charset"]=>
// string(4) "utf8"
// ["collation"]=>
// string(15) "utf8_general_ci"
// ["dir"]=>
// string(0) ""
// ["min_length"]=>
// int(1)
// ["max_length"]=>
// int(3)
// ["number"]=>
// int(33)
// ["state"]=>
// int(1)
// ["comment"]=>
// string(13) "UTF-8 Unicode"
// }

我们也可以通过 get_charset() 获取当前数据库连接的详细字符集信息。其中 charset 就是字符类型,我们这里是 UTF-8 类型的,字符集是 utf8_general_ci ,这一套基本上就是我们现在开发时的标配了。

设置字符集

$mysqli->set_charset('gbk');
$mysqli->query("insert into zyblog_test_user(username, password, salt) values('GBK字符','dd','d')");
var_dump($mysqli->error); // string(65) "Incorrect string value: '\xAC\xA6' for column 'username' at row 1" $mysqli->set_charset('utf8');
$mysqli->query("insert into zyblog_test_user(username, password, salt) values('UTF字符','dd','d')");
var_dump($mysqli->error);
echo $mysqli->insert_id, PHP_EOL;

通过 set_charset() 方法就可以设置当前数据库连接的字符。在第一段代码中我们将连接字符设置为 gbk ,然后执行插入语句,直接就会返回字符不匹配的信息了。

特殊字符转义

既然说到字符的问题了,我们顺便多提一句关于 SQL 注入的问题。除了使用 预处理 功能来解决 SQL 注入之外,MySQLi 还为我们提供了一个 real_escape_string() 方法,可以手工地解决SQL语句中的一些特殊符号问题。

$username = "aaa ' bbb";
$username = $mysqli->real_escape_string($username);
var_dump($username); // string(10) "aaa \' bbb"

使用这个方法可以说和 addslashes() 方法类似,不过它比 addslashes() 方法转义的内容更多一些,它包括: NUL (ASCII 0),\n,\r,\,'," 和 Control-Z 这些字符。

线程操作

关于 MySQL 的线程问题,我们将来在深入学习并且刷 MySQL 文档的时候再说(因为现在我也不是很清楚~~)。在这里,我们就先看看 mysqli 中关于 MySQL 线程的几个属性和方法吧。

var_dump($mysqli->thread_safe); // NULL

var_dump($mysqli->thread_id); // int(600)

$thread_id = $mysqli->thread_id;
$mysqli->kill($thread_id); if (!$mysqli->query("insert into zyblog_test_user(username, password, salt) values('kill线程了','dd','d')")) {
var_dump($mysqli->error); // string(26) "MySQL server has gone away"
}

thread_safe 属性是保存的当前数据库连接是否是线程安全的,在我们的测试中返回的是 NULL 而不是正常的布尔值,这一块将来我们学习到了再说。thread_id 属性保存的是当前连接的线程ID,通过这个线程ID,我们就可以使用另外一个 kill() 方法来杀死当前的线程。其实就相当于关闭了当前这个 mysqli 对象的连接,这时我们再使用这个连接对象进行其它操作时就会出现 MySQL server has gone away 的提示信息了。

mysqli 对象

上面说的很多属性其实我们可以直接通过打印 mysqli 对象就可以查看到。

var_dump($mysqli);
// object(mysqli)#1 (19) {
// ["affected_rows"]=>
// int(1)
// ["client_info"]=>
// string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $"
// ["client_version"]=>
// int(50012)
// ["connect_errno"]=>
// int(2002)
// ["connect_error"]=>
// string(90) "php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known"
// ["errno"]=>
// int(0)
// ["error"]=>
// string(0) ""
// ["error_list"]=>
// array(0) {
// }
// ["field_count"]=>
// int(0)
// ["host_info"]=>
// string(25) "Localhost via UNIX socket"
// ["info"]=>
// NULL
// ["insert_id"]=>
// int(59)
// ["server_info"]=>
// string(6) "8.0.17"
// ["server_version"]=>
// int(80017)
// ["stat"]=>
// string(139) "Uptime: 355128 Threads: 4 Questions: 35696 Slow queries: 0 Opens: 764 Flush tables: 3 Open tables: 636 Queries per second avg: 0.100"
// ["sqlstate"]=>
// string(5) "00000"
// ["protocol_version"]=>
// int(10)
// ["thread_id"]=>
// int(606)
// ["warning_count"]=>
// int(0)
// }

像是 host_info 显示的是我们连接数据库的 host 信息,server_info 是连接到的数据库的版本信息,就像我们这里使用的是 MySQL8 。stat 简单的统计信息,里面能看到有 4 个线程,没有慢查询等等。大家可以仔细地研究一下这个对象中的这些属性,或许某些内容就是你在实际项目中所需要的。

总结

今天的文章学习的就是一些简单的 mysqli 类所持有的属性和方法。我们还没有正式开始学习查询之类的语句,不过从这些属性方法就可以看出,相对于 PDO 来说,mysqli 提供的功能确实更加的全面一些。后面我们将继续深入地学习和探索 mysqli 的各种方法和使用。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/5.PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法.php

参考文档:

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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法的更多相关文章

  1. PHP中的MySQLi扩展学习(六)MySQLI_result对象操作

    在之前的文章中,我们就已经接触过 MYSQLI_result 相关的内容.它的作用其实就是一个查询的结果集.不过在 PDO 中,一般直接通过 query() 或者 PDOStatement 对象进行查 ...

  2. PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作

    就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...

  3. PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

    对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本.我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容.所以在这里,我们就不再多讲理论方面的 ...

  4. PHP中的MySQLi扩展学习(三)mysqli的基本操作

    我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...

  5. PHP中的MySQLi扩展学习(一)MySQLi介绍

    关于 PDO 的学习我们告一段落,从这篇文章开始,我们继续学习另外一个 MySQL 扩展,也就是除了 PDO 之外的最核心的 MySQLi 扩展.可以说它的祖先,也就是 MySQL(原始) 扩展是我们 ...

  6. mysqli类的对象和其属性方法;mysqli类面向过程的属性和方法

    mysqli 方法的概述 mysqli 类 面向对象接口 面向过程接口   描述 属性 $mysqli::affected_rows mysqli_affected_rows() 获取上次 Mysql ...

  7. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  8. Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法

    一.类的定义 一个全面的类定义是比较复杂的,  定义如下:

  9. COCOS学习笔记--Button类及其相关控件属性

    一.Button介绍 Button就是button.Cocos中提供了Button类对button进行相关的操作.我们看一下Button类继承关系图: 能够看到.Button是继承自Widget类,W ...

随机推荐

  1. 1056 Mice and Rice (25分)队列

    1.27刷题2 Mice and Rice is the name of a programming contest in which each programmer must write a pie ...

  2. 微信小程序及公众号H5自动化测试攻略

    目前市面上,被大家用来做移动端App UI自动化测试工具最为常见的当属: Appium Airtest 很多小伙伴在刚接触这两款工具做App UI自动化测试时,难免会问到,他们能支持微信小程序或者微信 ...

  3. SpringBoot开发七-开发注册功能

    需求介绍-开发注册功能 首先访问注册页面-点击顶部的链接,打开注册页面 提交注册数据 通过表单提交数据 服务端验证账号是否存在,邮箱是否已经注册 服务端发送激活邮件 激活注册账号 点击邮件中的链接,访 ...

  4. Adaptive AUTOSAR 学习笔记 15 - 持久化 Persistency

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...

  5. 01-ADB命令获取包名、界面名

    命令代码 adb shell dumpsys window |findstr mFocusedApp

  6. 常用css样式(文字超出部分用省略号显示、鼠标经过图片放大、出现阴影)

    文字超出部分用省略号显示: white-space: nowrap; /* 不换行 */ overflow: hidden; /* 超出部分不显示 */ text-overflow: ellipsis ...

  7. COM笔记-COM库函数

    COM在OLE32.DLL和 OLE32.LIB定义了一些常用的函数.在使用这些函数前要先调用CoInitialize来初始化COM库.当进程不再需要使用COM库函数时要调用CoUninitializ ...

  8. 深入浅出Mybatis系列(一)---Mybatis简介

    1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且 ...

  9. Google 开发console查找元素或方法

    F12 后 在console中输入: $("#R")[0] 查找ID 为R的元素, 如需打印出元素属性值,则输入: console.dir($("#R")[0] ...

  10. jQuery中获取属性值:attr()、html()、text()、val()等(一)

    <!DOCTYPE html> <html> <head> <title>01_basic.html</title> <meta na ...