我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

不想使用笨重的各种php框架,又想连接mysql数据库拿数据。那么,使用原生支持的mysqli系列函数就是最好的选择。本文里面苏南大叔就phpmysqli的五个类似函数mysqli_fetch_(.*)做个对比试验。看看,这几个mysqli_fetch_(.*)都有什么样的区别,日常编程中,最常用的是哪个函数?

苏南大叔:php通过mysqli扩展查询数据有哪些方案?mysqli_fetch_系列 - mysqli查询数据
php通过mysqli扩展查询数据有哪些方案?mysqli_fetch_系列(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程故事。本文测试环境:测试环境:win10nginx@1.15.11php@8.2.10-ntsmysql@5.7.26

前文回顾

下面的两篇文章,讲述了在php下,使用mysqli扩展的基本姿势。

本文也是在上述两篇文章的基础上,做的扩展描述总结。开展叙述之前,先看一下基础部分。
首先,记得开启mysqli扩展。类似编辑php.ini文件:

extension = mysqli

然后准备好测试数据库表结构:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'sunan大叔'),(2,'苏南大叔');

查询语句预览

php连接数据库:

$conn = mysqli_connect('127.0.0.1','root','root');  //连接数据库
mysqli_select_db($conn,'coin');                     //选择数据库
mysqli_set_charset($conn,'utf-8');                  //设置字符集

准备好查询代码骨架:

$res = mysqli_query($conn,'SELECT * from test order by id desc');
// ############################
// 主体测试代码放这里!
// ############################
mysql_free_result($res);
mysqli_close($conn);

多条数据查询,是这样的:

while ($row = mysqli_fetch_【.*】($res)) {
    var_dump($row);
}

单条数据查询,是这样的:

$row = mysqli_fetch_【.*】($res);
var_dump($row);

还可以写成:

$row = $res->fetch_【.*】();
var_dump($row);

mysqli_fetch_array(),数字加字段

mysqli_fetch_array()返回的是【数字索引】加【字段名索引】

while ($row = mysqli_fetch_array($res)) { // 数字索引 加 字段名索引
    var_dump($row);
    /*
    array(4) {
        [0]=>
        string(1) "2"
        ["id"]=>
        string(1) "2"
        [1]=>
        string(12) "苏南大叔"
        ["name"]=>
        string(12) "苏南大叔"
    }
    */
    var_dump($row[0],$row["id"]);
    /*
    string(1) "2"
    string(1) "2"
    */
}

mysqli_fetch_row(),数字索引

mysqli_fetch_row()返回的是【数字索引】

while ($row = mysqli_fetch_row($res)) { // 数字索引
    var_dump($row);
    /*
    array(2) {
        [0]=>
        string(1) "2"
        [1]=>
        string(12) "苏南大叔"
    }
    */
    var_dump($row["1"]);
    // string(12) "苏南大叔"
}

mysqli_fetch_assoc(),字段索引【数组】【推荐】

mysqli_fetch_assoc()返回的是【字段索引】的数组,苏南大叔推荐使用这个函数,效果比较好。

while ($row = mysqli_fetch_assoc($res)) { // 字段名索引
    var_dump($row);
    /*
    array(2) {
        ["id"]=>
        string(1) "2"
        ["name"]=>
        string(12) "苏南大叔"
    }
    */
    var_dump($row["id"]);  // string(1) "2"
}

mysqli_fetch_object(),字段索引【对象】

mysqli_fetch_object()返回的是【字段索引】的对象

while ($row = mysqli_fetch_object($res)) {  // 字段名索引
    var_dump($row);
    /*
    object(stdClass)#3 (2) {
        ["id"]=>
        string(1) "2"
        ["name"]=>
        string(12) "苏南大叔"
    }
    */
    var_dump($row->name);  // string(12) "苏南大叔"
}

mysqli_fetch_field(),字段属性详情

mysqli_fetch_field()返回的是字段的属性详情,并不是表里面的数据,和前几个函数区分特别大。

while ($row = mysqli_fetch_field($res)) {  // 对每个字段的解释
    var_dump($row);
    /*
    object(stdClass)#4 (13) {
        ["name"]=>
        string(2) "id"
        ["orgname"]=>
        string(2) "id"
        ["table"]=>
        string(4) "test"
        ["orgtable"]=>
        string(4) "test"
        ["def"]=>
        string(0) ""
        ["db"]=>
        string(4) "coin"
        ["catalog"]=>
        string(3) "def"
        ["max_length"]=>
        int(1)
        ["length"]=>
        int(11)
        ["charsetnr"]=>
        int(63)
        ["flags"]=>
        int(49667)
        ["type"]=>
        int(3)
        ["decimals"]=>
        int(0)
    }
    */
    var_dump($row->name,$row->table,$row->db);
    /*
    string(2) "id"
    string(4) "test"
    string(4) "coin"
    */
}

表格总结

这几个取数据的函数,都属于游标类型的,while循环到末尾后,就需要再次query。而mysqli_fetch_field()则不属于这其中。

函数返回值返回值类型索引类型游标影响
mysqli_fetch_array表里的数据数组数字、字段
mysqli_fetch_row表里的数据数组数字
mysqli_fetch_assoc表里的数据数组字段
mysqli_fetch_object表里的数据对象字段
mysqli_fetch_field字段的属性对象字段

变种写法

除了while循环这种写法外,这里有几个变种的写法,很简单的。

核心点就是:

mysqli_fetch_【.*】($res);

变成了:

$res->fetch_【.*】();

苏南大叔:php通过mysqli扩展查询数据有哪些方案?mysqli_fetch_系列 - mysqli-fetch
php通过mysqli扩展查询数据有哪些方案?mysqli_fetch_系列(图2-2)

示例代码:

$res = mysqli_query($conn, 'SELECT * from test order by id desc');
$row = mysqli_fetch_array($res);
var_dump($row[1],$row["name"]);            // 苏南大叔 苏南大叔

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_row($res);
var_dump($row["1"]);                        // 苏南大叔

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_assoc($res);
var_dump($row["id"]);                       // 2

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_object($res);
var_dump($row->name);                       // 苏南大叔

$row = mysqli_fetch_field($res);
var_dump($row->name,$row->table,$row->db);  // id test coin

开始变形:

$res = mysqli_query($conn, 'SELECT * from test order by id desc');
$row = $res -> fetch_array();
var_dump($row[1],$row["name"]);            // 苏南大哥 苏南大哥

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_row();
var_dump($row["1"]);                        // 苏南大哥

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_assoc();
var_dump($row["id"]);                       // 2

$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_object();
var_dump($row->name);                       // 苏南大哥

$row = $res -> fetch_field();
var_dump($row->name,$row->table,$row->db);  // id test coin

结语

说实话,写这种编程细节,必须通过能赚钱的产品,才能取得最好的效果。更多php文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    mysql