为了方便使用,我对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