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

gopyfrb3  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(278)

我正在实施一个评级系统,类似于你在googleplay和其他许多网站上看到的。为此,我创建了一个名为 tbl_ratings 和列 PRIMARY , IID 以及 sum_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']));

如果您注意到它非常简单,我只是用 ? 占位符和正确的准备语句一样应该被构造。不好的是,这不起作用。我试着在网上搜索,但似乎没有那么有成效。
在1pdo准备的语句中,实现已知列值加上数据的计算的正确方法应该是什么?

fdx2calv

fdx2calv1#

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

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

相关问题