• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-25) 22次浏览 已收录 0个评论
文章目录[隐藏]

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

<code><?phpclass 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;                // 8echo '<br />';$size = sizeof($result);echo $size;                // 8echo '<br />';for($i = 0; $i < $count; $i++){    echo $result[$i];    echo '<br />';}</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><?phpclass 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);    }        <span style="color:transparent">~来1源gaodai#ma#com搞*代#码1网</span><abbr>搞代gaodaima码</abbr>    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;                // 8echo '<br />';$size = sizeof($result);echo $size;                // 8echo '<br />';for($i = 0; $i < $count; $i++){    echo $result[$i];    echo '<br />';}</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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysqli_fetch_array() 返回值数组的大小问题?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址