Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porcjowanie wyników - problem
Forum PHP.pl > Forum > PHP
jureczek
Witam!

Mam problem z porcjowaniem wyników zapytania na "zasadzie Google" - czyli
przez 1,2,3 itp. Nigdzie nie znalazłem żadnej porady na ten temat,
szczególnie jeśli chodzi o porcjowanie z użyciem MySQL. W moim skrypcie
zlepilem pare znalezionych przykladów i... wyszlo, ale jednak nie do konca.
Oto fragmenty mojej rzezby...

<?php
if(($s=="") && ($e=="")){
$s="0";
$e="10";
}
// to oczywiscie argumenty do LIMIT w MySQL...

// dalej zabawa z zapytaniami w MySQL, wlacznie z wyliczeniem liczby
rekordow = $ile

// no i wlasciwa czesc skryptu...:

if($ile > $s){
$s=$s+10;
$ile_row=$ile/10;
$ile_row=floor($ile_row);
$azdo=$ile_row;
for ($aa=0;$aa<=$azdo;$aa++){
$razy_row = $aa*10;
$razy_row1 = $aa;
$aa1=$aa+1;
echo "<a href="costam.php">[$aa1]</a>"; }
}
?>

Gdzie problem? Wszystko jest OK, w momencie gdy przy wyliczaniu ilosci
"podzielnikow" wychodzi okragla liczba. Zgodnie ze skryptem, nastepuje
inkrementacja tej wartosci i stworzenie kolejnego podzielnika z linkiem,
gdzie de facto nic nie ma! Probowalem uciec od tego na wiele sposobow -
wszytkie okazaly sie zawodne - tzn. problem moze i znikal, ale wzamian
pojawial sie nastepny (np. skrypt nie widzial ostatniej czesci wynikow
zapytania). Co zrobic?
I druga sprawa: w jaki sposob wyswietlac tylko okreslona liczbe
"podzielnikow" - tzn. np po 5: <1 | 2 | 3 | 4 | 5> i w wypadku wyzszych <4 |
5 | 6 | 7 | 8>

Z góry dzięki za KAŻDĄ pomoc.

Pozdrawiam
Jurek
Sir Blade
taki sam przyklad jest na tej podstronie:

http://www.bastek.tvs.pl/porady_show.php3?...?show=porada_31
jureczek
Jak ten, jak nie ten? Tamten nie uwzglednie porcjowania "google" tylko najbardziej prymitywny podzial sad.gif Autor obiecal sie tym zajac ale na obietnicach sie skonczylo a moje proby jak widac zawiodly... Tak wiec jeszcze raz - pomocy!
zyxwvu
Oto masz gotowy [napisany przeze mnie] skrypt, który służy do tego celu. Zapewniam, że ZAWSZE działa, przy czym, jak linków jest za dużo, wyświetla tylko końcowy, początkowy, oraz linki wokół tego, który jest aktualnie wyświetlany.

Kod
function x($link, $num, $page){

  if(strpos($link, "?") == 0){

    return " <a href="".$link."?from=".$num."">".$page."</a> ";

  }else{

    return " <a href="".$link."&from=".$num."">".$page."</a> ";

  }

}



function GetPagesCount($options, $per_page){

  $mod = $options % $per_page;

  $a   = $options - $mod;



  $b   = $a / $per_page;



  if($mod > 0){

    $c = 1;

  }else{

    $c = 0;

  }



  return $b + $c;

}



function StartLastPage($options, $per_page){

  $mod = $options % $per_page;

  $a   = $options - $mod;



  $b   = $a / $per_page;



  if($mod > 0){

    return $a + 1;

  }else{

    return $a - ($per_page-1);

  }

}



