一个文件来统治它们

时间:2014-02-11 09:16:40

标签: php html

假设我的网站上有大约10个表单,我想用一个php文件(submit.php)处理他们的数据。所以我的所有形式都是action="./submit.php"

今天我在提交表单时使用GET来调用该php文件中的不同函数,例如action="./submit.php?func=user"。这样,submit.php就知道提交了什么表单。当然,表单使用POST作为方法。

这是一个糟糕的方式吗?我应该为每个表单都有一个.php文件吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

复杂度:

真的很快就会变得毛茸茸 - 形式越多,就越有趣。

这就是为什么大多数框架每个类使用一个文件以及为什么大多数框架提供表单类来构建/验证/处理表单的原因。

它显然增加了文件夹结构的复杂性和文件数量。它有时只为常规目的生成文件 - 例如一个只包含一个空的新类的文件,该类扩展了其他类。

这是“漂亮而干净的结构”的最高价格。它是可读的,它是标准化的(ish),对于其他开发人员来说很常见且很熟悉。

安全性:

如果您允许代码根据用户提供的数据运行任何功能,则可能存在安全漏洞。如果您还从用户提供的数据中获取参数,那么您基本上就是提供一个打开的不安全的RPC服务器。

我可以运行?func=unlink&param[0]=/etc/apache2/sites-available/default繁荣,下次重启时你的服务器会停机。

如果您在$_GET['func']中检查允许功能的受限列表中的功能名称,例如检查in_array($_GET['func'], array('functionOne', 'functionTwo'))。那你就安全了。

维护:

日复一日地工作MVC可能会扭曲人们对“必要”的看法。我要说你学习MVC并编写20个文件来完成你用这个文件完成同样的事情是“必要的”。

另一方面,我已经在各种遗留项目中找到了你的确切位置,我说过“meh,MVC并不总是必要的,我只是补丁并修复这个东西,因为它现在更快” 。我做了,我修补并修复了20到30次,直到第一次编写20个文件的整个过程看起来不那么多。

因此,在维护规模上,MVC是一项重大的初始投资,每当您重新访问该项目时,其投资回报率都会很高。

答案:

在我看来,结构有所帮助,将表单分成多个文件。即使您将请求提交到“submit.php”,“submit.php”也会根据$_GET参数为每个表单提供相应的文件。

此外,使用类和多态。这将根据您尝试使用的类自动包含文件(请参阅__autoload()和自动加载标准PSR-1PSR-4

使用多态性,您的“submit.php”可能看起来像下面这样简单:

// submit.php

/* some bootstrapping code you use to get your project settings up and running */
require_once('../bootstrap.php'); 

if(!empty($_GET['form']) and !empty($_GET['params'])) {
    $formClass = $_GET['form'];
    $params = $_GET['params'];
    if(class_exists($formClass) and is_subclass_of($formclass, 'FormInterface')) {
        $form = new $formClass;
        if($errors = $form->validate($params)) {
            $message = $form->process($params);
            if($message === '') {
                echo($message);
            }
        }
        else {
            echo('<ul class="errors">');
            foreach($errors as $error) {
                echo('<li>'.$error.'</li>');
            }
            echo('</ul>');

            /* reprinting the form to allow the user to try again */
            echo $form->toHtml();
        }
    }
    else {
        /* hack attempt? */
        echo("The form you are submitting doesn't exist");
    }
}

您不知道(或需要知道)哪个班级$formClass。自动加载器知道该类应该在哪个文件夹中以及它应该具有什么文件名。在自动加载器提供后,您可以开始使用它来检查该类是否实现了FormInterface接口的所有功能,如果确实如此,那么继续使用它并尝试使用它来验证表单是安全的那个班。

答案 1 :(得分:2)

帕特里克!

为了区分表单,您应该尝试添加类似命名空间的内容。 在您的HTML中,您将有类似的内容:

  

&lt; form action =“/ submit.php”method =“POST”name =“myform1”&gt;

     &lt; input type =“text”name =“myform1 [my_super_cool_text]”/&gt;

  或
     &lt; input type =“text”name =“myform1 []”/&gt;
  &LT; /形式&GT;

对于该页面上的每个表单,

等等。

在PHP中,您将按照以下名称检索每个表单:

  

&LT; PHP     $ myForm1 = $ _POST ['myform1'];    ....

就是这样。

希望它有所帮助,
丹尼斯雷德勒