0

在下面的脚本函数 clean($data) 中调用它,我理解它是如何在语句$data[clean($key)] = clean($value);中清理数据的。???任何帮助表示赞赏..我正在尝试解决这个问题,因为我是 PHP 新手。问候。

if (ini_get('magic_quotes_gpc')) {
function clean($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[clean($key)] = clean($value);
        }
    } else {
        $data = stripslashes($data);
    }

    return $data;
}           

$_GET = clean($_GET);
$_POST = clean($_POST);
$_REQUEST = clean($_REQUEST);
$_COOKIE = clean($_COOKIE);

}

4

4 回答 4

1

你的问题:

因此,如果我理解正确,您想知道该行中的功能是什么

 $data[clean($key)] = clean($value);

答案:

请参阅该函数的主要目的是使用 php 的stripslashes方法从字符串中删除斜杠。

如果输入项是一个数组,那么它会尝试通过在键和值上调用自身来清理数组的键以及数组的值。

在 php 中,数组就像哈希图,您可以使用foreach循环遍历键和值,如下所示

 foreach ($data as $key => $value) {....}

因此,如果您想在代码片段中总结算法,如下所示

  1. 检查输入是否为数组。如果不是,则转到步骤 4
  2. 对于数组的每个项目,通过调用其上的 clean 方法来清除键和值(递归)
  3. 返回数组
  4. 使用 stripslashes 方法 5 清理输入字符串返回清理后的输入
于 2012-05-25T07:09:57.907 回答
0

据我了解,它不是清理密钥,而是使用干净的密钥创建一个新元素,而未清理的密钥仍然存在。

$a['foo\bar'] : 值\ue

变成

$a['foo\bar'] : 值\ue

$a['foobar'] : 值

如果我错了,有人纠正我。

于 2012-05-25T07:11:30.233 回答
0

如果这样写,也许你会更好地理解代码:

foreach ($data as $key => $value) {
            $key = clean($key); // Clean the key, the
            $value = clean($value); // Clean the value
            $data[$key] = $value; // Put it in the array that will be returned
        }

假设你有一个这样的数组: $_POST = array(0 => 'foo', 1 => array('bar' => 'baz')); 将发生以下情况:

Call clean($_POST);
call clean 0
call clean 'foo'
$return[0] = 'foo'
call clean 1
call clean 'bar'
call clean 'baz'
$return[1] = array('bar' => 'baz');

您可能应该阅读以下内容:http: //www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

于 2012-05-25T07:14:09.873 回答
0

该函数的主要目的是清理关联数组单个变量。关联数组是一个数组,您可以在其中定义该键的键和值;PHP 中使用的特殊数组$_GET $_POST也是如此,等等。

“清理”的意思是检查魔术引号是否处于活动状态——当您将动态数据发布到 PHP 页面时,这会导致这些数组中的某些字符被反斜杠转义。 $_GET["Scarlett"] = "O' Hara"变成魔术引号$_GET["Scarlett"] = "O\' Hara"

因此,如果魔术引号处于活动状态,则该函数会处理此问题,并剥离斜杠,以便字符串保留其正确的值,而不是转义值。

该算法检查传递给函数的数据是否为数组,如果不是,则直接清除该值。

$string = "Escapes\'in\'a string";
clean($string);
  • 它是一个数组吗?不,然后返回stripslashes(我的数据)

    $array = array("key\'​​with\'escapes"=>"value\'with\'escapes", "另一个\'key"=>"另一个值"); 干净($数组)

  • 它是一个数组吗?是的。因此,使用 循环遍历每个键/值对foreach,获取键并像第一个示例一样清理它;然后取值并执行相同操作并将清理后的版本放入数组中。

如您所见,该函数有两种不同的行为,由“if”语句区分。如果您传递一个数组,则会激活第二个行为,该行为又会传递一对字符串,而不是数组,从而触发第一个行为。

不过,我的想法是这个功能不能正常工作。有没有人有同样的感觉?我还没有对其进行测试,但它似乎并没有在替换它们的意义上“清理”键/值,而是在未清理的版本中添加了清理后的版本。

于 2012-05-25T07:27:57.823 回答