php - 如何在自定义方程中创建带有占位符的 pdo mysql 准备好的语句?

标签 php mysql prepared-statement

我正在实现一个类似于您在 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 注入(inject)的影响。但是嘿,它起作用了!所以现在我想通过这样做来更安全

$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 注入(inject)点,就像构建正确的准备好的语句一样。糟糕的是,这不起作用。我尝试在网上查找,但似乎没有那么有效。

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

最佳答案

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

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

关于php - 如何在自定义方程中创建带有占位符的 pdo mysql 准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52348578/

相关文章:

php - 如何从 mysql 数据库中获取项目并将其添加到页面,每个项目都有一个复选框?

php - 使用php将阿拉伯语文本存储在mysql数据库中

PHP mysqli 命令不同步;你现在不能运行这个命令

php - 如何以 'reusable' 的方式将参数传递给数组中的 PDO SELECT 语句?

php - mysqli_stmt_get_result 和 mysqli_fetch_all 不兼容?

php - 为什么我的代码无法检索/显示 PDO 记录集?

java - 使用PreparedStatement::setInt null 输入会发生什么

php - 如何避免CodeIgniter中 Controller 代码臃肿?

php - mysql价格比较,显示所有价格

java - 尝试使用hibernate从MySQL获取数据,并显示在thymeleaf列表中(循环)