chi*_*lly 5 php forms arrays post htmlspecialchars
我有一个 HTML 表单,它使用 POST 将数据发送到 PHP 脚本。到目前为止,我还没有在 HTML 表单中使用数组,但该表单要求对某些字段进行分组(例如价格和数量),而其他字段仍然是单个输入字段(名称、电子邮件等)。
我想在 PHP 脚本收到输入时对其进行清理。对于单个输入字段,我曾经循环遍历这些字段,如下所示:
if( !empty($_POST) ) {
foreach( $_POST as $x => $y ) {
$_POST[$x] = htmlspecialchars($y);
$_POST[$x] = trim($y);
}
}
Run Code Online (Sandbox Code Playgroud)
当某些项目位于数组中时,如何清理输入?
使用本机函数可以轻松修改多维数组中的所有叶节点,array_walk_recursive()因为它按设计访问所有“叶节点”。
$sweet = ['a' => 'apple ', 'b' => ' "banana" '];
$array = ['sweet' => $sweet, 'test' => " <a href='test'>Test</a>"];
function mySanitizer(&$value) {
$value = htmlspecialchars(trim($value));
}
array_walk_recursive($array, 'mySanitizer');
var_export($array);
Run Code Online (Sandbox Code Playgroud)
输出:
array (
'sweet' =>
array (
'a' => 'apple',
'b' => '"banana"',
),
'test' => '<a href=\'test\'>Test</a>',
)
Run Code Online (Sandbox Code Playgroud)
&请注意value 参数上的使用。这告诉脚本通过引用修改数据 - 否则在array_walk_recursive范围之外不会保留任何更改
要将此技术应用于$_POST超全局数组中的所有元素,请调用:
array_walk_recursive($_POST, 'mySanitizer');
Run Code Online (Sandbox Code Playgroud)
当然,这需要您编写自定义函数声明(function mySanitizer() {...})。
或者,如果您不想声明自定义函数mySanitizer,那么您只需编写以下内容:
array_walk_recursive($_POST, function(&$value){
$value = htmlspecialchars(trim($value));
});
Run Code Online (Sandbox Code Playgroud)
从大多数函数中获取return值是更常见的,但array_walk_recursive()不提供返回数据。为了使该函数能够有效满足您的要求,输入数组必须直接受其包含的自定义函数影响。“通过引用修改变量”意味着您不需要$_POST通过赋值来覆盖变量(如$_POST = ...)。只需将输入数组输入本机函数,在参数&之前写入$value,然后覆盖$value迭代时遇到的每个数组,您的$_POST变量就会被清理。
至于如何array_walk_recursive()“迭代/循环”......有一种特殊的行为值得享受。该函数将遍历数组的每个级别。如果它找到一个“可迭代”元素,它将循环遍历它包含的元素。如果它遇到不可迭代的元素(标量元素可能是字符串、整数、浮点数、布尔值、null),它将对其执行函数/回调(无论您命令它做什么)。
通过引用修改的 php 函数的另一个示例是sort(). 您不需要使用此函数进行赋值,只需通过它传递数据,当您下次访问变量的数据时,它已经被修改了。
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |