0

mysqlクエリ構文に奇妙な問題があります。一定のポイントがあると、ユーザーに特定のランキングを表示するシステムを作りました。

たとえば、
1000以上のポイントがある場合、レベル1
3000以上のポイント、レベル2
5000以上のポイント、レベル3
8000以上のポイント、レベル4
9000以上のポイント、レベル5です。

MySQLテーブル構造:
テーブル名:ランク構造:pts、rankname

次のようにmysqlクエリ:

$result = mysql_query("SELECT * FROM rank WHERE pts <= '$userpts' ORDER BY pts DESC LIMIT 1")
or die(mysql_error()); 
$row = mysql_fetch_array($result);
if($row){
  $rank = $row['rankname'];
  echo $rank;
}

ただし、奇妙な問題が発生しました。ユーザーポイントが10,​​000ポイントを超えると、ランク名レベル5を取得する必要がありますが、代わりにランク名レベル1(1000〜2999ポイントのユーザーが取得)を取得
します。何が起こっているのかわからない場合は、正確にレベル5を取得する必要があります。 。
(ユーザーが8500ポイントを持っている場合、P / Sはレベル4を取得します。これは、10k未満のポイントがランク名を取得するために正常に機能することを意味します)

クエリロジックに何か問題がありますか?私は自分自身を混乱させました。

4

3 に答える 3

6

ptsフィールドが CHAR または VARCHAR フィールドではなく、数値フィールドであることを確認してください。

数値としての 10000 は、1000 と 9000 の両方よりも大きくなります。ただし、文字列は、辞書編集順序 (つまり、アルファベット順) に従って比較されるため、次の順序になります。

1000
10000
9000
于 2012-06-20T07:55:47.427 に答える
1

列は数値ではなくテキストデータ型(例:VARCHAR)です。

于 2012-06-20T07:52:32.260 に答える
0

まず、pts (<=) のように数値比較でフィールドを使用している場合は、それを文字列と比較しないでください。$userpts 周辺から引用符を削除します。

また、PHP 変数を SQL ステートメントに直接埋め込むと、SQL インジェクションに対して脆弱になる可能性があります (残りのコードによって異なります)。

于 2012-06-20T07:57:18.263 に答える