Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.100.120] |
|
Сообщ.
#1
,
|
|
|
Изучаю PHP и попутно дописываю движок phpBB. Возникла такая ситуация:
$sql = "some_query"; //не важно, какой запрос while ($arr1 = $db->sql_fetchrow($result) ) { echo $arr1[1]; } При первом "прогоне" while выводятся нужные данные. При повторении же цикла, ничего не выводится ($db->sql_fetchrow возвращает false). Как мне реализовать повтор этого цикла? |
Сообщ.
#2
,
|
|
|
Лучше всего в письменном виде и попросить его настойчиво - вот тогда пусть и реализовывается.
А реально, вместо $var=$db->fetchrow_array в условие вставь true, тогда будет и повторный и третий уж раз и четвёртый... Не сосчитаешь. Что такое "$db"? Не знаю такого. |
Сообщ.
#3
,
|
|
|
Не совсем понятно, если не сказать - совсем непонятно. Результат содержит несколько строк с данными. while($arr = $db->sql_fetchrow($result)) выполняется до конца result set. Так что же не так? Можно поподробнее?
Под повторением цикла имеется ввиду еще один такой же while()? Ну тогда все ясно! Нужно вызвать $result = $db->sql_query($sql) еще раз. Дело в том, что вызов sql_fetchrow() не работает с локальной PHP переменной result set, а производит обращение к самой базе. При этом данные результата удаляются. Поэтому запрос придется вызвать еще раз. |
Сообщ.
#4
,
|
|
|
Цитата Trustmaster, 11.09.04, 09:31 Нужно вызвать $result = $db->sql_query($sql) еще раз. У меня была мысль об этом. Но всё же не хотелось ещё раз делать запрос к БД. Ну, раз Цитата Trustmaster, 11.09.04, 09:31 sql_fetchrow()... производит обращение к самой базе тогда особой разницы, как я понимаю, нет? |
Сообщ.
#5
,
|
|
|
Тут хочешь - не хочешь, а все равно запрос придется еще раз вызывать, потому что result set хранится в памяти самой базы, и после прохода первого while() полностью удаляется. Есть альтернативное решение: копировать весь result set в локальный массив и проходить несколько раз уже по нему.
|
Сообщ.
#6
,
|
|
|
Я бы делал так:
mysql_connect("localhost","user","password"); mysql_select_db("some_db"); $query="SELECT * FROM Sometable"; $result=mysql_query($query); // теперь две функции, первая считает кол-во строк, вторая перебирает весь массив echo mysql_num_rows($result); // кол-во возвращаемых запросом строк while ($line=mysql_fetch_array($result)) { echo "ID: ".$line[0]; // обращаюсь к нулевой колонке, возвращаемой запросом } Я правильно понял задачу? M Используем подсветку! |
Сообщ.
#7
,
|
|
|
Не-а, неправильно. А теперь вызови while() еще раз и посмотри, что он тебе выдаст |
Сообщ.
#8
,
|
|
|
Точно.
Тогда массив делаешь тоже самое, просто в while вормируешь вместо вывода $Arr[]=$line[0] затем пресловутая конструкция foreach ($Arr as $Item) { .... } |
Сообщ.
#9
,
|
|
|
Ага, а при больших выборках?
result, как параметр хранится в классе. В конце вызываешь mysql_free_result. Ещё можно поиграть с областью видимости, как в Perl или Python: sub fibo { my($a, $b)=(1, 0); +sub{ ############################### #Вместо следующих вычислений могла бы быть mysql_fetch_array ############################### +${(\(($a, $b)=($b, $a)))[1]}+=$a ############################### } } local$fibo=&fibo; print &$fibo,"<br>\n" foreach 1..10; |
Сообщ.
#10
,
|
|
|
Цитата Trustmaster, 11.09.04, 11:31 копировать весь result set в локальный массив и проходить несколько раз уже по нему. Ну, с алгоритмами у меня вроде-бы неплохо (сказывается опыт в других языках), поэтому я сам так и сделал. Но, всё равно огромное спасибо всем! |
Сообщ.
#11
,
|
|
|
Запрос вызвали. Поля объекта БД проинициализировали результатами запроса.
Результаты взяли (store или use result). Поля результата объекта БД перенеслись в нашу переменную. Всё, там уже ничего нет! Поэтому придётся вызывать запрос ещё раз. Если нужно несколько, тогда нужно переносить в отдельный массив. |
Сообщ.
#12
,
|
|
|
[оффтопик, но в тему]Спасибо, Song, что подтвердил мои слова [/оффтопик]
|
Сообщ.
#13
,
|
|
|
И тебе, Trustmuster, спасибо, что боролся за правое дело и победил-таки в большинстве состава сторонников своей идеи. Помог-таки и в этой задаче.
|