目录
回复内容:
首页 后端开发 php教程 mysqli_fetch_array() 返回值数组的大小问题?

mysqli_fetch_array() 返回值数组的大小问题?

Jun 06, 2016 pm 08:09 PM
mysql php

为了方便使用,我对mysqli方法进行了简单的封装:

<code><?php class DatabaseAccesser {
    var $host;
    var $username;
    var $password;
    var $link;
    var $resultSet;
    
    function __construct()
    {
    $this->host = "localhost";
    $this-&gt;username = "hands";
    $this-&gt;password = "hands";
    }
    
    function __destruct()
    {
    mysqli_close($this-&gt;link);
    }
    
    function connect()
    {
    $this-&gt;link = mysqli_connect($this-&gt;host, $this-&gt;username, $this-&gt;password);
    if(!$this-&gt;link)
    {
        echo mysqli_connect_error();
    }
    }
    
    function select_datebase($database)
    {
    mysqli_select_db($this-&gt;link, $database);
    }
        
    function execute($sql)
    {
    $this-&gt;resultSet = mysqli_query($this-&gt;link, $sql);
    return $this-&gt;resultSet;
    }
    
    function getResultSet()
    {
    return $this-&gt;resultSet;
    }
    
    function fetch_result()
    {
    $row = mysqli_fetch_array($this-&gt;resultSet);
    return $row;
    }
    
}


$test = new DatabaseAccesser();
$test-&gt;connect();
$test-&gt;select_datebase("handsdb");
$sql = "select * from book";
$test-&gt;execute($sql);
$result = $test-&gt;fetch_result();

$count = count($result);
echo $count;                // 8
echo '<br>';
$size = sizeof($result);
echo $size;                // 8
echo '<br>';
for($i = 0; $i ';
}
</code>
登录后复制
登录后复制

我的表的结构是这样的

<code>mysql&gt; describe book;
+----------+--------------------------+------+-----+---------+-------+
| Field    | Type                     | Null | Key | Default | Extra |
+----------+--------------------------+------+-----+---------+-------+
| ID       | int(11)                  | NO   | PRI | 0       |       |
| name     | varchar(7)               | NO   |     | NULL    |       |
| price    | decimal(6,2)             | NO   |     | NULL    |       |
| validity | enum('onsale','unvalid') | NO   |     | onsale  |       |
+----------+--------------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)</code>
登录后复制
登录后复制
<code>mysql&gt; select * from book;
+----+----------+-------+----------+
| ID | name     | price | validity |
+----+----------+-------+----------+
|  1 | 高等数学 | 15.00 | onsale   |
|  2 | 线性代数 | 10.50 | unvalid  |
+----+----------+-------+----------+
2 rows in set (0.00 sec)
</code>
登录后复制
登录后复制

很显然,这个表只有4列,然而在测试输出的时候,用 mysqli_fetch_array() 取一行结果数组,发现数组竟然有8个元素,而且后面四个是空的,无法输出。把表调整为3列之后数组元素变为6个,说明问题可复现且有规律。

请问
1.为什么数组的元素数会变为列数的两倍? mysqli_fetch_array() 就是这么设计的吗?
2.在不知道表的所有列名的时候,怎么安全的遍历输出所有记录?

回复内容:

为了方便使用,我对mysqli方法进行了简单的封装:

<code><?php class DatabaseAccesser {
    var $host;
    var $username;
    var $password;
    var $link;
    var $resultSet;
    
    function __construct()
    {
    $this->host = "localhost";
    $this-&gt;username = "hands";
    $this-&gt;password = "hands";
    }
    
    function __destruct()
    {
    mysqli_close($this-&gt;link);
    }
    
    function connect()
    {
    $this-&gt;link = mysqli_connect($this-&gt;host, $this-&gt;username, $this-&gt;password);
    if(!$this-&gt;link)
    {
        echo mysqli_connect_error();
    }
    }
    
    function select_datebase($database)
    {
    mysqli_select_db($this-&gt;link, $database);
    }
        
    function execute($sql)
    {
    $this-&gt;resultSet = mysqli_query($this-&gt;link, $sql);
    return $this-&gt;resultSet;
    }
    
    function getResultSet()
    {
    return $this-&gt;resultSet;
    }
    
    function fetch_result()
    {
    $row = mysqli_fetch_array($this-&gt;resultSet);
    return $row;
    }
    
}


$test = new DatabaseAccesser();
$test-&gt;connect();
$test-&gt;select_datebase("handsdb");
$sql = "select * from book";
$test-&gt;execute($sql);
$result = $test-&gt;fetch_result();

$count = count($result);
echo $count;                // 8
echo '<br>';
$size = sizeof($result);
echo $size;                // 8
echo '<br>';
for($i = 0; $i ';
}
</code>
登录后复制
登录后复制

我的表的结构是这样的

<code>mysql&gt; describe book;
+----------+--------------------------+------+-----+---------+-------+
| Field    | Type                     | Null | Key | Default | Extra |
+----------+--------------------------+------+-----+---------+-------+
| ID       | int(11)                  | NO   | PRI | 0       |       |
| name     | varchar(7)               | NO   |     | NULL    |       |
| price    | decimal(6,2)             | NO   |     | NULL    |       |
| validity | enum('onsale','unvalid') | NO   |     | onsale  |       |
+----------+--------------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)</code>
登录后复制
登录后复制
<code>mysql&gt; select * from book;
+----+----------+-------+----------+
| ID | name     | price | validity |
+----+----------+-------+----------+
|  1 | 高等数学 | 15.00 | onsale   |
|  2 | 线性代数 | 10.50 | unvalid  |
+----+----------+-------+----------+
2 rows in set (0.00 sec)
</code>
登录后复制
登录后复制

很显然,这个表只有4列,然而在测试输出的时候,用 mysqli_fetch_array() 取一行结果数组,发现数组竟然有8个元素,而且后面四个是空的,无法输出。把表调整为3列之后数组元素变为6个,说明问题可复现且有规律。

请问
1.为什么数组的元素数会变为列数的两倍? mysqli_fetch_array() 就是这么设计的吗?
2.在不知道表的所有列名的时候,怎么安全的遍历输出所有记录?

看这个就知道了PHP mysql_fetch_array() 函数

mysqli_fetch_array有两个参数,第二个参数不指定的时候默认为产生关联和数字数组,会输出类似以下结构的数组

<code>Array
(
[0] =&gt; Adams
[LastName] =&gt; Adams
[1] =&gt; John
[FirstName] =&gt; John
[2] =&gt; London
[City] =&gt; London
) </code>
登录后复制

多插一句,从各种角度来看,数据库操作都推荐使用PDO

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和时间

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

CakePHP 项目配置

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

CakePHP 文件上传

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

讨论 CakePHP

如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 Dec 09, 2024 am 11:42 AM

如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles