【发布时间】:2018-02-20 22:44:36
【问题描述】:
*我在 mysqli 或 PDO 的边缘案例中看到了关于这个主题的问题,但没有找到这个特定的问题(这让我感到惊讶,但也许我不知道如何搜索)
在尝试使用 PDO 之前,我使用了简单的、不受保护的查询。我的准备函数看起来像这样,经过简化:
static function prepareUpdate($table, array $arguments, array $filter) {
$argumentsList = self::associateArguments($arguments);
$filterList = self::associateArguments($filter);
$query = "UPDATE `$table` SET $argumentsList WHERE $filterList;";
return $query;
}
$arguments 和 $filter 是关联数组:例如,['name' => 'John', 'occupation' => 'Carpenter'] 用于 $arguments,['employeeId' => 518] 用于过滤器。假设 $table 是“工人”。通过一些简单的函数,就变成了:
argumentsList 变成
`name` = 'John', `occupation` = 'Carpenter'
filterList变成
`employeeId` = 518
所以最后的字符串变成:
UPDATE `workers` SET `name` = 'John', `occupation` = 'Carpenter' WHERE `employeeId` = 518;
这对我来说似乎很简单。然后,我尝试在 PDO 的准备语句中使用类似的逻辑。但是我遇到了麻烦。也许是因为我不了解它背后的预期哲学?或者只是技术细节。
如果我理解正确的话,PDO 需要在 prepare() 之后使用 bindValue() 等方法来防止注入。而且,我必须使用占位符(:name、:occupation 等)。
问题是,如果我不知道要查找哪些列,甚至不知道要查找多少列,我该怎么做?
我看到的大多数示例都包含一个非常预定义的语句:UPDATE tableX SET `name` = :name WHERE `id` = :id - 或类似的内容。
如果我想使用可变数量的参数怎么办?我的理解是,我只能用一个属性替换一个 :placeholder,而不是更多(因此不需要引号),所以我不能完全写出类似的东西:
UPDATE :table SET :allParametersHere ;
我该怎么做呢?我没有要在其上使用此函数的明确表,更不用说要检查的有效列的合理列表。我将如何创建一个可以处理不同参数数量的包装器?
【问题讨论】:
-
您是否尝试过这里的任何答案? stackoverflow.com/questions/12344741/… -- 看起来很有希望
-
几乎@Drew 这个答案:stackoverflow.com/a/23298742/1194525
-
由于您使用的是 PDO,因此无需使用
bindParam或bindValue:只需将标记的值数组传递给execute方法即可。 -
@aendeerei Dwarf 的模板有问题,用于可变数量的参数,而不是绑定。