在之前的文章中,咱们就曾经接触过 MYSQLI_result 相干的内容。它的作用其实就是一个查问的后果集。不过在 PDO 中,个别间接通过 query() 或者 PDOStatement 对象进行查问之后就会返回后果。但在 MySQLi 中,会把查问到的后果也放入一个对象中,这就是 MySQLI_result 对象。

MySQLI_result 对象属性

首先,咱们要通过一段查问来取得一个 MySQLI_result 对象。

$stmt = $mysqli->prepare("select * from zyblog_test_user where username = 'kkk'");$stmt->execute(); // 执行语句$result = $stmt->get_result();var_dump($result);// object(mysqli_result)#3 (5) {//     ["current_field"]=>//     int(0)//     ["field_count"]=>//     int(4)//     ["lengths"]=>//     NULL//     ["num_rows"]=>//     int(7)//     ["type"]=>//     int(0)//   }

如果应用的 MYSQLI_STMT 的话,间接在 execute() 办法执行查问语句之后,就能够通过 get_result() 办法取得一个 MySQLI_result 对象。

在这个对象中,咱们能够看到有 current_field 以后字段 、 field_count 字段数量 、 lengths 字段长度 、 num_rows 行数 、 type 这些属性内容。不少同学会发现,current_field 和 lengths 如同并没有什么理论的内容,其实这两个属性是须要在特定操作下才会显示内容的,比方 lengths 是要在 fetch() 后果集之后才会有信息的。

$result->fetch_array();var_dump($result);// ……// ……// ["lengths"]=>//   array(4) {//     [0]=>//     int(0)//     [1]=>//     int(3)//     [2]=>//     int(3)//     [3]=>//     int(2)//   }// ……// ……

而 current_field 属性的内容咱们将在上面遍历查看字段信息的时候再展现它的内容。

查问后果集获取

MySQLI_result 对象的可见属性中,咱们只能看到下面的那些信息。对于咱们的业务开发来说其实用途不大,除了 num_rows 能够用来依据行数判断查问是否有后果之外,更重要的是咱们要获取到后果集中的数据信息,这时就须要应用其它的函数来进行数据的获取了。

获取全副后果集

var_dump($result->fetch_all());// array(7) {//     [0]=>//     array(4) {//       [0]=>//       int(42)//       [1]=>//       string(3) "kkk"//       [2]=>//       string(3) "666"//       [3]=>//       string(2) "k6"//     }//     ……//     ……$result->data_seek(0);var_dump($result->fetch_all(MYSQLI_ASSOC));// array(7) {//     [0]=>//     array(4) {//       ["id"]=>//       int(42)//       ["username"]=>//       string(3) "kkk"//       ["password"]=>//       string(3) "666"//       ["salt"]=>//       string(2) "k6"//     }//     ……//     ……

fetch_all() 办法就是用来获取全副的数据集内的数据,并以数组的模式返回,它能够指定返回的格局,默认状况下是 MYSQLI_NUM 这种数组下标的模式,和 PDO 相似,咱们间接指定为 MySQLI_ASSOC 就能够返回键名模式的数据内容。

data_seek() 办法是挪动后果集的下标。当咱们获取或者应用前面要介绍的办法循环遍历实现一次后果集之后,再次遍历的话它的游标曾经处于最初一位的,这样是无奈获取数据的。在下面的代码中,咱们就是将游标两次返回到 0 下标的地位,也就是最初始的地位,这样咱们就能够反复地操作这一个后果集了。

获取一般后果集

如果要一行一行数据的获取,咱们就能够应用各种模式的后果集数据获取形式。

var_dump($result->fetch_array());// array(8) {//     [0]=>//     int(42)//     ["id"]=>//     int(42)//     [1]=>//     string(3) "kkk"//     ["username"]=>//     string(3) "kkk"//     [2]=>//     string(3) "666"//     ["password"]=>//     string(3) "666"//     [3]=>//     string(2) "k6"//     ["salt"]=>//     string(2) "k6"//   }var_dump($result->fetch_array(MYSQLI_ASSOC));// array(4) {//     ["id"]=>//     int(43)//     ["username"]=>//     string(3) "kkk"//     ["password"]=>//     string(3) "666"//     ["salt"]=>//     string(2) "k6"//   }

应用 fetch_array() 就是获取下一行的后果数据并以数组的模式返回,同样它也能够指定返回后果集的格局,和 fetch_all() 是相似的,只不过它是只获取下一行而不是全副的数据集,而且它的参数默认是返回的 MYSQLI_BOTH ,也就是数字下标和键名下标同时返回后果。

另外还有一个 fetch_assoc() 办法,间接就是返回 MYSQLI_ASSOC 格局的数据,这个办法不须要任何参数,它能够看成是 fetch_array(MYSQLI_ASSOC) 这种应用形式的一个封装。

var_dump($result->fetch_assoc());// array(4) {//     ["id"]=>//     int(42)//     ["username"]=>//     string(3) "kkk"//     ["password"]=>//     string(3) "666"//     ["salt"]=>//     string(2) "k6"//   }

而另外一个办法 fetch_row() ,则能够看成是和 fetch_array(MYSQLI_NUM) 类似的一个办法。它其实就是默认指定为 MySQLI_NUM 的构造返回形式。

var_dump($result->fetch_row());// array(4) {//     [0]=>//     int(43)//     [1]=>//     string(3) "kkk"//     [2]=>//     string(3) "666"//     [3]=>//     string(2) "k6"//   }

