分页一直显示SQL数据的相同部分

时间:2017-11-14 02:13:15

标签: php sql mysqli datatable pagination

我有一个非常大的SQL数据集,我需要分页。

我的分页代码存在问题。代码确实在网址中显示网页编号,确实会在表格底部给我分页超链接。但是,我点击的任何页面,它输出sql数据表的相同的确切部分。

另外,我在wordpress中这样做。

// define how many results you want per page
$results_per_page = 10;

// find out the number of results stored in database
$sql='SELECT * FROM ETF';
$result = mysqli_query($con, $sql);
$number_of_results = mysqli_num_rows($result);

// determine number of total pages available
$number_of_pages = ceil($number_of_results/$results_per_page);

// determine which page number visitor is currently on
if (!isset($_GET['page'])) {
  $page = 1;
} else {
  $page = $_GET['page'];
}

// determine the sql LIMIT starting number for the results on the displaying page
$this_page_first_result = ($page-1)*$results_per_page;

// retrieve selected results from database and display them on page
$sql='SELECT * FROM ETF LIMIT ' . $this_page_first_result . "," .$results_per_page;

$result = mysqli_query($con, $sql);

while($row = mysqli_fetch_array($result)) {
  echo $row['ETF'] . ' ' . $row['ETF NAME']. '<br>';
}


// display the links to the pages
for ($page=1;$page<=$number_of_pages;$page++) {
  echo '<a href="index.php/stocks/sec-forms/?page=' . $page . '">' . $page. '</a>';
}

3 个答案:

答案 0 :(得分:0)

尝试:

$sql='SELECT * FROM ETF LIMIT ' . $results_per_page . ' OFFSET ' . $this_page_first_result;

同样如上所述,您应该使用'ORDER BY'对某个列进行排序,以获得一致的结果。

答案 1 :(得分:0)

你应该改变

$sql='SELECT * FROM ETF';
$result = mysqli_query($con, $sql);
$number_of_results = mysqli_num_rows($result);

这样的事情

$count = mysqli_fetch_assoc(mysqli_query($con,"SELECT COUNT(*) AS RC FROM ETF"));
$number_of_results=$count['RC'];

因为从mysql(索引,如果它是一个大表)获取计数更快,而不是获取所有表数据(因为SELECT *...)来循环它只是为了行计数。

// retrieve selected results from database and display them on page
$sql='SELECT * FROM ETF LIMIT ' . $this_page_first_result . "," .$results_per_page;

您使用了良好的查询,但使用了错误的功能来获得结果。

查询应该是

$sql='SELECT * FROM ETF LIMIT ' . $results_per_page . "," .$this_page_first_result;

或:

$sql='SELECT * FROM ETF LIMIT ' . $results_per_page . " OFFSET " .$this_page_first_result;

这两项都有效。

更改

while($row = mysqli_fetch_array($result)) {
  echo $row['ETF'] . ' ' . $row['ETF NAME']. '<br>';
}

while($row = mysqli_fetch_assoc($result)) {
  echo $row['ETF'] . ' ' . $row['ETF NAME']. '<br>';
}

因为&#34; mysqli_fetch_array&#34;获取数组宽度编号的索引(例如0,1,2 ...)不是您尝试使用的文本索引,但是&#34; mysqli_fetch_assoc&#34;那是你需要的。

完整代码应为

<?php
$con=mysqli_connect('your server','login to database','database logins password','database name');
// define how many results you want per page
$results_per_page=10;
// find out the number of results stored in database
$count=mysqli_fetch_assoc(mysqli_query($con,"SELECT COUNT(*) AS RC FROM ETF"));
$number_of_results=$count['RC'];
// determine number of total pages available
$number_of_pages=ceil($number_of_results/$results_per_page);
// determine which page number visitor is currently on
if(!isset($_GET['page']))
{
    $page=1;
}
else
{
    $page=$_GET['page'];
}
// determine the sql LIMIT starting number (OFFSET) for the results on the displaying page
$this_page_first_result=($page-1)*$results_per_page;
// retrieve selected results from database and display them on page
$sql="SELECT * FROM ETF LIMIT $results_per_page,$this_page_first_result";
$result=mysqli_query($con, $sql);
// Loop to show results
while($row = mysqli_fetch_assoc($result))
{
    echo $row['ETF'].' '.$row['ETF NAME'].'<br>';
}
// display the links to the pages
for($page=1;$page<=$number_of_pages;$page++)
{
    echo'<a href="?page='.$page.'">'.$page.'</a> ';
}
mysqli_close($con);
    ?>

答案 2 :(得分:0)

使用OFFSETLIMIT对网页进行分页会导致两个错误 - 显示的重复行和未显示的行。

为什么?

  1. 您正在思考一个网页上的“第一个”10行。
  2. 同时,行是INSERTedDELETEd,属于前10个。
  3. 点击[Next],然后转到显示下10行的页面。但是等等,它没有显示“下一个”10行,它显示行#11-20。并且,由于第1-10行中的某些内容发生了变化,因此在您离开的地方行并没有真正继续。
  4. 我刚刚给你一个如何避免它的提示 - “记住你离开的地方”而不是使用OFFSETMore