【问题标题】:Is a single PHP file for processing multiple form submissions considered "bad form"? [closed]用于处理多个表单提交的单个 PHP 文件是否被视为“错误表单”? [关闭]
【发布时间】:2012-12-07 02:59:44
【问题描述】:

我正在开发一个小型网站(研究生课程的项目),我有一堆 html 表单来收集数据并将其传递到 MySQL 数据库。目前,每个表单(大多数存在于单独的页面上)调用不同的 php 文件作为表单操作。随着网站的发展,这变得有点混乱。拥有一个所有表单在提交时调用的单个 php 文件,然后在该 php 文件中使用 switch 语句来确定要执行的代码块是常见的还是可接受/推荐的方法?

如果是这样,我是否想在我的表单中使用隐藏的输入类型来指示要运行哪个 switch case,例如以我的形式:

<input type="hidden" name="my_case" value="add_user">

...

在我的 php 文件中:

switch($_POST['my_case']) {

case 'add_user':
   // do soemthing
   break;
case 'del_user':
   // do something
   break;
}

谢谢!

【问题讨论】:

  • 刚刚在侧边栏中看到了这个......这与我的问题相似,但我仍然想澄清一下这是否是处理事情的正确方法......Multiple forms and one PHP receiver跨度>

标签: php html forms


【解决方案1】:

我将牢牢抓住我的两分钱进入这个讨论。

使用单个表单处理程序取决于表单的相似程度/收集的数据的相似程度

如果您有许多或多或少相同的表单(相同的字段,相同的逻辑,只是细微的差异,例如谁通过电子邮件收到表单的每个实例的内容),那么只有一个处理程序可以处理所有这些表格是最好的方法。

如果您有许多表单,除了它们是表单这一事实之外没有任何(或很少)共同点,那么使用单个处理程序可能不是最佳选择。话虽如此,您可以根据相似性将表单分组为“系列”,然后为每个系列构建处理程序。 (即“发送电子邮件”系列、“文件上传”系列等)

当然,在维护方面,更少的文件是一个加分项,因为您需要查找的地方更少,但您不应该牺牲责任/功能的逻辑分离来努力将所有内容塞进一个单一的文件。

【讨论】:

    【解决方案2】:

    我认为没有任何标准的方法可以做到这一点。这完全取决于偏好。编写代码的美妙之处在于您可以创建解决方案,如果它适用于您正在做的事情,那么没关系。如果您稍后确定它需要返工,那么您可以。

    如果您的代码变得难以处理,您可以随时将其分解为单独的文件,然后在您的案例语句中调用 include("file_name.php") 来执行您需要的脚本..

    switch($_POST['my_case']) {
      case 'add_user':
        include("add_user.php");
        break;
      case 'del_user':
        include("del_user.php");
      break;
    }
    

    如果事情变得非常复杂,那么您可能会考虑类。在这种情况下,您可以拥有一个具有添加方法和删除方法的用户类,然后您将包含用户类,然后像这样使用它..

    $user = new User();
    
    $user->add();
    $user->delete();
    

    就像我说的,但这一切都取决于您的具体需求。找到适合您的方法并使用它。

    要回答隐藏输入,如果您必须使用 POST 方法,那么这将是必要的。您还可以使用 GET 并将某种指示符附加到表单 url 的查询部分。比如 ?action=add

    【讨论】:

    • 如果尚未添加用户,您是如何构建用户的?
    • 如果您阅读,我说您将包含用户类..这意味着我没有显示该代码..
    • 我的意思是说构造一个用户是没有意义的,如果要构造一个用户你需要执行一个add方法。在这种情况下,我不会让add 代码出现在用户的方法中,而是作为工厂的一部分。
    • 可能,但情况并非总是如此。您可以构造对象,调用其他方法来修改其数据,然后调用 add 方法,该方法可以负责将信息插入数据库.. 没有迹象表明 add 方法在这里做了什么.. 回到我原来的观点,这取决于你以你想要的方式设计你的代码。
    【解决方案3】:

    如今,您将实现所谓的 RESTful API。除了 POST,HTTP 还支持 DELETE、GET 和 PUT 方法。使用提交类型来确定您的代码应该执行什么操作。

    【讨论】:

      【解决方案4】:

      这样做会创建一个单一的入口点,其他程序员可以使用它来遵循程序逻辑。如果有 50 个 PHP 文件,每个文件都针对不同的表单或 AJAX 请求,无论它们的名称多么好,查看代码库的其他程序员将不知道它们的用途。像这样的单一入口点为您和其他程序员提供了更容易的可读性和可维护性。

      编辑: 让我明确一点,我不建议将所有代码都放在一个文件中。您可以拥有五十个 PHP 文件。但是在这个带有case语句的文件中,你可以有:

      switch($_POST['my_case']) {
      
          case 'add_user':
          include_once 'add_user_handler.php';
          // call function in add_user_handler.php to initiate execution
          break;
      
         case 'del_user':
         include_once 'del_user_handler.php';
         // call function in del_user_handler.php to initiate execution
         break;
      
         // And of course, good programming practice, use default
         default:
         exit("Unable to handle request");
         break;
      }
      

      【讨论】:

      • 我不同意因为这个原因应该这样做,因为这样你就会在一个文件中拥有大量不相关的代码。此外,如果应用程序使用面向对象的系统(我们都知道 OOP PHP 框架如今风靡一时),我认为您指定的面向动词的设计不会很好地工作。我认为体面的命名约定和目录结构可以减轻开发人员无法找到他们正在寻找的东西。
      • @WaleedKhan 我不建议将所有代码放在一个文件中,只是开始执行 PHP 脚本的 case 语句,它基于来自客户端的传入数据。可以在每个块中使用“include_once”来包含正确的文件,然后在该文件中调用所需的函数。
      【解决方案5】:

      好的,我从来没有读过这个,但在我的情况下,我通常不使用表单,我的意思是,我不使用经典按钮“提交”,而不是使用 ajax 我发送所有内容并通过事件,当用户单击图片(如按钮)或类似内容时。关键是,多亏了这个,我可以只使用一个控制器(这是你的问题)从一个部分发送不同的部分(比如它们是不同的形式)。我从来没有遇到过问题,真的这样你就可以很好地处理所有事情,因为你绑定了 CONTROLLER--VIEW--FORMS_OF_THIS_VIEW。这是管理所有信息的好方法,因为通常您有一个与问题(汽车、偏好、优惠、登录等)匹配的视图和控制器。通过这种方式,您可以轻松找到一切(控制器、视图、所有表单、进程)

      【讨论】:

      • 所以你打破语义,然后要求你的用户使用javascript提交数据?
      • 使用 ajax 时,您应该始终使用标准表单元素,然后使用 javascript 来增强功能。这样,如果用户禁用了 javascript,您的网站将正常降级并且仍然可以使用。
      • 我的回答是关于另一件事,而不是关于使用按钮或图片............但你给了我一个负面的观点(与控制器和多种形式无关) ......好吧,但我不同意。这个问题不是关于 javascript 或语义的,而是如何处理表单,如果这是您对我的个人意见的话它是完美的,但这个问题是关于一些不同的东西,我回答了它。
      猜你喜欢
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多