页面导航。通过单击下一步获取下一个,让我们说“20”条记录(php/mysql)

问题描述 投票:0回答:5

我已经创建了一个对 mysql 的查询,它将从 mysql 表等中给出 20 个结果。“cat” 这就是召唤:

if(isset($_GET['cat']))
{
    $query = "SELECT game_title,game_desc,.... 
       FROM games WHERE cat_id='".validate_input($_GET['cat'])."' LIMIT 20";
}
...

这样我就得到了我想要的结果。我在这里问的是如何创建一个“按钮”来加载表“cat”中的下一个“20”记录(类似于按钮)。

php sql pagination navigation
5个回答
1
投票
<?
 $cn=mysql_connect("localhost","root","root") or die(mysql_error());
 mysql_select_db("db56") or die(mysql_error());

 $sql="select count(*) from emp";
 $result=mysql_query($sql);
 $r=mysql_fetch_row($result);

 $record=$r[0];
 $pagesize=20;
 $totalpages=$record/$pagesize;

 $currpage=$_GET["pg"];

 if(!isset($currpage)) 
      $start=0;
 else {
    $currpage--;
     $start= $currpage * $pagesize;
      }

 $end=$start+$pagesize;
 $sql="select * from emp limit $start,$pagesize";

 $result=mysql_query($sql);
 if($result){
    print "<table border='1'>";
    print "<tr><th>No</th><th>Name</th><th>Date</th></tr>";
    while($r=mysql_fetch_row($result))
      {
         print "<tr><td>$r[0]</td><td>$r[1]</td><td>$r[2]</td></tr>";
          }
    print "</table>";
 }   
 for($i=1;$i<=$totalpages;$i++){
       print "<a href='listemp.php?pg=$i'>&nbsp;$i&nbsp;</a>";
  }
?>

0
投票

如果您在 URL 或隐藏字段或会话变量中跟踪您所在的页面,则可以使用它来计算限制。 例如,第 2 页应显示第 20 行的限制 20(页面偏移量的 20 倍)。


0
投票

您可以将两个 SQL 参数传递给 LIMIT(在它们之间放置逗号)如果这样做,第一个参数告诉 SQL 要跳过多少条记录(即第一条记录的偏移量),第二个参数是您已经使用的参数(返回多少条记录)。

因此,只需在“下一个”链接中放置一个变量来说明要显示的页面。您可以在此链接中传递偏移量,但通常传递“页码”,并在将其粘贴到 sql 中之前乘以每页的记录数。

<a href="show_rows.php?page=<?php echo int($_REQUEST['page']) + 1; ?>">next page</a>

通过更多的工作,您可以创建一个“上一页”链接,并在您位于第一页/最后一页时使正确的链接不可点击。


0
投票

传递一个参数,告诉脚本您想要另一块结果,而不仅仅是第一批。

所以链接可能是这样的:

example.com/results.php?cat=1&page=2

Where

page=
将告诉脚本您要返回哪个页面。

然后你想转动你拥有的

LIMIT
数字,这样你就可以计算出一些简单的数学

$results_cnt = 20; //--rows you want per page of results

现在在您的脚本中,您将检查

page
变量是否已设置。如果没有,则默认从第一行返回起始行。但是,当您想要返回不同的页面/结果集时,需要进行一些数学运算才能从正确的行开始。

