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 尝试了很多东西,但我不能让它直接作用于键。

使用数组映射比仅使用 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);

有什么选择吗?

4

2 回答 2

10

有人可以向我解释为什么您不能将密钥作为参考传递吗?

因为语言不支持这个。你很难在大多数语言中找到这种能力,因此术语key

所以我坚持这样的事情吗?

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

有什么选择吗?

提供更好选择的唯一方法是了解您的具体情况。如果您的键映射到表列名称,那么最好的方法是保持键不变,并在它们在 SQL 中使用时对其进行转义。

于 2011-09-30T22:49:45.333 回答
0

为什么这样做有问题?让它成为一个功能。一个函数接受一个输入并给出一个输出。您的函数输入将是您的“不安全”数组。您的输出将是保护阵列的结果。

然后你就做

$where = secureMyArray($where);

这就是为什么你有能力制作函数......

于 2011-09-30T22:13:10.130 回答