username = "hands"; $this->password = "hands"; } fu">
时间:2021-07-01 10:21:17 帮助过:63人阅读
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