function MakePages($options, $per_page, $active, $link){



  $mod = $options % $per_page;

  $a   = $options - $mod;

  

  $b   = $a / $per_page;

  



  if($mod > 0){

    $c = 1;

  }else{

    $c = 0;

  }

  

  $rt[0]  = $b + $c;

  

  if($b+$c > 5){

    $b = $b-1;

    $links = x($link, 1, 1);

    if($active > 3){

      $links .= "... ";

      $links .= x($link, $per_page*($active-1), $active-1);

      $links .= x($link, $per_page*$active, $active);

      if($active < $b + $c){

        $links .= x($link, $per_page*(1+$active), $active+1);

      }

    }else{

      $links .= x($link, $per_page, 2);

      $links .= x($link, $per_page*2, 3);

      $links .= x($link, $per_page*3, 4);

    }

    if($active < $b + $c-1){

      $links .= "... ";

      $links .= x($link, $per_page * ($b + $c), $b + $c);

    }

  }else{

    for($i = 1; $i <= $b+$c; $i++){

      $link_num = $per_page*($i-1);

      if($i == 1){

        $link_num++;

      }else{

        $link_num++;

      }

      $links .= x($link, $link_num, $i);

    }

  }

  

  $rt[1] = $links;

  return $rt;

}


Funkcja X jest wewnętrzną funkcją, lecz umieściłem ją na zewnątrz, bo w przeciwnym wypadku, gdy 2 razy wywołałeś tę funkcję, to wywalało błąd.

Pozostałe funkcje:
GetPagesCount - wylicza, ile jest stron wyników. Jako pierwszy parametr podajesz ilość wyników, a jako drugi ilość wyników na stronę.
StartLastPage - Podaje numer pierwszego wyniku na ostatniej stronie. Parametry te same.
MakePages - Przygotowuje listę stron wyników. Jako parametry pobiera kolejno: options - Ilość wyników; per_page - ilość wyników na stronę; active - nie pamiętam dokładnie, ale najprawdopodobniej oznacza to aktualna stronę. Jeśli nie, to pierwszy wynik na danej stronie; link - Wygląd linka, do którego ma prowadzić każda strona. Jeśli np podamy "index.php?action=show", to zostanie do niego dołączony parametr from=numer_pozycji_od_ktorego_ma_zaczac_wyswietlac_aktualna_strone.
I jeszcze: jak określić, od którego wyniku do którego ma wyświetlać wyniki (to wstawiamy do skryptu, który ma wyświetlić wyniki):
Kod
    $cnt = count($tablica_wynikow);

    $buf = $cnt;

    

    if(!isset($from)){

      $from = 1;

    }

    

    if($cnt > $tpp){

      $limit = $cnt - $from;

      if($limit > $tpp){

        $limit = $tpp;

      }elseif($limit < $tpp){

         $limit++;

      }

    }else{

      $limit = $cnt;

    }

  /* A potem wywołanie pętli FOR wyświetlającej wyniki, jeśli pierwszy element tabeli wyników ma indeks 1: */

    if($cnt > 0){

      // Gdy są jakieś wyniki

      for($i = $from; $i <= $from+$limit-1; $i++){

   // Kod wyświetlający wyniki

     }

   }else{

  // Gdy nie ma wyników

   }

  

Mam nadzieję, że to powinno pomóc.
Palli
JEzeli nadal problem aktualny to zajrzyj na http://php.pd.pl/index.php?dir=8&engine=16...&artykuly_id=32 oraz http://php.pd.pl/index.php?dir=8&engine=16...&artykuly_id=63

Pozdro
Seth
Ja swego czasu napisalem cos takiego:

Kod
function page_index(){

global $HTTP_GET_VARS;

$show = 10; // ile ma pokazywac



$result = mysql_query( "SELECT * FROM jakas_tabela");

$number = mysql_num_rows($result);



$page_num = ceil($number/$show);



$page = (ceil($HTTP_GET_VARS['offset']/$show)+1);  

$index = "<b>".$page."</b>";



for($i = 1; $i <= $page_num; $i++){

  if( $page != $i ){

   $j = ($i- 1) * $show;

   $tmp .= "<a href="?offset=$j">$i</a> ";

  }

}



if( $page_num != 1 ) $index .= " [ $tmp ]";



return $index; // tutaj funkcja zwraca indexy stron

}
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.