2012-04-29 53 views
0

我的hiscore表有一些问题。一些球员得到很多积分非常快,可能性更大。我张贴下面两段代码:查询更新结果巨大的意外号码

第一个是我目前用,这导致问题:

$name = mysql_real_escape_string($_POST['name']); 
$set = mysql_real_escape_string($_POST['set']); 


if ($set == 1 && isset($_POST['score'])) 
{ 
    $score = mysql_real_escape_string($_POST['score']); 

    $query = mysql_query("UPDATE users SET totalScore=totalScore + '$score' WHERE username='$name'"); 

    if ($query) 
    { 
     echo 'success'; 
    } 
    else { 
     echo 'error'; 
    } 

} 

我试着投得分,如下面的代码int,但更新结果是一个巨大的数字(4294967295)被设置为totalScore。 totalScore是int类型(25),我将属性设置为无符号,所以玩家不能在负面上结束。

请帮 感谢

$name = mysql_real_escape_string($_POST['name']); 
$set = (int)$_POST['set']; 


if ($set == 1 && isset($_POST['score'])) 
{ 
    $score = (int)$_POST['score']; 

    $query = mysql_query("UPDATE users SET totalScore=totalScore + $score WHERE username='$name'"); 

    if ($query) 
    { 
     echo 'success'; 
    } 
    else { 
     echo 'error'; 
    } 

} 
+5

请停止使用古老的'mysql_ *'函数编写新代码。他们不再被维护,社区已经开始[弃用流程](http://news.php.net/php.internals/53799)。相反,您应该了解准备好的语句并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)。如果你关心学习,[这里是一个很好的PDO相关教程](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)。 –

回答

3

如果这是您用来保存得分难怪人们被骗得到高分的唯一脚本 - 为了防止它,你需要插入一些加密参数,并添加一些基于会话和时间的保护到脚本

1

它是因为你正在增加一个整数到propably整数数据类型。没有必要引号和逃避,如果您确保输入的是整数(你已经在做

"UPDATE users SET totalScore=totalScore + $score WHERE username='$name'" LIMIT 1; 

只有你正在更新基于名称的查询,您可能需要限制执行。