mysqli_fetch_array() 返回值数组的大小问题?
Jun 06, 2016 pm 08:09 PM
为了方便使用,我对mysqli方法进行了简单的封装:
<code><?php class DatabaseAccesser { var $host; var $username; var $password; var $link; var $resultSet; function __construct() { $this->host = "localhost"; $this->username = "hands"; $this->password = "hands"; } function __destruct() { mysqli_close($this->link); } function connect() { $this->link = mysqli_connect($this->host, $this->username, $this->password); if(!$this->link) { echo mysqli_connect_error(); } } function select_datebase($database) { mysqli_select_db($this->link, $database); } function execute($sql) { $this->resultSet = mysqli_query($this->link, $sql); return $this->resultSet; } function getResultSet() { return $this->resultSet; } function fetch_result() { $row = mysqli_fetch_array($this->resultSet); return $row; } } $test = new DatabaseAccesser(); $test->connect(); $test->select_datebase("handsdb"); $sql = "select * from book"; $test->execute($sql); $result = $test->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> 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> 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->username = "hands"; $this->password = "hands"; } function __destruct() { mysqli_close($this->link); } function connect() { $this->link = mysqli_connect($this->host, $this->username, $this->password); if(!$this->link) { echo mysqli_connect_error(); } } function select_datebase($database) { mysqli_select_db($this->link, $database); } function execute($sql) { $this->resultSet = mysqli_query($this->link, $sql); return $this->resultSet; } function getResultSet() { return $this->resultSet; } function fetch_result() { $row = mysqli_fetch_array($this->resultSet); return $row; } } $test = new DatabaseAccesser(); $test->connect(); $test->select_datebase("handsdb"); $sql = "select * from book"; $test->execute($sql); $result = $test->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> 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> 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] => Adams [LastName] => Adams [1] => John [FirstName] => John [2] => London [City] => London ) </code>
多插一句,从各种角度来看,数据库操作都推荐使用PDO

热门文章

热门文章

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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