ページにアクセスする事にランダムに読み込んだデータの「もっと見る」ボタン。
なんだかよくわからないタイトルになってしまいましたが、つまりはこういうこと。
ページにアクセスするたびに、ランダムにデータを読み込む。
▼
読み込んだデータは、10件づつ「もっと見る」ボタンで読み込みたい。
「もっと読む」ボタンを押すごとに、SQL投げてデータベースからデータを取得するわけですが、毎回ランダムにデータを取得しなおすと重複しちゃう。
やりたいのは「ランダムに取り出しはするけど、もっと見るボタンを押した時の挙動は、前回読み込んだデータの続きを取得したい」ということなわけです。
まずは、読み込み側のHTMLにこんなJavaScriptを。
var start = 9;
var num = Math.floor( Math.random() * 100 );
function loadMore() {
$("a#loading").html("<img src='../images/loadingnow.gif'>");
$.post('items.php', { start : start, num : num },
function(res){
$("a#loading").html("もっと見る");
$("#items").append(res);
});
start += 9;
}
jQueryのpost()を使って、items.phpの結果をDOMに追加してます。
この時、items.phpに「start」と「num」ってパラメータをpostしてます。
このpostデータをどう使うかは、items.phpで。
/*全部のカウント数を取得*/
$count_data = $DB->SQL("SELECT count(*) FROM items;");
$all_count = $count_data[0]["count(*)"];
//ランダムに取得してくる場合
$items = $DB->SQL("SELECT * FROM items ORDER BY RAND(" . $_POST['num'] . ") limit " . $_POST['start'] . ", 9;");
//新着順に取得してくる場合
//$items = $DB->SQL("SELECT * FROM items ORDER BY item_id DESC limit " . $_POST['start'] . ", 9;");
//================出力ループ==================
//3つづつ並べるので、カウンターを定義
$count = 0;
foreach ($items as $val){
if ( $count == 0 ){$dat = "a";}
if ( $count == 1 ){$dat = "b";}
if ( $count == 2 ){$dat = "c";}
print <<< EOF
<div class="ui-block-{$dat}">
<a href="****.html" data-ajax="false">
<img src="/thumb/{$val['thumb_img']}">
</a>
<p class="thumb_text">{$val['item_name']}</p>
</div>\n
EOF;
$count++;
//3つ並べたらカウンターを元に戻す
if ($count > 2){$count= 0;}
}
/*もし、全カウントから読み込みスタート位置を引いた数が
9以下なら、ボタンを消す処理
*/
if ( $all_count - $_POST['start'] < 9 ){
echo "<script>$(\"a#loading\").hide();</script>";
}
とりあえず「items.php」は上記のようになってます。
jQueryMobileの3カラムレイアウトを使ってるので、3つづつ並べて出力しているのはいいとして…問題はランダムに取得する方法です。
そんな大したことをしているわけではなく、ORDER BY RAND() でランダムにソートして LIMIT 句で取得したい件数だけを取得しているわけですが…。
SELECT * FROM items ORDER BY RAND(" . $_POST['num'] . ") limit " . $_POST['start'] . ", 9;「ORDER BY RAND()」は、RANDの括弧の中に何も入れないとクエリ実行の度にランダムにデータを取得します。
なので、
・ページを読み込んだタイミングでランダムな数字を生成(JavaScriptで)
▼
・post()でPHPにデータを渡す
▼
・ORDER BY RAND()の括弧の中にそいつを入れる
▼
・SQL実行の度(もっと見るボタンを押すごと)に、ランダムにソートした結果の「続き」が取得できる
ということになります。