[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложно придумать говорящее название.
Гость
Доброго дня уважаемы php программисты! Вчера долгое время потратил на реализацию одного скрипта, который никак не удается. Код представлен ниже

$db = mysql_connect('localhost','login','password'); /*Подключаемся к MySQL серверу*/
mysql_select_db('test', $db); /*Выбираем базу данных*/

$result = mysql_query("SELECT * FROM test.test ORDER BY id"); /*Получаем результат в буфер*/

function my($limit, $result) { /*Функция выводит данные из БД по 5 записей*/

$i = 0; /*Счетчик, предназначенный для подсчета повторов цикла while*/
while($i<$limit and $myrow = mysql_fetch_array($result)) { /*Делай, пока цикл while не прошел 5 повторений и пока в базе данных не закончились записи*/
echo '<br/>'.$myrow['name'].'<br/>';
$i++;
};
}

while(/*Тут какие-то условия*/) {
my(5, $result);
}

/*Задача. Запустить функцию my() через цикл while таким образом, что бы информация выводилась из БД строго по порядку и до тех пор, пока не кончатся записи в БД*/




Задача описана в коде скрипта. Так же хочется отметить, что этот пример - упрощенный вид более сложной программы, над которой я сейчас работаю, по этому этот скрипт надо выполнить именно так, как описано в задаче - запускать функциюь my() через цикл while. Если удастся понять, как работает этот простой скрипт, то и более сложные программы на этой основе будут удаваться. Заранее спасибо.



Спустя 20 минут, 35 секунд (14.04.2010 - 09:03) sergeiss написал(а):
Цитата (Гость @ 14.04.2010 - 09:42)
Задача. Запустить функцию my() через цикл while таким образом, что бы информация выводилась из БД строго по порядку и до тех пор, пока не кончатся записи в БД

Не надо ничего придумывать, всё уже придумано давно smile.gif

Вот тут читай: http://phpforum.ru/index.php?showtopic=21916

И еще. Используй тэги оформления кода! Удобнее же читать... Сейчас я отредактировал твой пост - видишь разницу?

Спустя 21 минута, 14 секунд (14.04.2010 - 09:24) Гость написал(а):
Ссылка на ваш материал мне никак не помогла. Есть конкретная задача - запустить функцию my() через цикл while и в вашем примере я не заметил ничего подобного.

Спустя 3 минуты, 23 секунды (14.04.2010 - 09:27) sergeiss написал(а):
Сделай сначала БЕЗ функции. Просто в цикле вывод. Или просто подумай, как это сделать.
А потом вынеси нужную тебе часть в отдельную функцию... Или я просто не понимаю, что тебе не понятно?

Цитата (Гость @ 14.04.2010 - 10:24)
Есть конкретная задача...

Вполне естественно, что именно такой задачи не будет по какой-то ссылке smile.gif

По указанной мной ссылке четко расписаны основы вывода данных из БД. Основы! На базе которых уже можно (и нужно) делать что-то своё.

Спустя 8 минут, 59 секунд (14.04.2010 - 09:36) Гость написал(а):
Скорее всего вы не понимаете, что мне нужно. ) Я знаю, как получить данные из БД без функции и знаю как получать их до тех пор, пока они есть в БД. Но, повторяю, этот код - упрощенный пример более сложной программы! Если бы нужно было просто вытащить информаию из БД я бы даже не полез на форум в поисках ответов. В более сложном примере в функцию my() переносится множество аргументов, благодаря чему она становится универсальной функцией.

Но на самом деле я уже нашел решение данной задачи методом тыка.



$db = mysql_connect('localhost','login','password'); /*Подключаемся к MySQL серверу*/
mysql_select_db('test', $db); /*Выбираем базу данных*/

$result = mysql_query("SELECT * FROM test.test ORDER BY id"); /*Получаем результат в буфер*/

function my($limit, $result) { /*Функция выводит данные из БД по 5 записей*/

$i = 0; /*Счетчик, предназначенный для подсчета повторов цикла while*/
while($i<$limit and $myrow = mysql_fetch_array($result)) { /*Делай, пока цикл while не прошел 5 повторений и пока в базе данных не закончились записи*/
echo '<br/>'.$myrow['name'].'<br/>';
$i++;
};
}

while(my(5, $result)) {

}


/*В качестве условия нужно указать саму функцию, а тело цикла while оставить пустым*/

Спустя 7 минут, 11 секунд (14.04.2010 - 09:43) sergeiss написал(а):
Цитата (Гость @ 14.04.2010 - 10:36)
Но на самом деле я уже нашел решение данной задачи методом тыка.

