mysql查询中的php计数元素返回两倍的元素数

kb5ga3dv  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(367)

我正在尝试获取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为什么会这样吗?有没有办法在查询行中获得正确的元素数?

9rygscc1

9rygscc11#

这种行为很好,因为数组同时包含索引号和列名,所以您可以通过以下两种方式方便地访问字段: $row[0] 或者 $row['col_name'] 尝试改用rowcount方法。以下是使用mysqli时的代码:

echo $query->num_rows();
ddrv8njm

ddrv8njm2#

违约行为 fetch_array() 两者的索引都具有列名和数字位置。当你做一个 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参数,您可能更喜欢其中一个函数。
bq9c1y66

bq9c1y663#

您将得到一个数组格式的结果,该格式同时具有编号数组和关联数组。

$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

相关问题