PHP表单动作PHP自身

29

我有一个像这样的 PHP 表单。

<form name="form1" id="mainForm" method="post"enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>">

</form

在表单操作中,我想使用带参数的页面名称,例如house.php?p_id=10111。但是$_SERVER['PHP_SELF']只提供house.php(我的页面完整URL类似于house.php?p_id=10111)。请帮助我解决这个问题。谢谢。


1
这不是完整的URL,而是URL + GET参数。 - Alex Ackerman
1
@Alex Ackerman:这是路径(http://tools.ietf.org/html/rfc3986#section-3.3)加上查询(http://tools.ietf.org/html/rfc3986#section-3.4)。 - Gumbo
3
好的,我会尽力以通俗易懂的方式翻译。以下是需要翻译的内容:yes. Alex is correct. I'm now using $_SERVER['PHP_SELF']."?P_id=".$id是的,Alex是正确的。我现在正在使用$_SERVER['PHP_SELF']."?P_id=".$id - Sasindu H
4
混合使用POST和GET参数是不良的实践。如果您正在进行POST请求,请使用隐藏表单字段来传递任何“GET”类型的值。 - Marc B
@TecBrat,许多网站都这样做并不意味着这不是一个不好的做法。假设一个服务器仅根据请求的类型传递get或post参数,那么有人会想不通为什么他们的脚本出了问题。 - 3ocene
显示剩余2条评论
8个回答

80

如果空着不填,有什么问题吗?

<form name="form1" id="mainForm" method="post" enctype="multipart/form-data" action="">

</form>

另外,您可以省略 action 属性,它将按预期工作。


1
谢谢这个。我认为这是最简单和最好的方法。 - Sasindu H
14
如果留空,将会违反W3C验证标准(如果您关心的话)。 - gadlol
11
是的,在HTML5中,你可以完全省略空的 action="" 属性。这样做可以通过验证并按预期工作。 - Shef
@Shef 在同一页使用post方法是不好的实践。当刷新页面时,浏览器会始终发出警报。 - Avnish Tiwary
3
无论提交是在不同的页面还是同一个页面,当有人刷新页面后,浏览器都会始终发出警报。 - Shef
@Avnishalok 这就是 PRG 的用途。 - Chad

15

你可以将action留空或使用以下代码:

<form name="form1" id="mainForm" method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI'];?>">
</form>

9
留空操作值会导致表单提交到自身。

6

您可以使用echo快捷方式来代替手动键入"echo blah;",如下所示:

<form method="POST" action="<?=($_SERVER['PHP_SELF'])?>">

2
这可能导致XSS攻击,您需要过滤/清理PHP_SELF。 - Chad

4
这很完美。试试这个吧 :)
<form name="test" method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>">
/* Html Input Fields */
</form>  

2
这可能导致XSS攻击,您需要过滤/清理PHP_SELF。 - Chad

2

另一种(我认为更合适的)方法是使用__FILE__常量,如果你不喜欢依赖于$_SERVER变量。

$parts = explode(DIRECTORY_SEPARATOR, __FILE__);
$fileName = end($parts);
echo $fileName;

关于魔术方法和预定义常量:12


1

最简单的方法是将 action="" 或完全省略表单标签中的 action 属性,但这是不好的做法(如果您在意的话)。

如果您在意,最好的做法是:

<form name="form1" id="mainForm" method="post" enctype="multipart/form-data" action="<?php echo($_SERVER['PHP_SELF'] . http_build_query($_GET));?>">

使用它的最好之处在于即使是数组也会被转换,因此无需为任何类型的数据做其他处理。

0
如果您想要保证安全,请使用以下代码:<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接