• 締切済み

[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);

みんなの回答

noname#244856
noname#244856
回答No.3

一応模範解答的なものを載せておきます。 http://pastebin.com/ELA6LmLn 今回はプレースホルダを使わずに簡易的に文字列連結で実装しましたが、SQLインジェクションに対する脆弱性は発生しません。何故ならば、どんな文字列がきても $offset = isset($_GET['offset']) ? max(0, (int)$_GET['offset']) : 0; この部分で必ず整数にキャストされるためです。通常であれば整数を想定している場合であってもプレースホルダを使ったほうがいいのですが、今回は順位を正確に算出しなければいけないという理由から「0以上の整数」であらねればらない追加の制約があり、このチェックのために自前でのキャストが必須になったので、プレースホルダは使わない方法でも十分であろう、と判断したまでです。

全文を見る
すると、全ての回答が全文表示されます。
  • kamikami30
  • ベストアンサー率24% (812/3335)
回答No.2

Get でも Postでも同じですが、 クエリを自由に指定できると問題になるところがあるんじゃないですかね? それ以前の問題のようですが、クエリを自由に指定できるということがどういうことになるのか考えてみましょう。 考え方としては、 ソートして○番目~△番目の□件をselect文でどうかくのか? 100番目くらいまで具体的な数字書けば、よほど鈍くない限り規則性が分かります。 規則性を(数学的)変数と最も小さい整数の組み合わせで式で表します。 ここまで分かれば書くだけかと。

全文を見る
すると、全ての回答が全文表示されます。
noname#244856
noname#244856
回答No.1

