[php] Stronicowanie/Paginacja (wyświetlanie ilości stron)

0

Witajcie,

Jak zwykle pojawił mi się problem, zanim przedstawię kod parę słów dlaczego tak, a nie inaczej. Wynalazłem sobie na jakimś forum udostępniony kawałek kodu stronicującego wyniki pobierane z bazy danych. Skrypt ten będzie miał wyciągać i dzielić na strony ponad 1k artykułów, a nie wyglądałaby ładnie wyliczanka do XXX stron....

Kod:

$limit =  5; //Liczba newsów na jednej stronie

$strona = $_GET['str']; // Pobranie numeru strony


if (!isset($strona)) {
    $limit1 = 0;
    $limit2 = $limit;
} else {
    $limit1 = $limit * $strona - $limit;
    $limit2 = $limit;
}

//Definicja zapytania
$zapytanie = "SELECT * FROM news ORDER BY id DESC LIMIT $limit1,$limit2";


if ($r = mysql_query ($zapytanie)) {

    //Odczytywanie w wyswietlenie kolejnych rekordow.
    while ($wiersz = mysql_fetch_array($r)) {

		print '<a href="artykul.php?id='.$wiersz['id'].'"><strong>'.$wiersz['tytul'].'</strong></a><br />';
         	echo $wiersz['streszczenie'];
    }

} else {
    die ('<p>Zapytanie nie zosta?o wykonane, bo <b>' . mysql_error() . "</b>. Zapytanie: $zapytanie.</p>");

}

echo "Strony: ";
list($ile)=mysql_fetch_row(mysql_db_query("glownabaza","SELECT count(*) FROM news"));

$liczba_stron = $ile / $limit;
$liczba_stron = ceil($liczba_stron);

for ($v = 1; $v <= $liczba_stron; $v++) {

    if ($liczba_stron == 1) {
    echo " $v";
    } else {
    echo "<a href=\"?str=$v\" title=\"Strona $v\">$v</a> ";
    }
}
echo "</div>";
      }

Skrypt wyświetla wyniki stronicowania w postaci:

1 2 3 4 5 6 7 8 9 10 itd

Tak jak psiałem na początku przy dużej ilości artykułów brzydko będzie wyglądała wyliczanka do setnych stron stąd pytanie w jaki sposób można przekształcić wyniki listy stron do postaci np.:

1 2 3 4 5 6 7 8 9 10 ... 100 101 102 103

Ktoś pomoże?

[edit]

<stroke>Udało się zrobić, jutro mogę wkleić kod. :)</stroke>

Jednak się nie udało, temat nadal aktualny :)

0

