2013-12-18 4 views
1

Я выполняю запрос в базе данных, которая возвращает array. Я использую цикл foreach для прохождения значений.mysqli_fetch_array() dupeates foreach loop

Database (только 1 запись)

id | field1 | field2 | field3 | field4 | field5 
---|--------|--------|--------|--------|-------- 
1 | value1 |   | value3 | value4 | value5 

PHP Исходный код

$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
$q = mysqli_query($mysqli, "SELECT * FROM my_table"); 

echo "<ul>"; 
    while($q = mysqli_fetch_array($q)) 
    { 
     foreach ($q as $key => $value) 
     { 
      if($value != NULL) 
      { 
       echo "<li>".$value . "</li>"; 

       // Line below used to show column name and corresponding value 
       //echo "<li><strong>{$key}</strong>/<em>{$value}</em></li>"; 
      } 
     } 
    } 
echo "</ul>"; 

Ожидаемый результат HTML

<ul> 
    <li>value1</li> 
    <li>value3</li> 
    <li>value4</li> 
    <li>value5</li> 
</ul> 

Выходной ток

<ul> 
    <li>1</li> 
    <li>1</li> 
    <li>value1</li> 
    <li>value1</li> 
    <li>value3</li> 
    <li>value3</li> 
    <li>value4</li> 
    <li>value4</li> 
    <li>value5</li> 
    <li>value5</li> 
</ul> 

Текущий выпуск

Как вы можете видеть, я тока есть все, что в два раза, и по какой-то причине Wierd, я получаю строку ID, или так я предполагаю, учитывая, что я не получаю вторую строку, когда добавляю новую строку в базу данных.

Альтернативный код

Используя комментируемой линию, я получаю этот выход:

<ul> 
    <li>0/1</li> 
    <li>id/1</li> 
    <li>1/value1</li> 
    <li>field1/value1</li> 
    <li>3/value3</li> 
    <li>field3/value3</li> 
    <li>4/value4</li> 
    <li>field4/value4</li> 
    <li>5/value5</li> 
    <li>field5/value5</li> 
</ul> 

Из того, что я понимаю

  • while петля позволит мне пройти каждая строка из базы данных.
  • A foreach loop похож на цикл while, но вместо того, чтобы проходить через записи базы данных, он проходит через пары ключ/значение из array.

(Пожалуйста, не стесняйтесь, поправьте меня, если я ошибаюсь, об этих предыдущих заявлениях.)

мышление жар угас

  • Я начинаю задаваться вопросом, как я пишу это вопрос, если while и foreach кажутся излишними в том, что оба кажутся синтаксическими анализами, вероятно, вызывая мои дубликаты ...?
  • Не будет ли номер строки (в данном случае 1) ключом?
+0

Может быть, это потому, что $ д существо установить как mysqli_query, а также быть установленным в то время? Может быть, попробуйте 'while ($ r = mysqli_fetch_array ($ q))'? –

+0

Это дает тот же результат, т. Е. В два раза больше того же выхода – davewoodhall

ответ

6

По умолчанию mysqli_fetch_array() возвращается как ассоциативный массив ($key => $value) и числовой массив (0 => value), поэтому вы получаете дубликаты - некоторые из записей имеют имя столбца в качестве ключа, другие имеют числовой индекс.

Если вы хотите ассоциативный массив, вы можете использовать:

mysqli_fetch_array($q, MYSQLI_ASSOC); 
//or 
mysqli_fetch_assoc($q); 

Или числовой массив:

mysqli_fetch_array($q, MYSQLI_NUM); 
//or 
mysqli_fetch_row($q); 

Для получения дополнительной информации: http://www.php.net/manual/en/mysqli-result.fetch-array.php

+3

Отличный улов – Zarathuztra