我正在实施一种评级系统,该系统与您在Google Play和其他许多系统中看到的类似。为此,我创建了一个名为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 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准备好的语句中实现已知列值加数据的计算的正确方法应该是什么?
答案 0 :(得分:2)
在execute方法中所有值都转换为字符串值。您必须使用bindParam方法来设置值类型,例如:
$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);