Prosto z kojota :-)

  /*
   * Funkcja oparta o phpBB, tworzy liste stron na podstawie parametrow
   * - $base_url - URL
   * - $num_items - liczba pozycji
   * - $per_page - ilosc pozycji na strone
   * - $start_item - pozycja poczatkowa
   * - $add_prevnext_text - czy wyswietlac etykiety nastepny, poprzedni (TODO: obsluga tegoz parametru)
   */
  function pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = true)
  {
      $seperator = ' ';

      $total_pages = ceil($num_items/$per_page); // ilość stron

      $amp = strpos($base_url, '?') !== false ? '&amp;' : '?'; // czy łączyć "?" czy "&"
      if ($total_pages == 1 || !$num_items) // ilość elementów = 1?
      {
          if ($start_item % $per_page == 0)
          {
              return '<b>1</b>'; // 1 strona bez linka
          }
          else
          {
              return ($add_prevnext_text? '<a href="'. $base_url . $amp . 'start=0">&lt;&lt;</a>' . $seperator:'') . '<b>1</b>'; // 1 strona z linkiem do poczatku (<<)- zaczeto nierówno z iloscia postow na strone (1 user ma 10/str, inny ma 15 i daje linka temu pierwszemu)
          }
      }

      $on_page = floor($start_item / $per_page) + 1; // ilosc na strone
      $page_string = ($add_prevnext_text && $on_page!=1 || $start_item % $per_page != 0) ? '<a href="'. $base_url . $amp . 'start=' . max(0,($on_page-2)*$per_page) . '">&lt;&lt;</a>'.$seperator : ''; // poczatkowy << (o ile jestesmy dalej niz na 1 stronie)

      if ($total_pages>10) // wiecej niz 10 stron
      {
          for($i = 1; $i <= 3; $i++) // poczatkowe 3 strony wyswietlane zawsze
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              $page_string .= $seperator;
          }

          $start1=max(4,floor($on_page/2)-1); // ustalenie poczatku i konca 2 czesci ( 3 ... [tutaj] ... srodek ... ... koniec)
          $end1=max(4,min($total_pages-3,floor($on_page/2)+1));

          $start2=max($end1+1,min($total_pages-6,max(4,$on_page-4))); // ustalenie poczatku i konca 3 czesci ( 3 ... ... ... [tutaj] ... ... koniec)
          $end2=max(6,min($total_pages-3,$on_page+4));

          $start3=max($end2+1,min($total_pages-3,floor($on_page+($total_pages-$on_page)/2)-2));  // ustalenie poczatku i konca 4 czesci ( 3 ... ... ...  ... ... [tutaj] ... koniec)
          $end3=min($total_pages-3,max(4,floor($on_page+($total_pages-$on_page)/2)));

          if ($start1>4)
          {
              $page_string .= '...' . $seperator; // jesli 2 czesc sie zaczyna dalej niz na 4 stronie
          }
          if ($start2>=$end1) // jesli 2 czesc w ogole istnieje
          for($i = $start1; $i <= $end1; $i++)
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              $page_string .= $seperator;
          }
          if ($start2-$end1>1) // jesli 2 czesc jest przynajmniej o 1 odlegla od nastepnej
          {
              $page_string .= '...' . $seperator;
          }
          for($i = $start2; $i <= $end2; $i++) // srodkowa czesc
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              $page_string .= $seperator;
          }

          if ($start3-$end2>1) // jesli 4 czesc jest przynajmniej o 1 odlegla od nastepnej
          {
              $page_string .= '...' . $seperator;
          }
          for($i = $start3; $i <= $end3; $i++) // 4 czesc
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              $page_string .= $seperator;
          }

          if ($end2<$total_pages-3) // jesli ostatnia czesc jest konczy sie na wiecej niz 3 strony od konca
          {
              $page_string .= '...' . $seperator;
          }

          for($i = $total_pages-2; $i <= $total_pages; $i++) // koncowe strony
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              if ($i < $total_pages)
              {
                  $page_string .= $seperator;
              }
          }
      }
      else // mniej niz 10 sttron - wyswietlamy cala liste
      {
          for($i = 1; $i <= $total_pages; $i++)
          {
              $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '">' . $i . '</a>';
              if ($i < $total_pages)
              {
                  $page_string .= $seperator;
              }
          }
      } // dodanie koncowej >>, jesli nie jestesmy na ostatniej stronie
      $page_string .= ($on_page == $total_pages || !$add_prevnext_text) ?'': $seperator.'<a href="'. $base_url . $amp . 'start='.$on_page*$per_page . '">&gt;&gt;</a>';

      return $page_string;
  }

Najlepiej potestować w temacie trochę humoru :-)

edit: Dodalem pare komentarzy, chyba zgodnych z tym co mialem na mysli dawno dawno temu :-)

0

Działanie ma świetnie, postaram się rozszyfrować i dostosować do siebie :D Dzięki :)

0

Proszę mi poradzić, a najlepiej dać przykład jak to scalić z takim kodem żeby działało:


$result = mysql_query("SELECT * FROM komunikatytech ORDER BY id_komunikat DESC") or die(mysql_error());
		  while($row = mysql_fetch_array($result)) {
 
 			echo '<b><font face="Verdana" size="2">';
 			echo $row['temat'];
 			echo '</font></b><br><font face="Verdana" size="2">';
 			echo $row['tresc'];
 			echo '</font><br><font face="Verdana" size="1" color="gray">';
 			echo "<i>Dodano: ";
 			echo $row['data_dodania'];
 			echo "</i><br><br></font>";
 
           }

