みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

[MYSQL/PHP]同着表示でのランキング表示

現在、ランキングシステムを構築中です。

DBのポイント順にランキングとしてJSONで出力して、
5件目まで行くと、次の5件という風に更新するようなプログラムを作りたいと思います。
また、ポイントが同数のものは同ランクとして出力したいと思っております。

point table
-----------------
| ID| POINT |
---------------—
| 1 | 100 |
| 2 | 50 |
| 3 | 50 |
| 4 | 20 |
| 5 | 20 |
| 6 | 10 |
| 7 | 80 |
| 8 | 70 |
| 9 | 40 |
|10 | 30 |
---------------—

1回目) http://localhost:8080/ranking/?offset=0
出力:
[{"data":[{"rank":1,"id":1,"point":100},{"rank":2,"id":7,"point":80},{"rank":3,"id":8,"point":70},{"rank":4,"id":2,"point":50},{"rank":4,"id":3,"point":50}]}]

2回目) http://localhost:8080/ranking/?offset=5
[{"data":[{"rank":6,"id":9,"point":40},{"rank":7,"id":10,"point":30},{"rank":8,"id":4,"point":20},{"rank":8,"id":2,"point":20},{"rank":10,"id":6,"point":10}]}]

上記のような出力をするのに、必要なMYSQLとPHPの処理を考えているのですが、上手くいきません。
何かアドバイスお願い致します!
また何かGETで引き渡すデータは必要でしょうか?

$offset = $_GET[‘offset’];
$sql = ‘SELECT id, point FROM point ORDER BY point DESC LIMIT 5 OFFSET ’.$offset;

$selectResult = mysql_query($sql );

$rank = 1;
$last_score = null;
$rank_count = 0;
$i = 0;
foreach($selectResult as $val){
$rank_count++;
if($last_score != $val['point‘]){
$rank = $rank_count;
$last_score = $val['point‘];
}
$jsonArray[‘data'][$i]['rank'] = $rank;
$jsonArray[‘data'[$i]['point'] = $val->point;
$jsonArray[‘data'[$i]['userUid'] = $val->user_uid;
$i ++;
}
return json_encode($jsonArray);

投稿日時 - 2014-03-21 00:13:54

QNo.8522182

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

10人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

一応模範解答的なものを載せておきます。
http://pastebin.com/ELA6LmLn

今回はプレースホルダを使わずに簡易的に文字列連結で実装しましたが、SQLインジェクションに対する脆弱性は発生しません。何故ならば、どんな文字列がきても

$offset = isset($_GET['offset']) ? max(0, (int)$_GET['offset']) : 0;

この部分で必ず整数にキャストされるためです。通常であれば整数を想定している場合であってもプレースホルダを使ったほうがいいのですが、今回は順位を正確に算出しなければいけないという理由から「0以上の整数」であらねればらない追加の制約があり、このチェックのために自前でのキャストが必須になったので、プレースホルダは使わない方法でも十分であろう、と判断したまでです。

投稿日時 - 2014-03-21 01:33:42

ANo.2

Get でも Postでも同じですが、
クエリを自由に指定できると問題になるところがあるんじゃないですかね?

それ以前の問題のようですが、クエリを自由に指定できるということがどういうことになるのか考えてみましょう。

考え方としては、
ソートして○番目~△番目の□件をselect文でどうかくのか?

100番目くらいまで具体的な数字書けば、よほど鈍くない限り規則性が分かります。

規則性を(数学的)変数と最も小さい整数の組み合わせで式で表します。

ここまで分かれば書くだけかと。

投稿日時 - 2014-03-21 00:54:03

ANo.1

以下の「初心者がやりがちなミス」にLIKE検索関連以外全て該当しています。コードの見直しを行ってください。

Qiita - PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

>> 上記のような出力をするのに、必要なMYSQLとPHPの処理を考えているのですが、上手くいきません。

というか、現在のコードだと文法エラーで全く動きませんけど。半角文字を使うべきところで全角文字も混じっていたりして酷い状態です。エラーって全て表示されていますか?php.iniをエディタで開き、

error_reporting = E_ALL | E_STRICT
display_errors = On

となるように編集してください。本番環境ではエラーを表示すべきではありませんが、デバッグ環境では全てのエラーを表示すべきです。こうすることで修正すべき点が自ずからある程度分かるようになるでしょう。ちょっと言葉厳しいかもしれませんが、基本的に質問サイトで全く考察の伴わない「上手くいきません」は禁句だと思ってください。

投稿日時 - 2014-03-21 00:40:42

あなたにオススメの質問