PHP SQL更新语句转换为(PDO)预处理语句

时间:2016-12-15 11:13:01

标签: php mysql pdo

首先我是Stackoverflow和PHP的新手,所以对我来说并不难。

我本周在sql查询中苦苦挣扎:

SET @i=0;UPDATE highscores SET ranking=@i:=(@i+1) ORDER BY highscore DESC;

我使用这个sql查询,因为我有一个名为'highscores'的表和名为highscore和ranking的列。这段代码帮助我自动组织排名系统(所以最高的分数得到排名1等(没有相同的排名与相同数量的高分)),但因为即时通讯使用PHP并希望它是安全的准备好的PDO im语句真的很困惑怎么做。我需要一些示例如何将此sql查询转换为安全的pdo预处理语句,以便代码嗅探器不会进入数据库。这是有效的代码:

$stmt = $db->prepare("SET @i=0;UPDATE highscores SET ranking=@i:=(@i+1) ORDER BY highscore DESC;     
$stmt->execute();

但是你看到它没有安全。我尝试使用数组和bindparams,但我真的很困惑如何实际让它工作,而它的安全。我希望你们可以帮助我,因为我很难在3天内挣扎。

1 个答案:

答案 0 :(得分:0)

由于您没有使用查询外部的任何变量,因此这个查询是安全的。我唯一要改变的是删除这个结构,因为你可以通过一个很好的SELECT COUNT查询轻松地获得排名。

$query = $pdo->prepare('SELECT COUNT(id) AS count FROM highscores WHERE highscore < :highscore');
$query->execute(['highscore' => $highscore]);
$row = $query->fetch(PDO::FETCH_ASSOC);

$ranking = (intval($row['count']) + 1);

这是一个简单的例子,您可以在检查此项目之前的内容时使用ID对其进行订购,这样您就可以获得独特的排名。

相关问题