[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбиение результатов поиска на страницы
alex666
Здравствуйте! Это снова я unsure.gif
Вот собственно задача: при выводе результатов поиска, если нашлось много записей, мне нужно разбивать его на страницы - по 50 записей на каждую (как в яндексе, гугле и т.д.). Как это сделать - я придумал сам:

PHP
$result "SELECT очень очено длинный запрос...";
$num_rows mysql_num_rows($result); // получили общее кол-во записей
// НАЧАЛО вывода и формирования страниц (1,2,3,4.. и т.д.)
$j $num_rows 50;
if(
ereg('\.'$j)) {
        
$k explode('.'$j);
        
$pages $k[0] + 1;
}
else {
        
$pages $j;
}
for(
$x 1$x <= $pages$x++) {
        if(
$x == $_GET['offset'] || (!isset($_GET['offset']) && $x == 1)) {
                echo 
"$x&nbsp;"// нажатая страница - ссылкой не делаем
        
}
        else {
                echo 
"<a href='page=$x'>$x</a>"// мы не на этой странице - значит ссылка
        
}
}
if(
$offset == 1) {
               
$brk 0;
}
else {
               
$brk = ($offset 1) * 50;
}
// // КОНЕЦ вывода и формирования страниц (1,2,3,4.. и т.д.)
$result "SELECT очень очено длинный запрос...  LIMIT $brk, 50";
// далее выводим страницы с 1-50


Проблема: двойной запрос, абсолютно одинаковый и вызывается 2 раза. 1-й раз просто для того чтоб подсчитать общее число найденых совпадений, а 2-й раз - чтобы вывести N-ные 50 записей (в зависимости от того какую циферку страницы нажали.). Получается что при каждом нажатии ПОИСК, он будет выполняться 2 раза. Есть мнения?



Спустя 26 минут, 31 секунда (11.02.2009 - 17:11) sergeiss написал(а):
Во-первых,
PHP
$num_rows = mysql_num_rows($result); // получили общее кол-во записей
неверно, т.к. ты сначала должен выполнить запрос, и потом подсчитать количество записей
PHP
$query=mysql_query( $result );
$num_rows= mysql_num_rows($num_rows);

Во-вторых, кто тебе мешает в первом запросе запросить не данные, а только количество? smile.gif

SQL
SELECT count(*) as c FROM your_table WHERE <условие, которое будет использовано потом>


Третий вариант.
Если у тебя запрос действительно очень сложный, и просто так подсчитать количество строк сложно, то кто мешает после вызова данных определения количества страниц выводить данные начиная с нужной записи, и в нужном количестве?
PHP
while( ($row=mysql_fetch_row$query ) ) )
{
  if( 
условиечто строку надо пропустить  ) continue;
   
// а тут работаем с данными, если они выводятся
}

Спустя 8 минут, 9 секунд (11.02.2009 - 17:19) alex666 написал(а):
Цитата (sergeiss @ 11.02.2009 - 14:11)
Если у тебя запрос действительно очень сложный, и просто так подсчитать количество строк сложно

Так оно и есть. Вот как у меня это выглядет:
PHP
$result = $db->QueryResult("SELECT t1.mark_id, t1.mark_name, t2.model_id, t2.model_name, t3.car_id, t3.car_year, t3.car_mileage, t3.car_state, t3.car_engine_volume, t3.car_body, t3.car_color, t3.car_kpp, t4.user_city, t3.car_price  FROM " .MARKS_TABLE. " AS t1, " .MODELS_TABLE. " AS t2, " .CARS_TABLE. " AS t3, " .USERS_TABLE. " AS t4, " .EQUIPMENTS_TABLE. " AS t5 WHERE $where ORDER BY t3.add_time DESC");
$num = mysql_num_rows($result);
while(
$row = $db->FetchResult($result)) {
    // ...здесь выводим...
}


$num (общее кол-во) я-то подсчитал. Но он получает значение уже ПОСЛЕ того, как надо бы было к этому длинному запросу подставить в конце "LIMIT x,y"
sad.gif

Спустя 17 минут, 23 секунды (11.02.2009 - 17:37) sergeiss написал(а):
Так я уже написал: и не ставь никакой лимит!!! Просто в цикле вывода данных "тупо" пропусти те строки, которые тебе не нужны:
PHP
while($row $db->FetchResult($result)) 
{
  if( 
условиечто надо пропустить) continue;

    
// ...здесь выводим то, что надо вывести
}

В любом случае это будет лучше, чем заново делать запрос. Ведь ты же его уже сделал, пусть и не в оптимальном варианте.

Спустя 11 минут, 35 секунд (11.02.2009 - 17:48) alex666 написал(а):
Цитата (sergeiss @ 11.02.2009 - 14:37)
Так я уже написал: и не ставь никакой лимит!!! Просто в цикле вывода данных "тупо" пропусти те строки, которые тебе не нужны

Извини, но я не совсем понял, что значит "строки, которые тебе не нужны"
Не это ли ты имеешь ввиду:
PHP
$i = 0; // счётчик записей
while(полный_запрос_без_лимитов) {
    $i++;
    if($page_index == 1 || !isset($page_index)) { // если страницу не нажимали - первоначальные 50 записей
        выводим запись;
        if($i == 50) break; // покидаем цикл
    }
    else { // нажали на какую-то страницу
        if($page_index == 2) { // выводим записи с 51-100
            if($i > 50 && $i 100) выводим
            elseif
($i == 100) break;
        }
    }
}

Спустя 28 минут, 59 секунд (11.02.2009 - 18:17) sergeiss написал(а):
Под этими словами я имел ввиду следующее.
Предположим, ты определил, что тебе нужно записи с 51-й по 100. Делать новый запрос ты не хочешь.
Тогда делаешь
PHP
$loop=0;
$ind_first=51;
$ind_last=100;
while(
$row = $db->FetchResult($result)) 
{
  $loop++;
  if( $loop < $ind_first ) continue;
  if( 
 or $loop > $ind_last ) break;

    // ...здесь выводим то, что надо вывести
}

break прерывает цикл, в то время как continue переходит на его начало.

Спустя 18 часов, 1 минута, 52 секунды (12.02.2009 - 12:19) alex666 написал(а):
Ну значит я тебя правильно понял, судя по последнему примеру.
В очередной раз спасибо, sergeiss!
Быстрый ответ:

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