如何在URL中传递POST参数?

时间:2011-06-02 05:45:28

标签: php http http-post http-get

基本上,我认为我不能,但很高兴被证明是错误的。

我在PHP中动态生成一个HTML菜单,为每个当前用户添加一个项目,这样我得到<a href="process_user.php?user=<user>>之类的内容,但我更喜欢POST而不是GET。

有没有办法将信息作为POST参数传递,而不是通过可点击的HREF链接传递?


更新:对不起,我不允许使用JS - 我应该说,我的不好


更新到更新:看起来@Rob正在使用“你可以使用按钮而不是锚点,只需将按钮设置为看起来像链接。这样你就可以在隐藏的字段中设置你的值通过POST发送相同的表格“

7 个答案:

答案 0 :(得分:41)

您可以使用样式为链接的表单,不需要JavaScript:

<form action="/do/stuff.php" method="post">
    <input type="hidden" name="user_id" value="123" />
    <button>Go to user 123</button>
</form>

CSS:

button {
    border: 0;
    padding: 0;
    display: inline;
    background: none;
    text-decoration: underline;
    color: blue;
}
button:hover {
    cursor: pointer;
}

请参阅:http://jsfiddle.net/SkQRN/

答案 1 :(得分:12)

URL中的参数是GET参数,请求体(如果存在)是POST数据。因此,根据定义,您的基本前提是无法实现的。

您应该根据操作选择是使用POST还是GET。任何破坏性操作,即永久更改服务器状态(删除,添加,编辑)的操作应始终由POST请求调用。任何纯粹的“信息检索”都应该通过一个不变的URL(即GET请求)来访问。

要发出POST请求,您需要创建<form>。您可以使用Javascript来创建POST请求,但我不建议使用Javascript来实现这么基本的东西。如果你想让你的提交按钮看起来像一个链接,我建议你使用普通的提交按钮创建一个普通的表单,然后使用CSS重新设置按钮和/或使用Javascript替换按钮以提交表单的链接使用Javascript(取决于更好地再现所需的行为)。这是渐进增强的一个很好的例子。

答案 2 :(得分:11)

点击后,您可以让链接执行ajax发布请求。

在jQuery中:

$('a').click(function(e) {
   var $this = $(this);
   e.preventDefault();
   $.post('url', {'user': 'something', 'foo': 'bar'}, function() {
       window.location = $this.attr('href');
   });
});

您还可以使用javascript

为该链接提交POST表单
<form action="url" method="post">
   <input type="hidden" name="user" value="soemthing" />
   <a href="#">CLick</a>
</form>
<script>
$('a').click(function(e) {
   e.preventDefault();
   $(this).parents('form').submit();
});
</script>

答案 3 :(得分:7)

我也想分享我的实施。它确实需要一些javascript。

<form action="./index.php" id="homePage" method="post" style="display: none;">
<input type="hidden" name="action" value="homePage" />
</form>
<a href="javascript:;" onclick="javascript:
document.getElementById('homePage').submit()">Home</a>

关于这一点的好处是,与GET请求相反,它不会显示URL上的参数,这样更安全。

答案 4 :(得分:5)

不,你不能那样做。 我邀请您阅读POST定义:http://en.wikipedia.org/wiki/POST_%28HTTP%29

或此页:http://en.wikipedia.org/wiki/GET_%28HTTP%29#Request_methods

答案 5 :(得分:5)

首先,免责声明:我不认为将POST与URL参数结合是个好主意。像其他人建议的那样,最好使用隐藏的表单来传递用户信息。

然而,一个问题让我很好奇PHP如何处理这种情况。事实证明,这在理论上是可能的。这是一个证据:

<强> post_url_params.html

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <form method="post" action="post_url_params.php?key1=value1">
            <input type="hidden" name="key2" value="value2">
            <input type="hidden" name="key3" value="value3">
            <input type="submit" value="click me">
        </form>
    </body>
</html>

<强> post_url_params.php

<?php
    print_r($_POST);
    print_r($_GET);
    echo $_SERVER['REQUEST_METHOD'];
?>

<强>输出

Array ( [key2] => value2 [key3] => value3 ) 
Array ( [key1] => value1 ) 
POST

可以清楚地看到PHP将URL params存储在$ _GET变量中,并在$ _POST变量中形成数据。我怀疑它非常适合PHP和服务器,并且绝对不是一件可以依赖的东西。

答案 6 :(得分:2)

如果php脚本为每个带有隐藏字段的条目生成一个表单,并且href使用javascript发布表单,这可能会有效。