gpt4 book ai didi

PHP - 具有未知数量参数的安全 PDO 准备好的语句

转载 作者:行者123 更新时间:2023-11-29 06:47:05 24 4
gpt4 key购买 nike

*我看到有关 mysqli 或 PDO 边缘案例的主题的问题,但没有找到这个具体问题(这让我感到惊讶,但也许我不知道如何搜索)

在尝试使用 PDO 之前,我使用了简单的、不 protected 查询。我的准备函数如下所示,经过简化:

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 是关联数组:对于 $arguments,['name' => 'John', 'ocupation' => 'Carpenter']['employeeId' = > 518] 例如,用于过滤器。假设 $table 是“workers”。通过一些简单的函数,就变成了:

argumentsList 变为

`name` = 'John', `occupation` = 'Carpenter'

filterList 变为

`employeeId` = 518

所以最终的字符串变成:

UPDATE `workers` SET `name` = 'John', `occupation` = 'Carpenter' WHERE `employeeId` = 518;

这对我来说似乎很简单。然后,我尝试在 PDO 的准备语句中使用类似的逻辑。但我遇到了麻烦。也许是因为我不明白其背后的哲学?或者只是技术细节。

如果我理解正确的话,PDO需要在prepare()之后使用bindValue()方法来防止注入(inject)。而且,我必须使用占位符(:名称、:职业等)。

问题是,如果我不知道要查找哪些列,甚至不知道要查找多少列,该怎么办?

我看到的大多数示例都包含一个非常预定义的语句: UPDATE tableX SET `name` = :name WHERE `id` = :id - 或类似的内容。

如果我想使用可变数量的参数怎么办?我的理解是,我只能用一个属性替换一个 :placeholder,而不是更多(因此不需要引号),所以我不能完全写出如下内容:

UPDATE :table SET :allParametersHere ;

我该如何解决这个问题?我没有想要使用此函数的明确表,更不用说要检查的合理有效列列表了。我将如何创建一个适用于不同参数数量的包装器?

最佳答案

对于此类问题,数据库查询生成器解决方案会更好。

回到问题:你知道参数的数量,所以你可以创建查询模板。

<?php
$wq = $pq = [];
$allowed_keys = ['name', 'occupation', '...'];

foreach ($arguments AS $key => $value) {
if(in_array($key, $allowed_keys))
$pq[] = "$key = :$key" ;
else throw new Exception('Go away hacker!');
}
foreach ($filter AS $key => $value)
if(in_array($key, $allowed_keys))
$wq[] = "$key = :$key" ;

$q = "UPDATE $table SET ". join(', ', $pq);
if(!empty($wq))
$q .= 'WHERE '. join(' AND ', $wq);

在结果中,您会得到如下查询模式:

UPDATE worker SET 名称 = :name, 职业 = :职业 WHERE employeeId = :employeeId;

允许这种折叠(如果您有这些表的“安全” key )

$allowed_keys 或更好的 $allowed_column_names

关于PHP - 具有未知数量参数的安全 PDO 准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48895440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com