首先我是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天内挣扎。
答案 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对其进行订购,这样您就可以获得独特的排名。