Решение (теоретически) хорошее, но (практически) не рабочее. Потому что подразумевается, что функция возвращает значение (логическое), а она нифига не возвращает.

Спустя 17 минут, 25 секунд (14.04.2010 - 10:01) Гость написал(а):
Вы совершенно правы! Я не указал, что нужно возвращать из функции. Вот пример рабочего кода:


<?php
$db = mysql_connect('localhost','admin','112233'); /*Подключаемся к MySQL серверу*/
mysql_select_db('test', $db); /*Выбираем базу данных*/

$result = mysql_query("SELECT * FROM test.test ORDER BY id"); /*Получаем результат в буфер*/

function my($limit, $result) { /*Функция выводит данные из БД по 5 записей*/
$i = 0; /*Счетчик, предназначенный для подсчета повторов цикла while*/
while($i<$limit and $myrow = mysql_fetch_array($result)) { /*Делай, пока цикл while не прошел 5 повторений и пока в базе данных не закончились записи*/
echo $myrow['name'].'<br/>';
$i++;
};
return $myrow['name']; /*Функция возвращает полученные данные из БД*/
}


while(my(5, $result)) {

}

?>


Если можете, прокомментируйте этот код. Т. е. я его сделал, но не совсем понимаю, как он работает. В этом минус метода тыка.

Не совсем понятно, что будет возврящать функция my(), когда информация в БД закончится и $myrow['name'] ничему не будет равен. Может она будет возвращять false?

Так же не ясно, на чем строится условие цикла while. Т. е., если описывать его работу русским языком, то получится: "Если функция my() выполняется, то выполнить её еще раз и так до тех пор, пока она не перестанет выполнятся". Или как?

Спустя 3 минуты, 10 секунд (14.04.2010 - 10:04) Dezigo написал(а):
чем тебе
SELECT * FROM test.test ORDER BY id LIMIT 5

не устраивает?
LIMIT 5

Спустя 4 минуты, 56 секунд (14.04.2010 - 10:09) Гость написал(а):
Dezigo

Да, при помощи LIMIT 5 можно получить из БД только 5 записей, но это простая версия более сложного скрипта. В реальных условиях значение переменной $limit постоянно меняется, благодаря чему в разные участки кода мы можем вставлять разное количество записей.

Спустя 7 минут, 58 секунд (14.04.2010 - 10:17) twin написал(а):
Выбросить нужно функцию мю, а не комментировать. )))
Для чего вытаскивать из базы всю таблицу, что бы потом ограничить вывод в цикле?
Но начнем не с этого. А вот с этого:
while($i<$limit and $myrow = mysql_fetch_array($result))

Это рабочий вариант конечно, но какой то кривоватый. Для остановки цикла обычно используется break.

while($myrow = mysql_fetch_array($result)) { 
if($i >= $limit)break;

И использовать лучше mysql_fetch_assoc()

Дальше. Возвращает функция при таком раскладе единственное значение, а именно содержимое ячейки `name` последней строки. А до этого зачем то отправляет все в поток...
echo $myrow['name'].'<br/>';

А самое главное, лимит нужно подставлять прямо в запрос и не выдумывать всяческих функций:

$result = mysql_query("SELECT * FROM test.test ORDER BY id LIMIT ". $limit);


Спустя 47 минут, 32 секунды (14.04.2010 - 11:05) Гость написал(а):
twin

В начале хочется отметить, что данный код используется для постраничной разбивки данных из таблицы test, написанной на JS. Функцией my() мы извлекаем информацию из БД в разные участки кода JS и таким образом получаем постраничную разбивку. Тут нет смысла выкладывать пример кода JS. При необходимость сделать постраничную разбивку вы сможете написать его самостоятельно или найти соответствующие темы на форумах.

Цитата
Для чего вытаскивать из базы всю таблицу, что бы потом ограничить вывод в цикле?


Что бы получить информацию из БД строго по порядку и потом использовать для постраничной разбивки.

Цитата
И использовать лучше mysql_fetch_assoc()


Согласен, если использовать эту функцию, сервер будет менее загружен.

Цитата
Дальше. Возвращает функция при таком раскладе единственное значение, а именно содержимое ячейки `name` последней строки. А до этого зачем то отправляет все в поток...


Таким образом мы можем вставлять информацию в JS код. Т. е. мы просто указываем в нужном месте my(); и php размещает туда информацию из БД.

Цитата
А самое главное, лимит нужно подставлять прямо в запрос и не выдумывать всяческих функций:


Если делать так, как вы говорите, то информация будет извлекаться из БД не по порядку от начала до конца таблицы test, а только первые 5 строк. Но, что бы осуществить постраничную разбивку, нужны данные последовательно.
Быстрый ответ:

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