2010-01-06 110 views
0

是否有一个类可以处理$_REQUEST,使php开发人员的生活更轻松? 我想更轻松地处理客户端请求。 我不想用if(is_set($_REQUEST['blabla'])) {makesomthing();} 测试我希望可以有这样的解决方案。如何处理PHP中的请求

class rpclike 
{ 
public function getMember() 
{ 
    $memberid = $this->inputhandler['memberid']; 
    $member = $this->memberclass->getmember($memberid); 

    foreach($member as $mem) 
    { 
    echo $mem->id; 
    } 
} 

} 

$rpc = new rpclike(); 

那么,如果我从一个javascript调用rpclike这样

<a href="#" onclick="GETURL("rpclike.php?getMember&memberid=22")">Get member</a> 

哪些类可以做这样的事情?

+0

允许用户决定将要调用的内容将始终以灾难结束。 – Cfreak 2010-01-06 22:59:07

+0

我真的不能理解为什么这个问题是被拒绝投票,这是一个正常的问题。我认为没有理由倒票 – streetparade 2010-01-06 23:00:01

+0

我不喜欢它,因为它容易出现安全问题。你在该类中放置的任何功能都将暴露给网络。你可能是你项目的唯一开发人员,但其他人可能会看到这一点,并认为这是一个好主意,实施它,有人在他们的项目上工作可能不知道曝光并实施delete_user方法或类似的东西。 – Cfreak 2010-01-06 23:09:07

回答

1

PHP并没有真正具有默认的类结构,您可以以这种方式使用,因为它的起源是基于过程的编程。

如果你觉得有必要创建一个这样的类,那将是相当微不足道的。但是,你真的只是增加开销。如果它的便利性对你来说是值得的,那么你可以利用__get() and __set()方法来处理你的存在检查。

事实上,您希望以更容易的方式处理客户端请求,这可能是一个很好的指示器,您应该转移到类似于MVC框架的东西,该框架通常处理URL并将它们自动路由到适当的方法。大多数PHP框架都会为你做到这一点。想了解这个过程通常如何工作,你可以使用see how CodeIgniter does it

+0

谢谢你,你激励我使用从现在开始和最多的时间只是框架codelgniter,有一个愉快的夜晚 – streetparade 2010-01-06 23:21:13

0

我不这么认为。能够调用任意方法将是一个巨大的安全漏洞。

+0

当然,但如果(!$ this-> user-> isadmin()) 返回false,我会在做任何事之前先打电话; – streetparade 2010-01-06 22:58:01

+0

这不一定是关键。假设你的系统不安全(没有系统是100%安全的),并且有人设法欺骗管理员凭证,他们可能会执行任何操作。如果你自己做派遣,你至少可以限制这一点。 – Joe 2010-01-06 23:25:07

2

不建议您使用$_REQUEST,因为它会引起安全问题。您应该使用$_GET,$_POST$_COOKIE之一,具体取决于您尝试检索的全局请求变量。最好的办法是将有类似以下内容:

class input { 

    public static function get($key, $value = false) { 
     return (!empty($_GET[$key])) ? $_GET[$key] : $value; 
    } 

    public static function post($key, $value = false) { 
     return (!empty($_POST[$key])) ? $_POST[$key] : $value; 
    } 

    public static function cookie($key, $value = false) { 
     return (!empty($_COOKIE[$key])) ? $_COOKIE[$key] : $value; 
    } 

} 

然后,您可以使用类,如:

if (input::post('field', null) != null) { 

} 

if (input::get('field', false) != false) { 

} 

尽管这仍然需要测试,您可以在没有为全局变量设置数据的情况下显式设置返回值。

+0

不要忘记实施'get_magic_quotes_gpc()'解决方法。 – 2010-01-07 11:08:29

+0

非常真实,想到提起它......我只是习惯于让它自己关闭。 – 2010-01-07 13:59:41

-1

做这样的事情:

url: /foo/bar?req=getMembers&memberid=22 

然后,你可以这样做:

$request = $_GET['req']; 
$request(); 

略少于危险的版本:

$req_methods = array(
    getMembers => 'some_function', 
    saveMembers => 'another_function', 
    sendMessage => 'send_him_an_email' 
); 
$request = $_GET['req']; 
$req_methods[$request](); 
+0

这似乎只是有点冒险。例如,如果某人请求/ foo/bar之类的内容?req = apache_child_terminate或其他一些危险函数? – 2010-01-06 23:06:47

+0

增加了一点危险的版本。 – slebetman 2010-01-06 23:11:01

+0

我仍然建议用'isset($ req_methods [$ request])来包装后者' – 2010-01-06 23:17:20

1
从参与这一明显的安全隐患

除此之外,它是可行的。这是在MVC系统中用于转向请求的常见模式。

说你要求index.php?class = User & method = ViewProfile

$module = new $_GET['class'](); 
if(!method_exists($module,$_GET['method'])) 
$module->$eventName();