if(isset($_GET["page"]) //--see if the variable is even there
{
    $page_num = (int)$_GET["page"]; //--forcing it to always be an integer

    $start_row = $results_cnt * ($page_num - 1);

    /* --
     what happens:
       ($results_cnt currently at 20)

     on page one (page=1), start at row 0
      math: 20 * (1 - 1) = 0

     on page two (page=2), start at row 20
      math: 20 * (2 - 1) = 20

     on page three (page=3), start at row 40
      math: 20 * (3 - 1) = 40

     etc.
    */
}
else
    $start_row = 0;

现在,设置正确的起始行后,调整 SQL 查询以使用变量,如下所示:

if(isset($_GET['cat']))
{
    $query = "SELECT game_title,game_desc,.... 
       FROM games 
       WHERE cat_id='".validate_input($_GET['cat'])."' 
       LIMIT $start_row, $results_cnt";
}

0
投票

好吧,我想我已经修好了......

index.php

<?php

$games = array();
$count = 1;
$total = 0;

if(isset($_GET['cat']))
{
 $query = "SELECT game_title,game_desc,....  FROM games WHERE cat_id='".validate_input($_GET['cat'])."' LIMIT 20";

 $total = mysql_num_rows(mysql_query("SELECT 1 FROM games WHERE cat_id='".validate_input($_GET['cat'])."'"));
}

$query_result = @mysql_query ($query) OR error(mysql_error(), __LINE__, __FILE__, 0, '', '');
while ($info = @mysql_fetch_array($query_result))
{
/* -- here goes the infos.. */
 $games[$info['game_title']]['game_title'] = $info['game_title'];
etc..

if(isset($_GET['cat']))
{
/* -- for template engine */
$page->SetLoop ('PAGES', pagenav($total,$_GET['page'],20,$config['site_url'].'?cat='.$_GET['cat'],1,$lang));
}
--end php

and in funct.php

--start php

function pagenav($total,$page,$perpage,$url,$posts=0) 
{
 $page_arr = array();
 $arr_count = 0;

 if($posts) 
 {
  $symb='&';
 }
 else
 {
  $symb='?';
 }
 $total_pages = ceil($total/$perpage);
 $llimit = 1;
 $rlimit = $total_pages;
 $window = 5;
 $html = '';
 if ($page<1 || !$page) 
 {
  $page=1;
 }

 if(($page - floor($window/5)) <= 0)
 {
  $llimit = 1;
  if($window > $total_pages)
  {
   $rlimit = $total_pages;
  }
  else
  {
   $rlimit = $window;
  }
 }
 else
 {
  if(($page + floor($window/2)) > $total_pages) 
  {
   if ($total_pages - $window < 0)
   {
    $llimit = 1;
   }
   else
   {
    $llimit = $total_pages - $window + 1;
   }
   $rlimit = $total_pages;
  }
  else
  {
   $llimit = $page - floor($window/2);
   $rlimit = $page + floor($window/2);
  }
 }
 if ($page>1)
 {
  $page_arr[$arr_count]['title'] = 'Prev';
  $page_arr[$arr_count]['link'] = $url.$symb.'page='.($page-1);
  $page_arr[$arr_count]['current'] = 0;

  $arr_count++;
 }

 for ($x=$llimit;$x <= $rlimit;$x++) 
 {
  if ($x <> $page) 
  {
   $page_arr[$arr_count]['title'] = $x;
   $page_arr[$arr_count]['link'] = $url.$symb.'page='.($x);
   $page_arr[$arr_count]['current'] = 0;
  } 
  else 
  {
   $page_arr[$arr_count]['title'] = $x;
   $page_arr[$arr_count]['link'] = $url.$symb.'page='.($x);
   $page_arr[$arr_count]['current'] = 1;
  }

  $arr_count++;
 }

 if($page < $total_pages)
 {
  $page_arr[$arr_count]['title'] = 'Next';
  $page_arr[$arr_count]['link'] = $url.$symb.'page='.($page+1);
  $page_arr[$arr_count]['current'] = 0;

  $arr_count++;
 }

 return $page_arr;
}

?>

并通过

调用它
{LOOP: PAGES}<a href="{PAGES.link}">{PAGES.title}</a> {/LOOP: PAGES}

.html
文件中.. 它工作得很好,但是当我按数字 2 或 next 来获取接下来的 20 条记录时,它会跳回前 20 条...... 在浏览器上显示为
http://siteurl/?cat=1&page=2
我不明白为什么。

© www.soinside.com 2019 - 2024. All rights reserved.