ここでいくつかの重要な部分が欠けていると思います。まず、無限スクロールを使用してデータベースからデータを取得する場合、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
上記では、3 項変数の割り当てを使用して、引数が渡されているかどうかを確認しています。渡されていない場合は、デフォルト値を使用します。mysqli と、準備済みの 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
値 (または行の取得を開始する場所) が提供されます。DB から 20 個の結果を取り出した場合、それは 0 ベースなので、0 ~ 19 になります。を実行.length
すると、1 based
結果が返さ20
れ、19 ではなく が返されます。これで問題ありません。最後の行も返されたくないので、ロジックは問題ありません。ajax 関数の 2 つの変数offset/total
は、3 項変数の割り当てに対応しています。