如何制作提交给自己的 PHP 表单?

Posted

技术标签:

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

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

【问题讨论】:

您也可以关闭该操作,默认为当前页面。 @Marvo 有一个旧错误可能与今天的 WebKit 不太相关。见my answer。 【参考方案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】:

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

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

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

【讨论】:

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

以上是关于如何制作提交给自己的 PHP 表单?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 如何在任何表单提交上运行您自己的函数。

php 在自己本身的页面如何防止重复提交的

如何在wordpress中向自己提交表单

在DW中制作一个表单后如何使表单内容提交到指定页面?

在文章中提交 PHP 表单时出现 Joomla 2.5 404 错误

在自己的页面上提交 HTML 表单