【问题标题】:How do I make a PHP form that submits to self?如何制作提交给自己的 PHP 表单?
【发布时间】:2011-08-15 04:03:26
【问题描述】:

如何制作自发布/自提交表单,即向自身提交结果而不是提交到另一个表单的表单?

【问题讨论】:

  • 您也可以关闭该操作,默认为当前页面。
  • @Marvo 有一个旧错误可能与今天的 WebKit 不太相关。见my answer

标签: php html forms


【解决方案1】:

正确的方法是使用$_SERVER["PHP_SELF"](与htmlspecialchars结合使用以避免可能的漏洞利用)。您也可以跳过 action= 部分为空,这不是 W3C 有效的,但目前在大多数(所有?)浏览器中都可以使用 - 如果它是空的,默认是提交给 self。

这是一个示例表单,它采用姓名和电子邮件,然后显示您在提交时输入的值:

<?php if (!empty($_POST)): ?>
    Welcome, <?php echo htmlspecialchars($_POST["name"]); ?>!<br>
    Your email is <?php echo htmlspecialchars($_POST["email"]); ?>.<br>
<?php else: ?>
    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
        Name: <input type="text" name="name"><br>
        Email: <input type="text" name="email"><br>
        <input type="submit">
    </form>
<?php endif; ?>

【讨论】:

  • 将操作值留空不是 W3C 有效的。只是要注意。不过效果很好。
  • 你是怎么做到的,它只运行Welcome, &lt;?php echo htmlspecialchars($_POST["name"]); ?&gt;!&lt;br&gt; Your email is &lt;?php echo htmlspecialchars($_POST["email"]); ?&gt;.&lt;br&gt; 而不是echo 那样运行?
  • 那我们这里应该用什么?
  • 这里只是一个警告,PHP_SELF 并不总是有效 - 我刚刚发现了这一点,因为我有一个与 Joomla 一起使用的表单 - 当我打开 URL 重写时,这个 PHP_SELF 打破了根据 Joomla PHP_SELF 的形式是“/index.php”(网站主页)而不是“/contact-us”。我猜那是因为 index.php 正在调用它,我想某处有一些变量包含整个重写的 URL?
  • 刚刚发现 $_SERVER('REQUEST_URI') 工作得更好,即使它已被重写,实际上也能获取 url。
【解决方案2】:

我猜,你的意思是$_SERVER['PHP_SELF']。如果是这样,你真的不应该在没有先消毒的情况下使用它。这使您容易受到 XSS 攻击。

if(isset($_POST['submit'])) 条件应该高于所有 HTML 输出,并且应该包含一个 header() 函数并再次重定向到当前页面(只是现在,有一些很好的通知,“电子邮件已发送”.. 或其他东西)。为此,您必须使用 $_SESSION$_COOKIE

请。停止使用$_REQUEST。它也构成了安全威胁。

【讨论】:

    【解决方案3】:

    只有在register_globals 开启时才有效,并且它永远不应开启(当然,除非您在其他地方定义该变量)。

    尝试将formaction 属性设置为?...

    <form method="post" action="?">
       ...
    </form>
    

    您也可以将其设置为空白 (""),但较旧的 WebKit 版本具有 bug

    【讨论】:

    • @Damian 我不喜欢滥用片段标识符。
    【解决方案4】:

    试试这个

    &lt;form method="post" id="reg" name="reg" action="&lt;?php echo htmlspecialchars($_SERVER['PHP_SELF']);?&gt;"

    效果很好:)

    【讨论】:

      【解决方案5】:

      您的提交按钮没有名称。将 name="submit" 添加到您的提交按钮。

      如果您在浏览器中查看表单的源代码,您将看到它如何提交给自己——表单的 action 属性将包含当前脚本的名称——因此,当表单提交时,它会提交给自己。为虚荣而编辑!

      【讨论】:

      • 实际上不鼓励为提交按钮添加名称,因为它们一开始并没有提交到服务器,并且在 JavaScript 中按名称访问表单也已被弃用。
      • @minitech 我以为name属性已经提交到服务器了?
      • 当你没有正确的回应时不要投反对票。按钮肯定是在回发中提交的。去测试吧!
      【解决方案6】:
      1. 更改
        &lt;input type="submit" value="Submit" /&gt;

        &lt;input type="submit" value="Submit" name='submit'/&gt;

      2. 更改
        &lt;form method="post" action="&lt;?php echo $PHP_SELF;?&gt;"&gt;

        &lt;form method="post" action=""&gt;

      3. 只有在提交时才会执行if中的代码。
      4. 它将始终显示表单(html 代码)。
      5. 您的问题到底是什么?

      【讨论】:

      • 实际上不鼓励为提交按钮添加名称,因为它们一开始并没有提交到服务器,并且在 JavaScript 中按名称访问表单也已被弃用。
      • @minitech ?我实际上看到了输入类型=提交的提交值。你是怎么做的,所以它在你的系统上被弃用了?
      • @minitech 它在哪里说不推荐按名称访问表单?你的意思是旧的forms.one.submit
      • 是的,我就是这个意思。 @Itay Moav 我错过了帖子 1 中的 PHP 代码,您可以编辑您的帖子以便我再次投票支持您吗?
      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 2017-01-12
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多