PHP - подсчет элементов в запросе MySQL возвращает удвоенное количество элементов

0

Я пытаюсь получить количество столбцов в результате запроса 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
    Используйте fetch_assoc() или MYSQLI_ASSOC с fetch_array()
  • 2
    Также рассмотрите возможность использования json_encode() вместо сборки JSON.
Теги:

3 ответа

1
Лучший ответ

Поведение fetch_array() по умолчанию - это как индексы с именами столбцов, так и численные позиции. Когда вы делаете var_dump своей $ row, вы увидите нечто похожее на:

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 вы можете предпочесть одну из этих функций.

  • 0
    Спасибо за ваш ответ, это было действительно полезно. Я закончил просто делать json encode , но fetch_row очень полезна для этой и других проблем, которые возникают у меня с тем же сервером.
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
1

это поведение просто отлично, потому что массив содержит как номера индексов, так и имена столбцов, так что вы можете получить доступ к полю удобно либо по $row[0] либо по $row['col_name']

попробуйте вместо этого использовать метод rowCount. Вот код, если вы используете mysqli:

echo $query->num_rows();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню