【问题标题】:php pagination : page 2 shows same page 1 rows if new data addedphp分页:如果添加了新数据,第2页显示相同的第1行
【发布时间】:2018-09-05 08:18:52
【问题描述】:

如果有人试图打开下一页,我正在尝试让我自己的分页系统忽略新数据:

示例:

我有这张桌子:

1. apple
2. orange 
3. banana
4. burger
5. pizza 
6. spaghetti

而且我每页只显示 3 行。

mysql查询:

// $page = 0 for first page
$sql = "SELECT * FROM mytable ORDER BY id DESC LIMIT $page, 3";

结果是这样的

第 1 页:

6. spaghetti
5. pizza
4. burger

第 2 页:

3. banana
2. orange
1. apple

假设我现在在第 1 页,其他人添加了 3 行:

water
juice
coffee

现在会发生什么,如果我转到第 2 页,我会得到一个重复的页面!

现在第 2 页将是:

6. spaghetti
5. pizza
4. burger

这是因为第 1 页显示的是新数据:

 9. water
 8. juice
 7. coffee

如果用户没有刷新第一页而只想查看第二页,我该如何阻止这种情况发生?

这是一个问题,特别是如果你想让你的分页看起来像 twitter!

【问题讨论】:

  • 我只是希望有人告诉我这样做的逻辑或纠正我,如果我做错了
  • 偏移和限制将帮助您成功,我认为这将帮助您清晰像素stackoverflow.com/questions/3799193/…
  • 对数据进行升序排序。它可能会帮助您解决问题。
  • 所以您只想在现有分页正在进行时忽略新数据?
  • 是的,否则如果我有活动用户每 1 秒插入一次数据。然后我转到第2页,它会一样,第1页将被推到第2页。

标签: php mysql caching pagination


【解决方案1】:
// find out how many rows are in the table 
$sql = "SELECT COUNT(*) FROM mytable";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);
$r = mysql_fetch_row($result);
$numrows = $r[0];

// number of rows to show per page
$rowsperpage = 10;
// find out total pages
$totalpages = ceil($numrows / $rowsperpage);

// get the current page or set a default
if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) {
   // cast var as int
   $currentpage = (int) $_GET['currentpage'];
} else {
   // default page num
   $currentpage = 1;
} // end if

// if current page is greater than total pages...
if ($currentpage > $totalpages) {
   // set current page to last page
   $currentpage = $totalpages;
} // end if
// if current page is less than first page...
if ($currentpage < 1) {
   // set current page to first page
   $currentpage = 1;
} // end if

// the offset of the list, based on current page 
$offset = ($currentpage - 1) * $rowsperpage;

// get the info from the db 
$sql = "SELECT * FROM mytable ORDER BY id DESC LIMIT $offset, $rowsperpage";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);

// while there are rows to be fetched...
while ($list = mysql_fetch_assoc($result)) {
   // echo data
   echo $list['id'] . " : " . $list['number'] . "<br />";
} // end while

/******  build the pagination links ******/
// range of num links to show
$range = 3;

// if not on page 1, don't show back links
if ($currentpage > 1) {
   // show << link to go back to page 1
   echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1'><<</a> ";
   // get previous page num
   $prevpage = $currentpage - 1;
   // show < link to go back to 1 page
   echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$prevpage'><</a> ";
} // end if 

// loop to show links to range of pages around current page
for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) {
   // if it's a valid page number...
   if (($x > 0) && ($x <= $totalpages)) {
      // if we're on current page...
      if ($x == $currentpage) {
         // 'highlight' it but don't make a link
         echo " [<b>$x</b>] ";
      // if not current page...
      } else {
         // make it a link
         echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a> ";
      } // end else
   } // end if 
} // end for

// if not on last page, show forward and last page links        
if ($currentpage != $totalpages) {
   // get next page
   $nextpage = $currentpage + 1;
    // echo forward link for next page 
   echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$nextpage'>></a> ";
   // echo forward link for lastpage
   echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$totalpages'>>></a> ";
} // end if
/****** end build pagination links ******/
?>

【讨论】:

  • 我就是这样做的,但是如果添加了新行并且第 2 页将与第 1 页一样,仍然会更新,请再次阅读我的示例,谢谢兄弟
  • 每次您都会按 id desc 选择数据顺序,这就是解决方案。你会得到降序并显示 desc order id 就足够了......
  • 其他用户插入数据时,第1页的结果会被推送到第2页。我希望这仅在用户刷新页面 1 时发生。如果他没有,他可以在没有看到推送的行的情况下转到第 2 页。
【解决方案2】:

您可以使用类似的方法为您的表格项目获得正确的分页。可以去掉 ORDER BY & DESC 来了解sql查询结果的变化。

$page; // $page is current page
$result = 3; // As you need 3 results per page.
$offset = ($page * $result) - $result;

$sql = "SELECT * FROM mytable ORDER BY id DESC LIMIT $result OFFSET $offset";

【讨论】:

  • 兄弟,我都知道!,我在说什么,如果我在第 1 页并且没有刷新它,那么有人添加了 3 个新行,我去的时候会发生什么到第 2 页,我将看到前一行而不是下一行,因为添加了新数据并成为第 1 页
  • 我想我需要 SESSION 或缓存才能做到这一点,感谢您的尝试
  • 其他用户插入数据时,第1页的结果会被推送到第2页。我希望这仅在用户刷新页面 1 时发生。如果他没有,他可以在没有看到推送的行的情况下转到第 2 页。
【解决方案3】:

我必须使用 session 让它按我想要的方式工作,这就是我解决它的方法:

$count = $PDO->query("SELECT id FROM mytable")->rowCount(); //count rows
if(!isset($_SESSION['rowCount']))
{
 $_SESSION['rowCount'] = $count; // save row counts 
}

if(isset($_GET['page']))
{
   $offset = ($_GET['page'] -1) * 3 + $count - $_SESSION['rowCount'];
}
else
  $offset = 0;
  $sql = $PDO->prepare("SELECT * FROM mytable ORDER BY id DESC LIMIT $offset, 3");
  $sql->execute();

当用户返回第 1 页时,我也取消了会话。

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 2014-02-16
    • 2019-09-08
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多