使用提取物

时间:2009-06-14 04:02:54

标签: php

我是OOP的新手,想要修改此函数以摆脱使用全局变量。

    function CatchListing() {

    $parseform = array('itemnum','msrp','edprice','itemtype','box','box2','box25','box3','box4','box5','box6','box7','itemcolor','link'); 

    foreach ($parseform as $globalName) {
        $GLOBALS[$globalName] = mysql_real_escape_string($_POST[$globalName]);
    }


}

我被告知要使用array_map&然后是extact,但我不确定如何构建它。

    function CatchListing() {
    $_POST['listing'] = array_map('mysql_real_escape_string', $_POST);
    $nst = extract($_POST['listing']);
}

(列表是表格名称btw)

由于

3 个答案:

答案 0 :(得分:1)

使用带有外部输入值的提取非常小心,如$ _GET和$ _POST。

最好不要手动将值提取到已知值。

从_GET或_POST提取来破坏现有变量太容易了。

答案 1 :(得分:0)

有很多话要说,Jonathan开了个好头。每次用户有机会使用您的内部数据并且您没有检查它们时,就会出现一个巨大的“机会”(取决于视图......)。以下是关于如何“或许”到达目的地的另一种方法:

<?php

function Sanitize($string){
  return mysql_real_escape_string(trim($string));
}

function CatchListing(){  
  foreach($_POST as $key => $value) {
    $key = Sanitize($key);
    $value = Sanitize($value);
    if($key && $value && !$GLOBALS[$key]){ /* prevent overwriting existing globals*/
      $GLOBALS[$key] = $value;
    }
  }
}

global $nice;
$nice = "working";

CatchListing();    

print_r($GLOBALS);

?>

说实话,它仍然与OOP没有任何关系,而且应该被视为程序方法。我个人会使用一个额外的和可重复使用的函数来“清理”输入,因为你永远不知道,如果有一天你想要更改你的数据库或“转义”功能,然后你确切知道在哪里寻找可能的变化。还有一件事:你确定你不知道你所期望的所有变量的所有可能名称吗?也许您可以预先确定它们并将它们放在另一个数组中,并使用in_array检查每个用户提供的参数。

答案 2 :(得分:0)

要完全摆脱代码中全局变量的使用,并且为了使整体变得更好,你可以按照这些方式做点什么:

  • 停止使用$ _POST,因为它是一个超全局。当代码需要来自superglobals的值时,将它们作为参数传递
  • 不要将值存储到$ GLOBALS中。如果需要返回多个值,请考虑返回一个对象或数组

以下是我认为我会修改您的代码以改进它的方式:

function CatchListings($listings) {    
    $filteredListings = array_map('mysql_real_escape_string', $listings);

    //I assume you only need the values in the array in the original snippet,
    //so we need to grab them from the parameter array and return only that
    $requiredListings = array();
    $requiredKeys = array('itemnum','msrp','edprice','itemtype','box','box2','box25','box3','box4','box5','box6','box7','itemcolor','link');
    foreach($requiredKeys as $key) {
        $requiredListings[$key] = $filteredListings[$key];
    }

    return $requiredListings;
}

要使用此功能,只需执行$result = CatchListings($_POST);即可。相同的结果,没有使用全局变量。

但有一件事需要考虑。将一个随机填充的数组(即。$ _POST)传递给函数可能不是最好的形式,并期望它包含特定的键(即$ requiredKeys数组)。您可能希望添加逻辑以检查缺失的密钥,或者在传递之前处理post数组。