[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Странное поведение foreach цикла? Удвоение данных
goodguy
Пытаюсь вывести все данные из первой строки таблицы с помощью цикла:

$query = mysql_query("SELECT * FROM test_base WHERE id = 1") or die(mysql_error());
$result = mysql_fetch_array($query);

foreach($result as $i) {
echo $i . "<br />";
}

Данные выводятся, но каждое значение выводится по два раза, например
1
1
name
name
9999999
9999999

и т. д.

при этом, если делаю обычный for цикл, то все работает нормально


$query = mysql_query("SELECT * FROM test_base WHERE id = 1") or die(mysql_error());
$result = mysql_fetch_array($query);

for ($i = 0; $i < sizeof($result); $i++) {
echo $result[$i] . "<br />";
}

выведет:
1
name
9999999

В чем подвох? :rolleyes:

И длину массива $result почему-то выводит 22, если после цикла сделать так
echo sizeof($result);

Хотя в таблице 11 колонок :unsure: Похоже на ассоциативный массив, но как сделать индексированный?



Спустя 23 минуты, 37 секунд (29.01.2011 - 12:19) aparion написал(а):
mysql_fetch_array возвращает каждое значение с числовым индексом и с индексом, равным названию колонки в таблице. Посмотри что содержится в $result и все увидишь.

Спустя 1 минута, 21 секунда (29.01.2011 - 12:20) Snus написал(а):
Ты сделай дамп своего $result и поймешь в чем дело.

Тебе поможет
$result = mysql_fetch_assoc($query);

Спустя 46 секунд (29.01.2011 - 12:21) Michael написал(а):
mysql_num_fields

Спустя 1 минута, 42 секунды (29.01.2011 - 12:23) Snus написал(а):
Michael
А это-то как горю поможет? smile.gif

Спустя 1 минута, 44 секунды (29.01.2011 - 12:24) goodguy написал(а):
Вопрос решен. Сделал так:
$result = mysql_fetch_array($query, MYSQL_NUM);


Просто не сразу понял, что надо копать в сторону mysql_fetch_array, а не циклов :)

Спустя 2 минуты, 6 секунд (29.01.2011 - 12:26) Snus написал(а):
goodguy
А спасибо не сказал dry.gif

Спустя 2 минуты, 24 секунды (29.01.2011 - 12:29) goodguy написал(а):
Спасибо всем кто принял участие в теме smile.gif

Но это решение я нашел самостоятельно, здесь. Никто ведь не сказал, что нужно добавить второй параметр в фетч эррэй cool.gif

Спустя 2 часа, 7 минут, 55 секунд (29.01.2011 - 14:37) Michael написал(а):
Цитата (Snus @ 29.01.2011 - 11:23)
Michael
А это-то как горю поможет? smile.gif

Спустя 1 минута, 36 секунд (29.01.2011 - 14:38) Snus написал(а):
Michael
Зачем посылать еще один запрос в БД? Ему достаточно было ответа про assoc

Спустя 15 минут, 17 секунд (29.01.2011 - 14:54) Michael написал(а):
какой второй запрос?

Спустя 4 минуты, 24 секунды (29.01.2011 - 14:58) Snus написал(а):
Michael
mysql_num_fields

Спустя 8 минут, 12 секунд (29.01.2011 - 15:06) twin написал(а):
Блин, ты хоть бы почитал ман. Michael всё показал.
Тут цикл вообще не нужен, есть для этого функция и даже ссыль на неё.

Спустя 4 минуты, 7 секунд (29.01.2011 - 15:10) goodguy написал(а):
Хоть убейте не пойму чем mysql_list_fields() проще того варианта, чем использовал я unsure.gif
И какой отношение эта функция вообще имеет к вопросу?

Цитата
Retrieves the number of fields from a query.

Я и так знаю, что их 11

Спустя 3 минуты, 30 секунд (29.01.2011 - 15:14) Snus написал(а):
twin
Торарищи, если вы подсказываете человеку, то лучше говорите как лучше.
Использовать
mysql_query() и mysql_num_rows() в одном запросе зачем надо?

$query = "SELECT * FROM `your_table`";
$result = mysql_query($query) or die(mysql_error());
echo '<table border="1">';
while ( $row = mysql_fetch_assoc($result) ){
echo '<tr>';
foreach($row as &$val){
echo '<td>'.$val.'</td>';
}
echo '</tr>';
}
mysql_free_result($result);
echo '</table>';

Спустя 43 минуты (29.01.2011 - 15:57) twin написал(а):
Где ты в его коде увидел построчный разбор? Ему нужно перебрать поля. Тут второй цикл не нужен вообще.


