我是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)
谢谢
发布于 2009-06-14 04:25:09
在使用带有外部输入值的extract时要非常小心,例如从$_GET和$_POST。
您最好手动将这些值提取为已知值。
对于从_GET或_POST提取的代码来说,要破坏现有的变量太容易了。
发布于 2009-06-14 04:45:56
有这么多话要说,乔纳森开了个好头。每当用户有机会使用您的内部数据,而您没有检查它们时,就会有一个巨大的“机会”(取决于视图。)有什么地方出了问题。这里是关于如何“也许”到达你想去的地方的另一种方法:
<?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检查每个用户提供的参数。
发布于 2009-06-14 06:17:15
要在代码中完全摆脱全局变量的使用,并使其在整体上变得更好,您可以按照以下方式进行操作:
下面是我想如何修改你的代码来改进它:
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数组之前对其进行处理。
https://stackoverflow.com/questions/992130
复制相似问题