我是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)
由于
答案 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)
要完全摆脱代码中全局变量的使用,并且为了使整体变得更好,你可以按照这些方式做点什么:
以下是我认为我会修改您的代码以改进它的方式:
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数组。