2013-03-19 3 views
1

У меня этот код работал (я думал).использовать foreach() вместо while() с результатом запроса

$sql = "SELECT 
      order.id, 
      order.date 
     FROM 
      order"; 
$result = mysql_query($sql) or die(mysql_error()); 
$rows = mysql_fetch_assoc($result); 

foreach($rows as $row){ 
    echo $row['id'].": ".$row['date']."<br>"; 
} 

Результат был такой же, как если бы я хотел бы использовать:

while($row = mysql_fetch_assoc($result)){ 
    echo $row['id'].": ".$row['date']."<br>"; 
} 

Но странно, сегодня он перестал работать. Или этого никогда не было, но потом я немного сумасшедший.

Я хочу использовать foreach(), потому что массивы $ rows также могут быть «вручную» заполнены, а не из запроса.

Что я делаю неправильно ...?

+5

Вы не можете 'foreach' здесь. Он никогда не работал. Вы только когда-либо выбирали одну строку и повторяли по столбцам * в этой строке с помощью 'foreach'. – meagar

+2

сначала забирает только 1 запись, затем перебирает столбцы записей – Waygood

+0

Почему бы вам не использовать print_r ($ rows) перед любым циклом и проверить, что на самом деле там? У вас будет четкое представление о том, что происходит;) –

ответ

3

Это никогда не срабатывало (правильно). mysql_fetch_assoc() возвращает только одну строку, ваш foreach просто выполняет итерацию столбцов первой строки из набора результатов.

Вы не можете использовать foreach без предварительного использования цикла while (или for) для извлечения строк результатов в массив.

Если вы хотите использовать foreach, как вы говорите, это сделать:

$rows = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $rows[] = $row; 
} 

foreach ($rows as $row) { 
    // ... 
} 

Кроме того, please, don't use mysql_* functions in new code. Они больше не поддерживаются and are officially deprecated. См. red box? Узнайте о prepared statements вместо этого, и используйте PDO или MySQLi - this article поможет вам решить, какой. Если вы выберете PDO, here is a good tutorial.

+0

Спасибо, Дэйв, это ответ! Я не понимаю, почему я думаю, что этот код сработал. Возможно, мне нужен праздник! Я также знаю, что 'mysql_' устарел в php 5.5. На данный момент я делаю небольшие изменения со старым mysql_, позже я обновляю весь сайт с помощью 'mysqli_'. – Timo002

+0

@ Timo002 Btw, если бы вы использовали PDO, код foreach действительно работал :) – NikiC

0

mysql_fetch_assoc читает только одну строку.

Это означает, что foreach повторили колонку одного ряда.

+0

Два способа никогда не были одинаковыми, хотя у вас была одна строка в вашей БД. –

1

Во-первых, стоит знать, что функции mysql_xx() устарели; рекомендуется не использовать их больше, и вместо этого переключите свой код на библиотеки mysqli или PDO.

Теперь, чтобы ответить на ваш вопрос:

Вы не можете использовать foreach с набора записей, возвращенных mysql_xxx() функций. Это просто невозможно.

Однако оба альтернативных интерфейсов (mysqli и PDO) возвращают свои объекты в качестве итераторов набора записей, который означает, что вы можете использовать foreach в петлю над ними.

Таким образом, ответ на ваш вопрос: если вы хотите использовать foreach для циклического преобразования набора записей, вам нужно переключиться на один из других API баз данных.

(в качестве бонуса, если переключатель, другие интерфейсы также обеспечивают довольно много дополнительных функций над старыми mysql_xx() функций)

Смежные вопросы