传递键和值的引用的替代方案:

8
有人能解释一下为什么不能将键作为引用传递吗?
例如:
if(is_array($where)){
    foreach($where as &$key => &$value){
        $key = sec($key);
        $value = sec($value);
    }
    unset($key, $value);
}

抛出异常:

Fatal error: Key element cannot be a reference in linkstest.php on line 2   

我可以使用array_map做类似的事情吗?我只想遍历关联数组,并使用我的sec()函数转义键和值。
对我来说,理解Array map很困难:
我尝试了许多array_map的用法,但我无法直接作用于键上。
使用array_map是否会获得任何性能优势,而不仅仅是使用foreach循环?
我不喜欢foreach的原因是我不能直接作用于数组,并且必须处理创建临时数组并取消设置它们的问题:
foreach($where as $key => $value){
 $where[secure($key)] = secure($value);
}

如果在密钥中发现需要转义的内容、添加新元素并保留未转义的内容,此操作可能会失败。

那么我是否只能使用类似这样的方式?

$temparr = array();
foreach($where as $key => $value){
 $temparr[secure($key)] = secure($value);
}
$where = $temparr;
unset($temparr);

有其他替代方案吗?

这值得大声质疑,如果 sec($key) 的结果与另一个已存在的键的值相同怎么办?你只是覆盖现有的键吗?你需要解释为什么在你的应用程序中一个键可能会很危险。 - webbiedave
为什么这不可能是危险的呢?你可以轻松地在表单上更改 $_POST 键,或者使用类似 Tamperdata 的工具。我在 MySQL 查询中使用了一些键。 - Ben
我并没有说它们不可能是危险的。我说的是你需要解释为什么在你的应用程序中,一个密钥可能会有危险性。这将告诉我们在你的情况下使用最佳方法。 - webbiedave
我经常修改键和值,不仅限于mysql。我正在学习PDO和预处理语句,所以在那里应用会比较少……但是假设我想替换数组中的键和值中的字符串,或者将其改为大写,或者执行任何数量的操作。 - Ben
2个回答

10

有人能解释一下为什么不能将键作为引用传递吗?

因为语言不支持这种操作。大多数编程语言都不支持这样的操作,因此才称之为“键”。

那我只能像这样做吗?

是的。最好的方法是创建一个具有适当键的新数组。

还有其他替代方案吗?

提供更好的替代方案的唯一方法是了解您的具体情况。如果您的键映射到表列名,则最好的方法是保留键,并在使用它们时在SQL中转义它们。


0
为什么这是个问题?把它变成一个函数。一个函数接受输入并给出输出。你的函数输入将是你的“不安全”数组。你的输出将是保护数组的结果。
然后你只需要这样做:
$where = secureMyArray($where);

这就是为什么你有能力创建函数的原因...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接