以下の「初心者がやりがちなミス」にLIKE検索関連以外全て該当しています。コードの見直しを行ってください。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 >> 上記のような出力をするのに、必要なMYSQLとPHPの処理を考えているのですが、上手くいきません。 というか、現在のコードだと文法エラーで全く動きませんけど。半角文字を使うべきところで全角文字も混じっていたりして酷い状態です。エラーって全て表示されていますか?php.iniをエディタで開き、 error_reporting = E_ALL | E_STRICT display_errors = On となるように編集してください。本番環境ではエラーを表示すべきではありませんが、デバッグ環境では全てのエラーを表示すべきです。こうすることで修正すべき点が自ずからある程度分かるようになるでしょう。ちょっと言葉厳しいかもしれませんが、基本的に質問サイトで全く考察の伴わない「上手くいきません」は禁句だと思ってください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQL→PHP→JSONをしたいのですが…

    現在、MySQLから取得したID一覧をJSON形式で出力したいのですが、うまくいきません。どうしたらよいでしょうか?よろしくお願いします。 なお、PHPでは以下のような処理をおこなっています。 ///////////////////////////////////////////////////////////////////// ・ ・ ・ //SQLを発行して結果セットを取得します $rst = mysql_query($sql); while ($col = mysql_fetch_array($rst)) { $return[] = $col; } function get_id($f) { return $f["dataid"]; } $return = array_map( "get_id", $return ); // JSON形式にして返す if( $return ) print Jsphon::encode( $return ); ・ ・ ・//////////////////////////////////////////////////////////////////// このようなかんじです。 この出力結果は『 ["18","19","20"] 』このようになるのでJSONでうまく処理できていないようです。 JSON形式なら『 {"dataid":"18","dataid":"19","dataid":"20"} 』 になるはずなのですが…何故でしょうか?教ええてください。お願いします。

    • ベストアンサー
    • PHP
  • ランキング

    いつもお世話になっております。 MySQLでランキングの付け方を教えていただきたいと思います。 以下のようなテーブルがあります。 ItemCd | Count 1001 | 1 1003 | 2 1005 | 1 1007 | 3 1009 | 4 1010 | 4 下記のような「Rank」というカラムを作成して ランキング順位で取得したいと思います。 ItemCd | Count | Rank 1009 | 4 | 1 1010 | 4 | 1 1007 | 3 | 2 1003 | 2 | 3 1001 | 1 | 4 1005 | 1 | 4 以下のSQLを発行してもエラーになってしまいました。 select r.*, count(*)+1 As Rank from tableA r left outer join tableB n on (r.Count < n.Count) order by count(*) よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux) MySQL:3.23.58

    • ベストアンサー
    • MySQL
  • PHP MySQLでエラーがでてしまいます。

    PHP MySQLからデータを取得したいのですが、以下のエラーが出てしまい原因が分かりません。 詳しい方お願い致します。 <b>Warning</b>: json_encode() expects exactly 1 parameter, 2 given in <b>/home/users/2/***.**-********/web/****************/php/seupPharmacyData.php</b> on line <b>21</b><br /> エラーが出るコードは以下になります。 <?php include "db.php"; $sql = "SELECT * FROM user_data"; $query = mysql_query($sql, $db) or die("クエリの送信に失敗しました。<br />SQL:".$sql); $result= array(); while ($row = mysql_fetch_object($query)) { $result[] = array( 'name1' => $row->name1, 'name2' => $row->name2, 'name3' => $row->name3, 'id' => $row->id, ); } //jsonとして出力 header('Content-type:application/json; charset=UTF-8'); echo json_encode($result,JSON_UNESCAPED_UNICODE); ?>

    • ベストアンサー
    • PHP
  • PHPでMySQLのデータを表示したい

    /* どなたか以下のエラーの原因をご教授ください。よろしくお願いいたします。 金額の多い人順にデータを並べ替えて上位3人を順番に表示するプログラムです*/ <?php mysql_connect("localhost","user","password"); mysql_selectdb("rensyu"); $result = mysql_query("SELECT * FROM uriage ORDER BY kingaku DESCLIMIT 3"); $uriageStr = ""; $count = 1; while(!$data = mysql_fetch_array($result)) { $uriageStr = $uriageStr."namae".$count."=".$data[0]."&kingaku".$count."=".$data[0]."&"; } $uriageStr = substring($uriage,0,length($uriage)-1); print($uriageStr); ?> /* MySQLにはrensyuデータベースを作成、それにuriageテーブルを作成、フィールドとしてnamaeとkingakuを作成、 namaeにakiko,bunta,coco,daisuke,eikoを入力、それぞれにkingakuとして1,2,3,4,5を入力している。 この場合http://localhost/get_uriage.phpと入力した場合次のような結果が表示されるはずです。 namae1=eiko&kingaku1=5&namae2=daisuke&kingaku2=4&namae3=coco&kingaku3=3 しかし、表示結果は Parse error:parse error,unexpected T_STRING in C:\www\get_uriage.php on line 9 でした。 TeraPadの行表示でで9行目は $count = 1;です。(コメントは除く) */

    • 締切済み
    • PHP
  • php、mysqlを使用した得点ランキング

    現在得点ランキングを作成しています。 mysqlの中に入っているデータを取り出して表示させたいのですが、 なかなかうまくいかず困っています。 mysql内 |id|name| |1|山田| |2|佐藤| |3|山田| |4|鈴木| |5|佐藤| |6|山田| |7|鈴木| |8|田中| としております。 表示方法は 順位| 名前 | 得点数 1位 | 山田 | 3 2位 | 佐藤 | 2 2位 | 鈴木 | 2 4位 | 田中 | 1 としたいです。 mysql内に入っている名前の数で得点数を出してなおかつソートで降順にしたいです。 お分かりの方がいらっしゃいましたらご教示お願いします。

    • ベストアンサー
    • PHP
  • PHP+MYSQLで3×5のテーブル表示について

    こんにちは。 PHP+MYSQLでページング処理で画像を出力の勉強をしています。 さっそく質問です。PHP+MYSQLを使って 元テーブルがID番号、名前、性別だとして、 1名分の表示は上記フィールドのデータを縦に3行作った後、 横の列に移るという作業をして、結果縦横に3×5並べる にはどう書けば良いいでしょうか? プログラムのイメージは以下になります。 めくっていく頁のはじめの行($i=$startline)から表示する時、 表示を1列×3行のまとまり□を縦横に3×5出力する場合、 mysqlに接続した後、 $rs = mysql_db_query($db,$sql); while($row=mysql_fetch_array($rs) ){ print("<table><tr>"); print("<td>"); print("<td>"); for($i=0;$i<4;$i++){ print("<tr>"); print("<td>"); print($row[$i]); print("</tr>"); print("</td>"); print("</td>"); } print("</td>"); print("</tr></table>"); こういう形の後、ページングの$pageのurlを作って、$_get[]に 飛ばすというイメージです。 よろしくお願いします。 以上

    • 締切済み
    • PHP
  • php+MYSQL

    タイトル 本文 書き込み後保存を押すと 下に書き込み保存されていく形です タイトル 本文 書き込み日時 タイトル 本文 書き込み日時 エラー自体は出てないのですが書き込みが反映されません val_dunpで調べたところ resource(7) of type (mysql result) > このように出てきましたなにか文自体に必要なものがないのでしょうか? <?php $link = mysql_connect('localhost','user','pass'); if (!$link) { die('接続に失敗しました。'.mysql_error()); } $db_selected = mysql_select_db('ogawa',$link); if(!$db_selected) { die('データベース選択に失敗しました。'.mysql_error()); } $res = mysql_query('SELECT * FROM test'); if (!$res) { die('クエリーが失敗しました。'.mysql_error()); } if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; $kakikomi = $_POST['kakikomi']; if ( $subject !=='' && $honbun !=='' && $kakikomi !=='' ) { $query = " INSERT INTO test ( " ."subject," ."honbun," ."kakikomi," .") VALUES ( " . "'" . mysql_real_escape_string( $link, $subject ) ."', " . "'" . mysql_real_escape_string( $link, $honbun )."'," . "'" . mysql_real_escape_string( $link, $kakikomi)."'," ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysql_query($query,$link); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT id,subject,honbun,kakikomi FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].''.$val['kakikomi'].'<br>'; } ?> </body> </html>

  • MySQLでのランキングを作成するSQL

    ランキングを作成する、効率の良いSQLを教えて下さい。 MySQLで、以下の状態です。 テーブル名: hoge カラム: id,kbn,name,score,flg,date id…自動 kbn…1~4 name…string score…int flg…bool date…年月日 (1)dateが1週間以内のデータのみ (2)flgがtrueのデータのみ (3)kbn毎に、5レコード取得 (4)順位は、点数が重複している場合は同一の順位をつけSQLで生成しn位のフォーマット (5)6レコード以降に同一スコアのデータがある場合は日付が古い順 (6)scoreは、n点のフォーマット (7)該当データが5レコード存在しなかった場合は、順位だけをセットし他をnull 欲しい結果は、以下の状態です。 kbn,順位,name,score 1 ,1位 ,ホゲ,100点 1 ,2位 ,あい, 85点 1 ,2位 ,かき, 85点 1 ,4位 ,くけ, 70点 1 ,5位 ,さし, 65点 2 ,1位 ,すせ, 99点 2 ,1位 ,たち, 99点 2 ,3位 ,つて, 80点   ・   ・   ・ 4 ,4位 ,らり, 10点 null ,5位 ,null, null 以上、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • Flash→PHP→MySQLへの値の受け渡しについて

    現在、Flashのフォームで受け取った値をPHP経由でMySQLへデータを格納するシステムを作成しています。 現在、詰まっている点とは、Flashで送信したデータがMySQLまで到達できないというところです。 少し分析してみたところ、PHPを単独でブラウザにて開くと "フィールドが取得できません。" と出力されていました。 これは、 ----- <?php $setsuzoku = mysql_connect("localhost", "*****", "*****"); if (! $setsuzoku) { die ("データベースに接続できません"); } if (! mysql_select_db ("test")) { die ("データベースが取得できません"); } mysql_query("INSERT INTO rank VALUES('".$HTTP_GET_VARS['nickname']."', ".$HTTP_GET_VARS['score']); if (!$fd) { die ("フィールドが取得できません。"); } // 処理が終わったことを知らせる print('OK'); ----- というプログラムで動かしていまして、『mysql_select_db ("test")』まで動作しているのではないかと思われます。 ですので、もしかしたらFlash以前にPHPとSQLの連携がうまくいっていないような気がするのですが…どうでしょうか? Flashからの情報を送信するシステムである以上、PHPで表示すると必ずこのような形になるのでしょうか? ちなみにMySQLには、必要なDatabaseとテーブルを作成しました。 問題の切り分けは一応してみましたが、間違っているかもしれません。何かご教授頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • php+mysql

    $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); val_dunpを使い確認したところ bool(false) >となってしまい失敗します falseに返さないようにするにはどうしたらいいでしょうか? 簡易掲示板作成 タイトル 本文記載後下にタイトル 本文 書き込み日時が 書き込まれていく仕組みです <?php $link = mysql_connect('localhost','user','pass','dbname'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; if ( $subject !=='' && $honbun !=='' ) { $query = " INSERT INTO test ( " ."subject," ."honbun," .") VALUES ( " . "'" . mysql_real_escape_string( $link, $subject ) ."', " . "'" . mysql_real_escape_string( $link, $honbun ) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysql_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].'<br>'; } ?> </body> </html>

    • ベストアンサー
    • MySQL