使用PHP MySQL更新玩家分数

使用PHP MySQL更新玩家分数,php,mysql,Php,Mysql,我有一个用户表,我想在每次用户完成游戏时更新分数。Unityscript部分工作正常,但在我将分数发布到数据库后,它似乎增加了两倍或三倍。我将分数发布为int,表列也是int格式。我的PHP如下所示: try { $db = new PDO("mysql:host=$host;dbname=$dbname", $db_user, $db_pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我有一个用户表,我想在每次用户完成游戏时更新分数。Unityscript部分工作正常,但在我将分数发布到数据库后,它似乎增加了两倍或三倍。我将分数发布为int,表列也是int格式。我的PHP如下所示:

try {

   $db = new PDO("mysql:host=$host;dbname=$dbname", $db_user, $db_pass);
   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   $data = array(
       ':username' => $_POST['username'],
       ':score' => $_POST['score']);

   $statement = $db -> prepare ("UPDATE users SET score = score + :score
                                 WHERE username = :username"); 
   $statement->execute($data);
}
catch(PDOException $e) {
   echo $e->getMessage();
}

非常感谢您提供的任何帮助或建议。

您使用的是预先准备好的语句,但您仍然可以通过直接实现$score变量来允许注入。对分数执行与用户名相同的操作

你说的双倍或三倍是什么意思?你是说这个数字要大两三倍?如果是这样,请尝试使用SELECT语句获取分数并用PHP进行计算。然后,更新用户表

这样做可以让你更好地理解自己做错了什么。您是否尝试在try and catch中回显分数的值,以查看该值是否重复?代码可能会运行多次

$statement = $db -> prepare ("UPDATE users SET score = :score
                             WHERE username = :username"); 

使用这个,我认为它会起作用

如果你使用预先准备好的语句,在整个过程中使用它们,也用于$score。你在查询中硬编码$score的是什么。您刚刚绕过了dql注入保护。准备好的语句就到此为止:DYou通过使用准备好的语句开始做正确的事情,然后将其拍摄下来。是否还有其他相关代码?请不要将答案用于注释和问题。@JayBlanchard他的问题令人困惑,所以我回答了我认为他的问题,同时要求他确认。对不起,是的,没错。例如,如果旧的分数是100,新的分数是50,那么它将变成250而不是150。@yellowbedsheet尝试按照我的建议执行,并在Try语句中回显$score。查看a是否显示三次或b值是否完全不正确。这并不能回答问题。若要评论或要求作者澄清,请在其帖子下方留下评论。