如何在自定义公式中创建带有占位符的 pdo mysql 准备语句?



我正在实施一个类似于你在Google Play和许多其他中看到的评级系统。为此,我创建了一个名为tbl_ratings和列的表PRIMARYIIDsum_rating。当然,PRIMARY列是自动增量键,IID是项目 ID,sum_rating是所有用户评分的累积总和。

因此,tbl_ratings表可以如下所示:

PRIMARY IID sum_rating
21       2   100

现在这就是我打算做的,我想避免只为了检索一个值而在 PHP 中使用SELECT,因为我可以从更新查询中做一个简单的添加,所以每次有用户提交评级时,我都会更新以下表:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $pdo->prepare("UPDATE tbl_ratings SET sum_rating=sum_rating+".$_POST['rating']." WHERE IID='2'")
$stmt->execute();

但当然,如您所知,这是一个糟糕的实现,因为它对SQL注入开放。但是,嘿,它有效!所以现在我想通过做更安全

的事情
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $pdo->prepare("UPDATE tbl_ratings SET sum_rating=sum_rating+? WHERE IID='2'")
$stmt->execute(array($_POST['rating']));

如果您注意到它非常简单,我只需将潜在的 sql 注入点替换为?占位符,就像应该构造正确的预准备语句一样。坏事是,这行不通。我尝试在网上查找,但似乎没有那么富有成效。

在1 pdo 预准备语句中实现已知列值和数据的计算的正确方法应该是什么?

所有值在执行方法中都转换为字符串值。必须使用 bindParam 方法设置值类型,例如:

$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);

最新更新