0

我的 mysql 查询语法有一个奇怪的问题。我制作了一个系统,当用户获得一定数量的积分时,它会向他们显示特定的排名。

例如
当他们有1000或更多积分时,他们是1级
3000或更多积分,他们是2级
5000或更多积分,他们是3级
8000或更多积分,他们是4级
9000或更多积分,他们是5级。

Mysql 表结构:
表名:rank 结构: 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 级.
(P/S 当用户有 8500 点时,他们会获得 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 回答