如何在自定义方程式中使用占位符创建pdo mysql预处理语句?

问题描述 投票:0回答:1

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

所以tbl_ratings表看起来像这样:

PRIMARY IID sum_rating
21       2   100

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

$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预处理语句中实现计算已知列值和数据的正确方法应该是什么?

php mysql prepared-statement
1个回答
2
投票

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

$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);
© www.soinside.com 2019 - 2024. All rights reserved.