Спустя 2 минуты, 10 секунд (29.01.2011 - 15:59) Snus написал(а):
twin
Ну так еще проще.

$query = "SELECT * FROM `your_table`";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($result);
echo '<table border="1">';
echo '<tr>';
foreach($row as &$val){
echo '<td>'.$val.'</td>';
}
echo '</tr>';
mysql_free_result($result);
echo '</table>';

Спустя 9 минут, 23 секунды (29.01.2011 - 16:08) Michael написал(а):
Цитата (Snus @ 29.01.2011 - 13:58)
Michael
<pre class="sh_sourceCode" rel="php">mysql_num_fields</pre>

Эта функция не отсылает запрос к базе, а берет данные с пришедшего результата(с переменной $result)


Цитата (goodguy)
И какой отношение эта функция вообще имеет к вопросу?

Если так пишешь:
    
$res = mysql_query( "SELECT * from users" ) or die(mysql_error($c));
$row = mysql_fetch_row($res);
print_r($row);

Выведет:
Array
(
[0] => 1
[1] => a
)

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

Посмотри, что выведет mysql_fetch_array и поймешь почему два раза выводилось.

Это:
$result = mysql_fetch_array($query, MYSQL_NUM);

решение - то же верное, как и mysql_fetch_assoc

Спустя 1 час, 22 минуты, 19 секунд (29.01.2011 - 17:31) Snus написал(а):
Michael
Значит, не правильно сформулировал я. Зачем просчитывать кол-во строк , а потом циклом проходить, когда можно все сделать более быстро при помощи foreach?

Спустя 17 часов, 55 минут, 9 секунд (30.01.2011 - 11:26) Michael написал(а):
Цитата (Snus @ 29.01.2011 - 16:31)
Michael
Значит, не правильно сформулировал я. Зачем просчитывать кол-во строк , а потом циклом проходить, когда можно все сделать более быстро при помощи foreach?

столбцов, а не строк ... ответ выше.

Спустя 8 минут, 56 секунд (30.01.2011 - 11:35) Dron19 написал(а):
Цитата (Snus @ 29.01.2011 - 14:31)
Michael
Значит, не правильно сформулировал я. Зачем просчитывать кол-во строк , а потом циклом проходить, когда можно все сделать более быстро при помощи foreach?

я уже сто раз говорил, что нужно лучше как можно больше избегать foreach!

Спустя 5 минут, 34 секунды (30.01.2011 - 11:40) Snus написал(а):
Michael
Дико извиняюсь. Не доглядел, что ты mysql_num_fileds написал. Мне краем зрения показалось, что mysql_num_rows. Но это сути не меняет. assoc + foreach
Dron19
И почему же?

Спустя 2 минуты, 44 секунды (30.01.2011 - 11:43) Dron19 написал(а):
Цитата (Snus @ 30.01.2011 - 08:40)
Michael
Дико извиняюсь. Не доглядел, что ты mysql_num_fileds написал. Мне краем зрения показалось, что mysql_num_rows. Но это сути не меняет. assoc + foreach
Dron19
И почему же?

он работает через чур уж медленно

Спустя 57 секунд (30.01.2011 - 11:44) Dron19 написал(а):
НО!!! Есть конечно такие ситуации, когда без него никак.... Нужно сделать всевозможное, чтобы обойтись без него
Это я советую

Спустя 57 секунд (30.01.2011 - 11:45) Snus написал(а):
Dron19
А что работает быстрее? Уже linker вроде проводил текст for, foreach и while - ну может на микросекунду отличается.

Спустя 1 минута, 30 секунд (30.01.2011 - 11:46) Dron19 написал(а):
нет, while самый быстрый из них. For неощутимо медленней, а foreach секунды на две на полноценной странице в интернете. Я тоже мерил, кстати во многих книгах это написано

Спустя 1 минута, 59 секунд (30.01.2011 - 11:48) Dron19 написал(а):
могу тебе скинуть одну из них

Спустя 2 минуты, 1 секунда (30.01.2011 - 11:50) Snus написал(а):
Dron19
Каждой ситуации - свое решение.

Спустя 1 минута, 29 секунд (30.01.2011 - 11:52) Dron19 написал(а):
но лучше избегай таких ситуаций, то есть решай их более оптимальным способом

Спустя 5 минут, 38 секунд (30.01.2011 - 11:58) Snus написал(а):
Dron19
Только разница не в секундах, а в микросекундах различается.

Спустя 7 минут, 53 секунды (30.01.2011 - 12:05) Snus написал(а):
Dron19
Да простит меня twin... Я ошибся, не linker тест проводил, а twin. Вот тебе ссыль. Пробуй у себя. И покончим с темой про foreach
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.