PHP - MySQL查询中的计数元素返回元素数量的两倍

时间:2018-05-29 18:53:10

标签: php mysql

我正在尝试获取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会这样做?有没有办法在查询行上获取正确数量的元素?

3 个答案:

答案 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一起使用,您可能更喜欢其中一个函数。