Ten program jest pisany na piechotę i jak widać wyświetla newsy w takiej postaci:

Temat newsa
Treść newsa...........jakaś treść.
Data dodania

paginowanie bardzo by się przydało. Z góry wielkie dzięki za pomoc!

0

Działa ok, poza jednym przypadkiem.

Jeśli mam np. 5 podstron i kliknę w >> kilka razy to mi wybiega poza ta ilość podstron.. np. na start=2000 i mogę sobie tak klikać i klikać w nieskończoność a liczba ta będzie rosła mimo że ciągle będe miał w pasku 5 podstron. Jak kilkne wtedy w << to dzieje sie to samo... zamiast spadać to rośnie i rośnie...

0

Witam
Mam problem z wykorzystaniem tej funkcji do paginacji.

define('ILOSC_REKORDOW', 10);
$result = $db_connect->query("SELECT SQL_CALC_FOUND_ROWS *
	FROM galery ORDER BY date ASC LIMIT ".mysql_escape_string((int)$_GET['start']*ILOSC_REKORDOW).",".ILOSC_REKORDOW);
		
		{
			echo '<div id=\'galery\'>';
			while ($galery=$result->fetch_assoc())
			{
				echo '<div id=\'galery_thumb_frame\'>';
				echo '<a href=\'galery.php?id='.$galery['id'].'\'><img class=\'galery_thumb\' src=\'thumbs/'.$galery['path_file'].'\' /></a><br />';
				echo '</div>';
			}
			
			$result = $db_connect->query("SELECT FOUND_ROWS() as iloscWpisow");
			list($iloscWpisow) = mysql_fetch_row($result);
			
			pagination('galery.php', $iloscWpisow, ILOSC_REKORDOW, $_GET['start']);
			echo $page_string;
			echo '</div>';
		}

Po uruchomieniu funkcji strona nie wyświetla linków nawigacyjnych. Nie jestem pewien czy odpowiednio przekazałem argumenty do funkcji pagination.
Dodam tylko że rekordy z bazy danych porcjowane są prawidłowo i ręczna zmiana parametru w linku "galery.php?start=0" umożliwia przejście do kolejnej strony.

pozdrawiam

0

Witam jestem początkującym w temacie php. Mój problem przedstawia się następująco posiadam niewielki skrypt napisany w PHP który prezentuje.

<?php session_start();
  if (isset($_GET["order"])) $order = @$_GET["order"];
  if (isset($_GET["type"])) $ordtype = @$_GET["type"];
  if (isset($_POST["filter"])) $filter = @$_POST["filter"];
  if (isset($_POST["filter_field"])) $filterfield = @$_POST["filter_field"];
  $wholeonly = false;
  if (isset($_POST["wholeonly"])) $wholeonly = @$_POST["wholeonly"];
  if (!isset($order) && isset($_SESSION["order"])) $order = $_SESSION["order"];
  if (!isset($ordtype) && isset($_SESSION["type"])) $ordtype = $_SESSION["type"];
  if (!isset($filter) && isset($_SESSION["filter"])) $filter = $_SESSION["filter"];
  if (!isset($filterfield) && isset($_SESSION["filter_field"])) $filterfield = $_SESSION["filter_field"];
?>
<html>
<head>
<title>nazwiska</title>
<meta name="generator" http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">

</style>
</head>
<body>
<table class="bd" width="100%"><tr><td class="hr"><h2><center><font size="6">xxxxxxxxxxxxx</font></center></h2></td></tr></table>
<?php
  $conn = connect();
  $showrecs = 50;
  $pagerange = 10;
  $a = @$_GET["a"];
  $recid = @$_GET["recid"];
  $page = @$_GET["page"];
  if (!isset($page)) $page = 1;
  switch ($a) {
    case "view":
      viewrec($recid);
      break;
    default:
      select();
      break;
  }
  if (isset($order)) $_SESSION["order"] = $order;
  if (isset($ordtype)) $_SESSION["type"] = $ordtype;
  if (isset($filter)) $_SESSION["filter"] = $filter;
  if (isset($filterfield)) $_SESSION["filter_field"] = $filterfield;
  if (isset($wholeonly)) $_SESSION["wholeonly"] = $wholeonly;
  mysql_close($conn);
?>
<table class="bd" width="100%"><tr><td class="href">xxxxxxxxxxxxxxx</td></tr></table>
</body>
</html>
<?php function select()
  {
  global $a;
  global $showrecs;
  global $page;
  global $filter;
  global $filterfield;
  global $wholeonly;
  global $order;
  global $ordtype;
  if ($a == "reset") {
    $filter = "";
    $filterfield = "";
    $wholeonly = "";
    $order = "";
    $ordtype = "";
  }
  $checkstr = "";
  if ($wholeonly) $checkstr = " checked";
  if ($ordtype == "asc") { $ordtypestr = "desc"; } else { $ordtypestr = "asc"; }
  $res = sql_select();
  $count = sql_getrecordcount();
  if ($count % $showrecs != 0) {
    $pagecount = intval($count / $showrecs) + 1;
  }
  else {
    $pagecount = intval($count / $showrecs);
  }
  $startrec = $showrecs * ($page - 1);
  if ($startrec < $count) {mysql_data_seek($res, $startrec);}
  $reccount = min($showrecs * $page, $count);
?>
<table class="bd" border="0" cellspacing="1" cellpadding="4">
<tr><td>Table: nazwiskoimie</td></tr>
<tr><td>Liczba rekordów <?php echo $startrec + 1 ?> - <?php echo $reccount ?> z <?php echo $count ?></td></tr>
</table>
<hr size="1" noshade>
<form action="nazwiskoimie.php" method="post">
<table class="bd" border="0" cellspacing="1" cellpadding="4">
<tr>
<td><b>Custom Filter</b>&nbsp;</td>
<td><input type="text" name="filter" value="<?php echo $filter ?>"></td>
<td><select name="filter_field">
<option value="">Wszystkie pola</option>
<option value="<?php echo "imie" ?>"<?php if ($filterfield == "imie") { echo "selected"; } ?>><?php echo htmlspecialchars("imie") ?></option>
<option value="<?php echo "nazwisko" ?>"<?php if ($filterfield == "nazwisko") { echo "selected"; } ?>><?php echo htmlspecialchars("nazwisko") ?></option>
</select></td>
<td><input type="checkbox" name="wholeonly"<?php echo $checkstr ?>>Tylko całe słowa</td>
</td></tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="action" value="Szukaj"></td>
<td><a href="nazwiskoimie.php?a=reset">Reset</a></td>
</tr>
</table>
</form>
<hr size="1" noshade>
<?php showpagenav($page, $pagecount); ?>
<br>
<table class="tbl" border="0" cellspacing="1" cellpadding="5"width="100%">
<tr>
<td class="hr">&nbsp;</td>
<td class="hr"><a class="hr" href="nazwiskoimie.php?order=<?php echo "imie" ?>&type=<?php echo $ordtypestr ?>"><?php echo htmlspecialchars("imie") ?></a></td>
<td class="hr"><a class="hr" href="nazwiskoimie.php?order=<?php echo "nazwisko" ?>&type=<?php echo $ordtypestr ?>"><?php echo htmlspecialchars("nazwisko") ?></a></td>
</tr>
<?php
  for ($i = $startrec; $i < $reccount; $i++)
  {
    $row = mysql_fetch_assoc($res);
    $style = "dr";
    if ($i % 2 != 0) {
      $style = "sr";
    }
?>
<tr>
<td class="<?php echo $style ?>"><a href="nazwiskoimie.php?a=view&recid=<?php echo $i ?>">Więcej</a></td>
<td class="<?php echo $style ?>"><?php echo htmlspecialchars($row["imie"]) ?></td>
<td class="<?php echo $style ?>"><?php echo htmlspecialchars($row["nazwisko"]) ?></td>
</tr>
<?php
  }
  mysql_free_result($res);
?>
</table>
<br>
<?php showpagenav($page, $pagecount); ?>
<?php } ?>

<?php function showrow($row, $recid)
  {
?>
<table class="tbl" border="0" cellspacing="1" cellpadding="5"width="50%">
<tr>
<td class="hr"><?php echo htmlspecialchars("imie")."&nbsp;" ?></td>
<td class="dr"><?php echo htmlspecialchars($row["imie"]) ?></td>
</tr>
<tr>
<td class="hr"><?php echo htmlspecialchars("nazwisko")."&nbsp;" ?></td>
<td class="dr"><?php echo htmlspecialchars($row["nazwisko"]) ?></td>
</tr>
</table>
<?php } ?>
<?php function showpagenav($page, $pagecount)
{
?>
<table class="bd" border="0" cellspacing="1" cellpadding="4">
<tr>
<?php if ($page > 1) { ?>
<td><a href="nazwiskoimie.php?page=<?php echo $page - 1 ?>">&lt;&lt;&nbsp;Poprzedni</a>&nbsp;</td>
<?php } ?>
<?php
  global $pagerange;

  if ($pagecount > 1) {

  if ($pagecount % $pagerange != 0) {
    $rangecount = intval($pagecount / $pagerange) + 1;
  }
  else {
    $rangecount = intval($pagecount / $pagerange);
  }
  for ($i = 1; $i < $rangecount + 1; $i++) {
    $startpage = (($i - 1) * $pagerange) + 1;
    $count = min($i * $pagerange, $pagecount);

    if ((($page >= $startpage) && ($page <= ($i * $pagerange)))) {
      for ($j = $startpage; $j < $count + 1; $j++) {
        if ($j == $page) {
?>
<td><b><?php echo $j ?></b></td>
<?php } else { ?>
<td><a href="nazwiskoimie.php?page=<?php echo $j ?>"><?php echo $j ?></a></td>
<?php } } } else { ?>
<td><a href="nazwiskoimie.php?page=<?php echo $startpage ?>"><?php echo $startpage ."..." .$count ?></a></td>
<?php } } } ?>
<?php if ($page < $pagecount) { ?>
<td>&nbsp;<a href="nazwiskoimie.php?page=<?php echo $page + 1 ?>">Następny&nbsp;&gt;&gt;</a>&nbsp;</td>
<?php } ?>
</tr>
</table>
<?php } ?>

<?php function showrecnav($a, $recid, $count)
{
?>
<table class="bd" border="0" cellspacing="1" cellpadding="4">
<tr>
<td><a href="nazwiskoimie.php">Tabela główna</a></td>
<?php if ($recid > 0) { ?>
<td><a href="nazwiskoimie.php?a=<?php echo $a ?>&recid=<?php echo $recid - 1 ?>">Poprzedni rekord</a></td>
<?php } if ($recid < $count - 1) { ?>
<td><a href="nazwiskoimie.php?a=<?php echo $a ?>&recid=<?php echo $recid + 1 ?>">Następny rekord</a></td>
<?php } ?>
</tr>
</table>
<hr size="1" noshade>
<?php } ?>
<?php function viewrec($recid)
{
  $res = sql_select();
  $count = sql_getrecordcount();
  mysql_data_seek($res, $recid);
  $row = mysql_fetch_assoc($res);
  showrecnav("view", $recid, $count);
?>
<br>
<?php showrow($row, $recid) ?>
<?php
  mysql_free_result($res);
} ?>
<?php function connect()
{
  $conn = mysql_connect("localhost", "root", "");
  mysql_select_db("nazwiska");
  return $conn;
}
function sqlstr($val)
{
  return str_replace("'", "''", $val);
}
function sql_select()
{
  global $conn;
  global $order;
  global $ordtype;
  global $filter;
  global $filterfield;
  global $wholeonly;
  $filterstr = sqlstr($filter);
  if (!$wholeonly && isset($wholeonly) && $filterstr!='') $filterstr = "%" .$filterstr ."%";
  $sql = "SELECT `id`, `imie`, `nazwisko` FROM `nazwiskoimie`";
  if (isset($filterstr) && $filterstr!='' && isset($filterfield) && $filterfield!='') {
    $sql .= " where " .sqlstr($filterfield) ." like '" .$filterstr ."'";
  } elseif (isset($filterstr) && $filterstr!='') {
    $sql .= " where (`imie` like '" .$filterstr ."') or (`nazwisko` like '" .$filterstr ."')";
  }
  if (isset($order) && $order!='') $sql .= " order by `" .sqlstr($order) ."`";
  if (isset($ordtype) && $ordtype!='') $sql .= " " .sqlstr($ordtype);
  $res = mysql_query($sql, $conn) or die(mysql_error());
  return $res;
}
function sql_getrecordcount()
{
  global $conn;
  global $order;
  global $ordtype;
  global $filter;
  global $filterfield;
  global $wholeonly;
  $filterstr = sqlstr($filter);
  if (!$wholeonly && isset($wholeonly) && $filterstr!='') $filterstr = "%" .$filterstr ."%";
  $sql = "SELECT COUNT(*) FROM `nazwiskoimie`";
  if (isset($filterstr) && $filterstr!='' && isset($filterfield) && $filterfield!='') {
    $sql .= " where " .sqlstr($filterfield) ." like '" .$filterstr ."'";
  } elseif (isset($filterstr) && $filterstr!='') {
    $sql .= " where (`imie` like '" .$filterstr ."') or (`nazwisko` like '" .$filterstr ."')";
  }
  $res = mysql_query($sql, $conn) or die(mysql_error());
  $row = mysql_fetch_assoc($res);
  reset($row);
  return current($row);
} ?>

Problem tkwi w paginacji a dokładniej gdy w bazie było niewiele rekordów paginacja sprawdzała się natomiast gdy baza zaczęła mieścić co raz więcej rekordów pojawił się problem gdyż paginacja kolejnych stron zaczęła się rozrastać
Próbowałem kombinować ze zmianami lecz to nic nie dało. Chciałbym by paginacja wyglądała np 1 2 3 > >> tak jak to jest na forum
Jeśli jest ktoś może mi pomóc w rozwiązaniu tego problemu będę wdzięczny o podpowiedz

0

Może to Ci się przyda.

http://arekw.net/index.php?show=readmore&id=66

Dosyć ciekawa funkcja odnaleziona na stronie pewnego programisty.
Jest jeszcze inna funkcja lecz moim zdaniem bardziej skomplikowana w użyciu:

http://athlan.pl/tag/paginacja/

Obydwie jednak są bardzo fajne w działaniu ;)

0

13-01-2008 22:23

#576630
To może popatrz na datę ostatniej wypowiedzi autora tematu? Bo jak na moje to coś koło roku się nie wypowiadał...

0

15-09-2009 14:02

Ja się zawsze patrzę na datę OSTATNIEGO postu, a nie pierwszego ;-)

0

Mam teraz mały problem z tą klasą. Dzieli wiadomości na strony, są linki, ale te linki nie działają. Zrobiłem przyjazne linki i mam np tak www.example.pl/dzial/poddzial?1 <--- jak ja mam to zrobić, żeby działało? Czy muszę pozmieniać jakoś przyjazne linki, bo widzę, że tu na forum to działa jest na końcu linka np ?start=70 etc i śmiga. Jaki sposobem mogę zrobić podobną rzecz u siebie ?

Jak zmienić taki np link: żeby działał?
http://127.0.0.1/travel/kultura/galerie/sztuki?page=3

Do tego mam to:

RewriteRule ^kultura/([a-z]+)/([a-z]+)/([a-z]+)/([0-9]+)/?$ kultura.php?a=$1&strona=$2&p=$3&page=$4 [L]

1 użytkowników online, w tym zalogowanych: 0, gości: 1