带有数组和单个输入的 HTML POST 到 PHP 脚本上的 htmlspecialchar

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)

当某些项目位于数组中时,如何清理输入?

mic*_*usa 3

使用本机函数可以轻松修改多维数组中的所有叶节点,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' => '&quot;banana&quot;',
  ),
  'test' => '&lt;a href=\'test\'&gt;Test&lt;/a&gt;',
)
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(). 您不需要使用此函数进行赋值,只需通过它传递数据,当您下次访问变量的数据时,它已经被修改了。