我正在尝试获取SQL查询结果的列数。每当我尝试使用count($row)
时,表应该只有4个元素,但是它显示8,而implode(",",$row)
表明实际上有8个元素但是输出有点奇怪:
代码片段:
$query = $con->query($sql);
$rows = array();
error_log($sql);
if(!$query){error_log(mysqli_error($con));exit;}
while($row = $query->fetch_array()){
$rows[]=$row;
}
if(count($rows)==0) { echo "101"; exit; }
echo '{"row":[';
foreach($rows as $key=>$row) {
error_log(count($row));
error_log(implode(",",$row));
error_log($row[0]." ".$row[1]." ".$row[2]." ".$row[3]);
}
echo "]}";
结果:
[Tue May 29 13:47:21 2018] 8
[Tue May 29 13:47:21 2018] AFI,AFI,001,001,Pancho,Pancho,a1d7584daaca4738d499ad7082886b01117275d8,a1d7584daaca4738d499ad7082886b01117275d8
[Tue May 29 13:47:21 2018] AFI 001 Pancho a1d7584daaca4738d499ad7082886b01117275d8
如您所见,八个元素存在,但它们只是正确输出的重复,由error_log($row[0]." ".$row[1]." ".$row[2]." ".$row[3]);
表示。
有谁知道为什么PHP会这样做?有没有办法在查询行上获取正确数量的元素?
答案 0 :(得分:1)
该行为很好,因为该数组同时包含索引号和列名,因此您可以通过$row[0]
或$row['col_name']
方便地访问字段
尝试使用rowCount方法。以下是使用mysqli时的代码:
echo $query->num_rows();
答案 1 :(得分:1)
你得到的结果是数组格式,它有编号和关联数组。
$query->fetch_array() or $query->fetch_array(MYSQLI_BOTH) // this fetches both type
虽然这个
$query->fetch_array(MYSQLI_ASSOC) // this fetches as associative array
和仅编号的数组
$query->fetch_array(MYSQLI_NUM); // this as numbered array
答案 2 :(得分:1)
fetch_array()
的默认行为是两个索引都具有列名和数字位置。当你执行$ row的var_dump
时,你会看到类似于:
array(
0 => 'AFI',
'column_name_1' => 'AFI',
1 => '001',
'column_name_2' => '001',
// and so on
)
fetch_array()
只需一个参数即可更改此行为。默认值为MYSQLI_BOTH
,提供上述输出。您可以将其更改为$query->fetch_array(MYSQLI_NUM)
以仅获取数字索引,或将$query->fetch_array(MYSQL_ASSOC)
更改为仅获取索引上具有列名的值。
使用其中任何一个时,count()
也会提供正确的列数。
注意:$query->fetch_row()
与$query->fetch_array(MYSQLI_NUM)
相同(且更短),$query->fetch_assoc()
与$query->fetch_array(MYSQLI_ASSOC)
相同。而不是将fetch_array()
与array-notation-argument一起使用,您可能更喜欢其中一个函数。