如何制作提交给自己的 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, <?php echo htmlspecialchars($_POST["name"]); ?>!<br> Your email is <?php echo htmlspecialchars($_POST["email"]); ?>.<br>
而不是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
开启时才有效,并且它永远不应开启(当然,除非您在其他地方定义该变量)。
尝试将form
的action
属性设置为?
...
<form method="post" action="?">
...
</form>
您也可以将其设置为空白 (""
),但较旧的 WebKit 版本具有 bug。
【讨论】:
@Damian 我不喜欢滥用片段标识符。【参考方案4】:试试这个
<form method="post" id="reg" name="reg" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"
效果很好:)
【讨论】:
【参考方案5】:您的提交按钮没有名称。将 name="submit" 添加到您的提交按钮。
如果您在浏览器中查看表单的源代码,您将看到它如何提交给自己——表单的 action 属性将包含当前脚本的名称——因此,当表单提交时,它会提交给自己。为虚荣而编辑!
【讨论】:
实际上不鼓励为提交按钮添加名称,因为它们一开始并没有提交到服务器,并且在 javascript 中按名称访问表单也已被弃用。 @minitech 我以为name
属性已经提交到服务器了?
当你没有正确的回应时不要投反对票。按钮肯定是在回发中提交的。去测试吧!【参考方案6】:
更改<input type="submit" value="Submit" />
致<input type="submit" value="Submit" name='submit'/>
更改<form method="post" action="<?php echo $PHP_SELF;?>">
致<form method="post" action="">
if
中的代码。
它将始终显示表单(html 代码)。
您的问题到底是什么?
【讨论】:
实际上不鼓励为提交按钮添加名称,因为它们一开始并没有提交到服务器,并且在 JavaScript 中按名称访问表单也已被弃用。 @minitech ?我实际上看到了输入类型=提交的提交值。你是怎么做的,所以它在你的系统上被弃用了? @minitech 它在哪里说不推荐按名称访问表单?你的意思是旧的forms.one.submit
?
是的,我就是这个意思。 @Itay Moav 我错过了帖子 1 中的 PHP 代码,您可以编辑您的帖子以便我再次投票支持您吗?以上是关于如何制作提交给自己的 PHP 表单?的主要内容,如果未能解决你的问题,请参考以下文章