乐趣区

关于php:PHP中的MySQLi扩展学习二mysqli类的一些少见的属性方法

虽说是少见的一些属性办法,然而可能还是有不少同学在日常的开发中应用过,这里只是学习了可能相对来说咱们用得比拟少的一些 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

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

退出移动版