ページにアクセスする事にランダムに読み込んだデータの「もっと見る」ボタン。 | φ(..)メモとして残しておこう…

ページにアクセスする事にランダムに読み込んだデータの「もっと見る」ボタン。


なんだかよくわからないタイトルになってしまいましたが、つまりはこういうこと。

ページにアクセスするたびに、ランダムにデータを読み込む。
   ▼
読み込んだデータは、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実行の度(もっと見るボタンを押すごと)に、ランダムにソートした結果の「続き」が取得できる


ということになります。