获取对象后果集

获取对象后果集其实和 PDO 中的相干性能也是相似的,它就是将后果间接放到一个类中,并实例化返回一个对象。

ar_dump($result->fetch_object());// object(stdClass)#4 (4) {//     ["id"]=>//     int(42)//     ["username"]=>//     string(3) "kkk"//     ["password"]=>//     string(3) "666"//     ["salt"]=>//     string(2) "k6"//   }

在这里咱们没有指定类,所以它应用的是 stdClass 来返回的对象构造。咱们也能够指定一个类,并且能够为这个类的构造函数传递参数,这一点也和 PDO 中的相干性能一样。

class User{    public function __construct()    {        print_r(func_get_args());    }}var_dump($result->fetch_object('User', [1, 2, 3]));// Array// (//     [0] => 1//     [1] => 2//     [2] => 3// )// object(User)#4 (4) {//     ["id"]=>//     int(42)//     ["username"]=>//     string(3) "kkk"//     ["password"]=>//     string(3) "666"//     ["salt"]=>//     string(2) "k6"//   }

查问后果集字段信息获取

接下来咱们再看看 MySQLI_result 对象中的字段相干信息的获取。咱们能够间接获取到以后查问的后果集中的所有字段信息。

while ($finfo = $result->fetch_field()) {    var_dump($result->current_field);    var_dump($finfo);}// int(1)// object(stdClass)#4 (13) {//     ["name"]=>//     string(2) "id"//     ["orgname"]=>//     string(2) "id"//     ["table"]=>//     string(16) "zyblog_test_user"//     ["orgtable"]=>//     string(16) "zyblog_test_user"//     ["def"]=>//     string(0) ""//     ["db"]=>//     string(9) "blog_test"//     ["catalog"]=>//     string(3) "def"//     ["max_length"]=>//     int(0)//     ["length"]=>//     int(11)//     ["charsetnr"]=>//     int(63)//     ["flags"]=>//     int(49667)//     ["type"]=>//     int(3)//     ["decimals"]=>//     int(0)//   }// int(2)//   object(stdClass)#5 (13) {//     ["name"]=>//     string(8) "username"//     ["orgname"]=>//     string(8) "username"//     ……//     ……

在这段代码中,咱们查看了 MySQLI_result 对象的 current_field 属性信息,能够看出,它指出的就是以后位于哪个字段的下标。

字段的信息十分具体,这些属性的键名也很直观,这里就不作具体的阐明了。

$result->field_seek(1);while ($finfo = $result->fetch_field()) {    var_dump($finfo);}// object(stdClass)#5 (13) {//     ["name"]=>//     string(8) "username"//     ["orgname"]=>//     string(8) "username"

咱们同样也能够通过 field_seek() 办法来挪动字段遍历的游标。在这里咱们将游标挪动到 1 ,就会从第二个 username 字段开始遍历。

var_dump($result->fetch_fields());// array(4) {//     [0]=>//     object(stdClass)#5 (13) {//       ["name"]=>//       string(2) "id"//       ["orgname"]=>//       string(2) "id"//       ["table"]=>//       string(16) "zyblog_test_user"//       ["orgtable"]=>//       string(16) "zyblog_test_user"//       ["def"]=>//       string(0) ""//       ["db"]=>//       string(9) "blog_test"//       ["catalog"]=>//       string(3) "def"//       ["max_length"]=>//       int(0)//       ["length"]=>//       int(11)//       ["charsetnr"]=>//       int(63)//       ["flags"]=>//       int(49667)//       ["type"]=>//       int(3)//       ["decimals"]=>//       int(0)//     }//     [1]=>//     object(stdClass)#4 (13) {//       ["name"]=>//       string(8) "username"var_dump($result->fetch_field_direct(2));// object(stdClass)#7 (13) {//     ["name"]=>//     string(8) "password"//     ["orgname"]=>//     string(8) "password"//     ["table"]=>//     string(16) "zyblog_test_user"//     ["orgtable"]=>//     string(16) "zyblog_test_user"//     ["def"]=>//     string(0) ""//     ["db"]=>//     string(9) "blog_test"//     ["catalog"]=>//     string(3) "def"//     ["max_length"]=>//     int(3)//     ["length"]=>//     int(765)//     ["charsetnr"]=>//     int(33)//     ["flags"]=>//     int(0)//     ["type"]=>//     int(253)//     ["decimals"]=>//     int(0)//   }

fetch_fields() 办法和 fetch_all() 是相似的,它就是获取全副的字段信息。而 fetch_field_direct() 则是依据参数来获取指定下标的字段信息。

总结

至此,MySQLi 相干扩大的学习咱们也就告一段落了,其它的一些类和函数比方 MySQLI_Driver 、 MySQLI_Exception 之类的内容大家能够自行查阅相干的文档,内容都不是很多。MySQLI_Driver 对象能够帮忙咱们指定以后驱动的报错模式,之前的文章中咱们也曾经接触过。

总体来说,整个 PHP 中和 MySQL 打交道的官网扩大咱们就曾经全副学习完了,PDO 和 MYSQLi 这两个扩大大家更次要的还是要把握它们的区别和分割。在理论的业务开发中 PDO 还是会应用得更多,但 MySQLi 也绝不是可能齐全疏忽的,多多入手尝试学习吧。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/9.PHP中的MySQLi扩大学习(六)MySQLI_result对象操作.php

参考文档:

https://www.php.net/manual/zh/class.mysqli-result.php

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