我认为你在这里遗漏了一些关键部分。首先,当我们使用无限滚动并从数据库中获取数据时,您需要一个LIMIT
子句,LIMIT 子句允许建立offset, total
关系。其中 offset 表示要从哪一行开始,total 是我们想要取的行数。
最初,你会有这样的东西
$offset = $_GET['offset'] ? $_GET['offset'] : 0; //start at 0th row if no variable set
$total = $_GET['total'] ? $_GET['total'] : 20; // get 20 rows if no variable set
在上面,我们使用三元变量赋值来检查参数是否被传递给我们,如果没有,那么我们使用默认值。我们将使用mysqli 和prepared、bind_param、execute、bind_result 和fetch_assoc() 方法。
if( $getStream = $mysqli->prepare("SELECT * FROM ? WHERE xxx=? AND status=? ORDER by id LIMIT ?,?"):
$ret = ''; // a variable place holder
// in the above statement, fill in the ?'s
// the actual ? will be the value we wish to return, in order from first to last.
$getStream->bind_param('ssddd', $DBprefix.'xxx', 'xxx', 1, $offset, $total);
//execute our query
$getStream->execute();
$getStream->bind_result($field1, $field2, $field3, $field4); // each field needs it's own variable name, that way we can access them later.
while($row = $getStream->fetch_assoc()):
$ret .= '<div class="my-infinite-element"><h3>'. $field1 .'</h3><p>'. $field2.'</p>'. $field3 .', '. $field4 .'</div>';
endwhile;
echo $ret;
else:
return FALSE;
endif;
现在这就是我们使用 MySQLI 处理获取数据的方式;现在让我们编写 ajax 语句来取回数据。
$.ajax({
type: 'GET',
url : 'infinity.php',
data: {
'offset' : $('.my-infinite-elements').length,
'total' : 20
},
success: function(data){
if(false !== data){
$('#stream').append(data);
}
}
});
在上面,我们唯一应该担心的是$('.my-infinite-elements').length
。my-infinite-elements
我们为返回的每个元素使用了一个类。这样,我们可以计算页面上元素的现有长度,这将提供我们的offset
值(或者我们想要从哪里开始获取行)。如果我们从数据库中提取 20 个结果,它是基于 0 的,所以我们会得到 0-19。当我们这样做时.length
,我们将得到一个1 based
结果,它将返回20
,而不是 19。没关系,因为我们不希望最后一行也返回,所以我们的逻辑很好。我们的 ajax 函数中的两个变量offset/total
,对应于我们的三元变量赋值。