首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用extract

使用extract
EN

Stack Overflow用户
提问于 2009-06-14 04:02:54
回答 3查看 207关注 0票数 0

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

代码语言:javascript
复制
    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,但我不确定如何构造它。

代码语言:javascript
复制
    function CatchListing() {
    $_POST['listing'] = array_map('mysql_real_escape_string', $_POST);
    $nst = extract($_POST['listing']);
}

(列出的是表单名称btw)

谢谢

EN

回答 3

Stack Overflow用户

发布于 2009-06-14 04:25:09

在使用带有外部输入值的extract时要非常小心,例如从$_GET和$_POST。

您最好手动将这些值提取为已知值。

对于从_GET或_POST提取的代码来说,要破坏现有的变量太容易了。

票数 1
EN

Stack Overflow用户

发布于 2009-06-14 04:45:56

有这么多话要说,乔纳森开了个好头。每当用户有机会使用您的内部数据,而您没有检查它们时,就会有一个巨大的“机会”(取决于视图。)有什么地方出了问题。这里是关于如何“也许”到达你想去的地方的另一种方法:

代码语言:javascript
复制
<?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检查每个用户提供的参数。

票数 0
EN

Stack Overflow用户

发布于 2009-06-14 06:17:15

要在代码中完全摆脱全局变量的使用,并使其在整体上变得更好,您可以按照以下方式进行操作:

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

下面是我想如何修改你的代码来改进它:

代码语言:javascript
复制
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数组之前对其进行处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/992130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档