username = "hands"; $this->password = "hands"; } fu">
当前位置:Gxlcms > PHP教程 > mysqli_fetch_array()返回值数组的大小问题?

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

时间:2021-07-01 10:21:17 帮助过:63人阅读

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

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 '
'; $size = sizeof($result); echo $size; // 8 echo '
'; for($i = 0; $i < $count; $i++) { echo $result[$i]; echo '
'; }

我的表的结构是这样的

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)
mysql> select * from book;
+----+----------+-------+----------+
| ID | name     | price | validity |
+----+----------+-------+----------+
|  1 | 高等数学 | 15.00 | onsale   |
|  2 | 线性代数 | 10.50 | unvalid  |
+----+----------+-------+----------+
2 rows in set (0.00 sec)

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

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

回复内容:

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

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 '
'; $size = sizeof($result); echo $size; // 8 echo '
'; for($i = 0; $i < $count; $i++) { echo $result[$i]; echo '
'; }

我的表的结构是这样的

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)
mysql> select * from book;
+----+----------+-------+----------+
| ID | name     | price | validity |
+----+----------+-------+----------+
|  1 | 高等数学 | 15.00 | onsale   |
|  2 | 线性代数 | 10.50 | unvalid  |
+----+----------+-------+----------+
2 rows in set (0.00 sec)

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

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

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

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

Array
(
[0] => Adams
[LastName] => Adams
[1] => John
[FirstName] => John
[2] => London
[City] => London
) 

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

人气教程排行