Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Проблемы с многократным mysql_fetch_array


Автор: Addmin 14.12.2010, 19:38
Здравствуйте!

Вот такая проблема. Мне в двух разных местах страницы нужно сделать вывод из одного и того же запроса. Делаю так:

Код

$query = "SELECT * FROM table WHERE id=1"
$result = mysql_query($query);

while ($row = mysql_fetch_array($result))
{
    echo $result['first'];
}

//Здесь идет какой-то HTML...

while($row = mysql_fetch_array($result))
{
    echo $result['second'];
}


Вывод второго параметра не происходит! Программа вообще не входит во второй цикл while. 

Но если сделаю вот так (то есть ещё раз сделаю запрос к базе):

Код

$query = "SELECT * FROM table WHERE id=1"
$result = mysql_query($query);

while ($row = mysql_fetch_array($result))
{
    echo $result['first'];
}

//Здесь идет какой-то HTML...

$query = "SELECT * FROM table WHERE id=1"
$result = mysql_query($query);

while($row = mysql_fetch_array($result))
{
    echo $result['second'];
}


Все работает, как положено. Из-за чего такое? Я подумал, что помочь может функция reset(), но куда её не вставь - пишет, что её параметр "плохой" и массивом вовсе не является.

Пожалуйста, подскажите, как быть в такой ситуации?

Автор: bars80080 14.12.2010, 20:08
Цитата(Addmin @  14.12.2010,  18:38 Найти цитируемый пост)
Программа вообще не входит во второй цикл while. 

ясен пень, ты ж уже сделал выборку. это как чтение файла: читаешь сначала по строчке в цикле функцией fgets, дочитываешь до конца, и всё EOF (конец файла). для повторного выбора - надо перевести указатель в начало

как переводить указатель в начало mysql - не скажу, просто не знаю. а не знаю, потому что это не нужно, ибо можно было прекрасно все данные из запроса ещё при первой выборке занести в массив, и во втором случае прокручивать уже этот массив

Автор: Addmin 14.12.2010, 20:19
Цитата

как переводить указатель в начало mysql - не скажу, просто не знаю. а не знаю, потому что это не нужно, ибо можно было прекрасно все данные из запроса ещё при первой выборке занести в массив, и во втором случае прокручивать уже этот массив 

Объясни, пожалуйста, как при первой выборке заносить в массив? smile Я не понял и попробовал просто сделать ещё один массив $result_2, которому присвоил массив $result.

 То есть так: $result_2 = $result; 

Безрезультатно, массив пуст.

Цитата

ясен пень, ты ж уже сделал выборку. это как чтение файла: читаешь сначала по строчке в цикле функцией fgets, дочитываешь до конца, и всё EOF (конец файла). для повторного выбора - надо перевести указатель в начало

Я же работаю с массивом, а не с mysql, по логике (как мне представляется логичным) я мог просто сделать reset на "прокрученный" массив и получить точно такой же, какой и был в начале. Или что-то здесь совсем не так? Или MySQL'евский массив - просто значения из выборки, а никакой не настоящий массив?

Автор: skyboy 14.12.2010, 20:24
Цитата(bars80080 @  14.12.2010,  19:08 Найти цитируемый пост)
как переводить указатель в начало mysql - не скажу

http://php.net/mysql_data_seek
Цитата(bars80080 @  14.12.2010,  19:08 Найти цитируемый пост)
ибо можно было прекрасно все данные из запроса ещё при первой выборке занести в массив, и во втором случае прокручивать уже этот массив 

полностью согласен.

Автор: Addmin 14.12.2010, 20:24
mysql_data_seek($result,0)  - возвернет ваш массив взад smile

Спасибо за информацию о MySQL'евских массивах!

Добавлено через 50 секунд
Цитата

полностью согласен. 


А как, как занести данные из выборки в массив?

Добавлено через 3 минуты и 27 секунд
И чем хуже просто вернуть указатель в выборке данных в начало?

Добавлено через 3 минуты и 47 секунд
Вопрос ещё для меня  не решился smile

Автор: bars80080 14.12.2010, 20:31
Цитата(Addmin @  14.12.2010,  19:19 Найти цитируемый пост)
$result_2 = $result; 

в $result нету никаких массивов, там ресурс запроса. это как $fp в $fp = fopen();

Код

$query = "SELECT * FROM table WHERE id=1"
$result = mysql_query($query);

$ar = array();

while ($row = mysql_fetch_array($result))
{
    echo $result['first']; $ar[] = $row;
}


Добавлено через 1 минуту и 9 секунд
Цитата(Addmin @  14.12.2010,  19:24 Найти цитируемый пост)
И чем хуже просто вернуть указатель в выборке данных в начало?

дополнительная работа с другим сервером - mysql. а так массив данных уже у тебя в памяти быстрого доступа

Автор: Addmin 14.12.2010, 20:44
Ага... Большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)