如何在自定义方程式中创建带有占位符的 pdo mysql 准备语句?
How to create a pdo mysql prepared statement with a placeholder in a custom equation?
我正在实施一个评级系统,该系统类似于您在 google 游戏和许多其他游戏中看到的系统。为此,我创建了一个名为 tbl_ratings
的 table 和列 PRIMARY
、IID
和 sum_rating
。当然,PRIMARY
列是自增键,IID
是item id,sum_rating
是所有用户评分的累加和。
所以 tbl_ratings
table 可以看起来像这样:
PRIMARY IID sum_rating
21 2 100
现在这就是我打算做的,我想避免做 SELECT
只是为了检索在 PHP 中使用的值,因为我可以从更新查询中进行简单的添加, 所以每次有用户提交评分时,我都会更新 table 如下:
$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 准备语句中实现已知列值加数据计算的正确方法应该是什么?
所有值都在执行方法中转换为字符串值。您必须使用 bindParam 方法来设置值类型,例如:
$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);
我正在实施一个评级系统,该系统类似于您在 google 游戏和许多其他游戏中看到的系统。为此,我创建了一个名为 tbl_ratings
的 table 和列 PRIMARY
、IID
和 sum_rating
。当然,PRIMARY
列是自增键,IID
是item id,sum_rating
是所有用户评分的累加和。
所以 tbl_ratings
table 可以看起来像这样:
PRIMARY IID sum_rating
21 2 100
现在这就是我打算做的,我想避免做 SELECT
只是为了检索在 PHP 中使用的值,因为我可以从更新查询中进行简单的添加, 所以每次有用户提交评分时,我都会更新 table 如下:
$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 准备语句中实现已知列值加数据计算的正确方法应该是什么?
所有值都在执行方法中转换为字符串值。您必须使用 bindParam 方法来设置值类型,例如:
$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);