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

时间:2018-09-15 20:24:48

标签: php mysql prepared-statement

我正在实施一种评级系统,该系统与您在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 Injection是开放的。但是,嘿!所以现在我想通过做来更加安全

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

1 个答案:

答案 0 :(得分:2)

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

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