【问题标题】:I'm trying to understand PHP_SELF vs ProcessForm.php in the Action field of a <form>我试图在 <form> 的 Action 字段中了解 PHP_SELF 与 ProcessForm.php
【发布时间】:2015-08-21 02:01:17
【问题描述】:

我是开发 PHP 表单的新手,目前正在尝试了解和了解它们的处理方式。如果我理解正确的话,有两种方法可以使用“Action”属性。

方法 A:使用单独的 PHP 文件来处理表单。因此,在您的第一个文件 (Form.php) 中,您拥有表单和提交按钮的代码。然后在 ProcessForm.php 文件中,放置所有用于验证数据的代码。在这种情况下,您将表单定义为

<form  method="post" action="ProcessForm.php" >

方法 B:对所有内容使用一个 PHP 文件,包括表单代码、提交按钮和所有验证内容(包括在表单字段输入不正确时输出错误消息)。在这里,您将表单定义为

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

目前,我不明白其中一种方法是否更正确,或者为什么您会使用其中一种方法。

我看到一个表单有四个组件:表单的 HTML、连接到 MySQL 的 PHP、输入验证/清理/错误打印输出的 PHP,以及将数据移动到 MySQL 数据库的 PHP。我希望我的表单能够(在提交时)如下工作:

  1. 如果提交过程中出现一个或多个错误,请停留在同一页面上(停止提交过程)并显示相关错误消息,并且所有字段仍然填充(而不是空白)。
  2. 如果提交过程没有错误,将数据移入MySQL,然后显示“您的数据已成功提交”的空白页面和返回我主页的链接。

目前我正在使用方法 B,并且已经成功实现了上面的#1。但我还没有达到#2。所以在这个长篇故事之后,我的问题是:我应该把这四个组件放在哪里?在一两个文件中,为什么?

【问题讨论】:

    标签: php mysql forms validation


    【解决方案1】:

    这两种方法都不“更正确”;两者都一样有效,您选择的完全取决于您要实现的用户体验。您应该将四个组件放在哪里取决于您使用的是方法 A 还是 B。

    对于方法 A

    如果表单在一个页面上,并且您将通过 action="example.php" 属性将数据提交到另一个页面,则表单的 HTML 应该(显然)在第一页上,而其他所有内容都应该在第二个 (example.php) 页面上(所有 PHP 和 SQL)。如果出现验证错误,您可以使用header(Location: firstpage.php?error=something) 将用户返回到原始页面以修复错误。

    对于方法 B

    如果您在一个页面上做所有事情(通过输入action="&lt;?php echo $_SERVER["PHP_SELF"]; ?&gt;" 或简单地输入action="",两者都做完全相同的事情),您应该在用户在该页面上提交表单时进行验证,如果没有验证错误,将数据插入数据库并使用 PHP 的 header() 函数重定向用户。


    当您使用方法 B 时,这是我如何处理此类表单的更详细的分步过程。在示例中,firstpage.php 是用户开始的页面,secondpage.php 是如果所有信息都正确,用户将转到的页面。

    1. 向用户展示您的表单。
    2. 当用户提交表单时,数据通过 POST 或 GET 提交(取决于您是否希望通过 URL 访问此信息。如果您不确定,请使用 POST)到firstpage.php,其中以下 PHP 是:

    PHP:

    <?php
    if (isset($_POST['submit']) {
      // Some validation function
      if (do_validation()) {
        // Information is valid, insert into db
        header(Location: secondpage.php);
        die();
      }
      else {
        echo "Error; the information you submitted is not valid.";
      }
    }
    ?>
    
    1. 当用户以secondpage.php结束时,您可以告诉他们表单已成功提交。

    【讨论】:

    • 我目前正在使用方法B。在这种情况下,在哪里/什么时候回显“您的数据已成功提交”声明才有意义?在表单页面或我重定向到的主页上的某个地方? (不确定这是偏好问题还是有更合理的方法)
    • 它应该在您要重定向到的页面上;当验证成功并且他们的数据已记录在数据库中时,用户就会被带到那里。
    • 以这种方式使用 header() 函数是否需要输出缓冲?如果您已经在页面上使用了标题,我认为您无法进行重定向。我对这个特定主题的了解几乎为零。
    • manual 中详述,header() 函数有两个要求: 在任何输出之前使用该函数,这意味着您必须将 PHP 放在页面顶部,在&lt;!DOCTYPE html&gt;,并且您使用 die() 来阻止脚本的其余部分运行,而单独的 header() 实际上并没有这样做。但是如果你做了这两件事,你不应该在使用header()时遇到任何问题。
    【解决方案2】:

    如果您发布到生成表单本身的脚本,那么您甚至不需要任何操作。所以方法3是:

    <form method="post">
    

    这是最好的版本,因为它不会中断,并且清楚地表明一个脚本呈现和处理表单的帖子。

    您的其他方法都不是理想的。真的,你应该看看(Smarty 或类似的东西)让你模板化 HTML 并将显示与逻辑分开。话虽如此,选项 1 和 2 都是完全可以接受的 - 如果您选择不使用上面的(高级)选项 3。

    【讨论】:

      【解决方案3】:

      我不能谈论“最佳实践”,但在您提到的 4 个“组件”中,我认为缺少的关键项也是客户端验证(通常是 javascript)。这为您节省了处理表单的“往返”开销,该表单在提交到服务器进行处理之前可能已经过验证。

      话虽如此(因为这是我使用的方法),您将合并一些 javascript,所以我所做的是使用 javascript “在提交时”验证我的字段(我用 javascript 覆盖表单的默认提交事件处理程序),然后,如果它验证,则执行提交。我使用 ajax 执行此操作,或者您可以使用标准 javascript 提交表单。您甚至可以使用 javascript 来动态设置“action”属性(假设您需要 - 请参阅 @Paul 的推理为什么您可能不需要)。

      它提交的 php 文件通常执行 0 演示工作。它连接到数据库,保存“发布”信息,关闭连接,并返回一个状态(这通常是我喜欢 ajax 的原因,因为它更容易处理该状态响应)。根据状态响应,您可以显示错误消息(如警报、引导模式或信息警报等)或成功消息/重定向。

      虽然我的回答没有提供代码,但我认为上述方法会根据您的问题为您提供更好的服务。一旦您了解了要采取的步骤,“如何做”就很容易了。

      【讨论】:

      • 这是很有趣的信息,虽然我认为这有点超出我的技能水平。我对 JS 的了解仅限于可汗学院的 JS 课程所学,Ajax 还没有学过。
      • 它实际上是非常基本的东西,你可以在一两晚内学会(W3 Schools 是一个很好的网站,有例子)。为什么我认为这是最好的方法是你会让人们将“POST”的方法发布到一个单独的 PHP 文件中,但是如果有错误,你将不得不返回到前一个表单页面。你猜怎么了?用户输入表单数据的所有辛勤工作都丢失了!用户大爱!特别是在长表单上,或具有大型 textarea 类型字段的表单上。可以“重新加载”吗?当然......但是这样做的代码量......不如第一次用JS做! :)
      • 事实上,我一直在使用 W3 Schools 教程来完成所有这些工作 (w3schools.com/php/php_form_validation.asp)。我已经使用他们的方法设置了我的页面,以返回各个字段的错误消息(因为我表单上的所有字段都是必需的)。
      猜你喜欢
      • 1970-01-01
      • 2019-09-22
      • 2023-02-16
      • 2010-10-18
      • 2012-01-13
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多