我的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级。
(P / S,当用户有8500分时,他们得到4级,这意味着低于10k的分数可以正常获得等级名称)
我的查询逻辑有什么问题吗? 我迷惑了自己。
答案 0 :(得分:6)
确保pts
字段是number field,不是 CHAR或VARCHAR字段。
10000作为一个数字大于1000和9000.然而,字符串根据它们的字典排序顺序(即按字母顺序)进行比较,所以你得到这个顺序:
1000
10000
9000
答案 1 :(得分:1)
您的列是文本数据类型(例如VARCHAR)而不是数字。
答案 2 :(得分:0)
首先,如果您在pts(&lt; =)中使用数字比较中的字段,请不要将其与字符串进行比较。从$ userpts周围删除引号。
此外,将PHP变量直接嵌入到SQL语句中可能会使您容易受到SQL注入的攻击(取决于代码的其余部分)。