温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP怎么使用MySQLi中的MySQLI_result对象操作

发布时间:2021-07-02 09:25:51 来源:亿速云 阅读:196 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“PHP怎么使用MySQLi中的MySQLI_result对象操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP怎么使用MySQLi中的MySQLI_result对象操作”这篇文章吧。

在之前我们就已经接触过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() 则是根据参数来获取指定下标的字段信息。

以上是“PHP怎么使用MySQLi中的MySQLI_result对象操作”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI