web-dev-qa-db-ja.com

URLでPOSTパラメータを渡す方法は?

基本的に、私はできないと思いますが、間違っていると証明されることは非常にうれしいです。

PHPでHTMLメニューを動的に生成し、現在のユーザーごとに1つのアイテムを追加し、<a href="process_user.php?user=<user>>のようなものを取得しますが、GETよりもPOSTを優先します。

クリック可能なHREFリンクからGETするのではなく、POSTパラメーターとして情報を渡す方法はありますか?


更新:申し訳ありませんが、JSの使用は許可されていません。


更新の更新:@Robが「アンカーの代わりにボタンを使用し、ボタンをリンクのようにスタイルするだけで、同じフォーム内の非表示フィールドに値を設定できます。 POST経由で送信されます」

36
Mawg

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/

44
Petah

URLのパラメーターはGETパラメーターであり、要求本文が存在する場合、POSTデータです。したがって、基本的な前提は定義上、達成不可能です。

アクションに基づいて、POSTを使用するか、GETを使用するかを選択する必要があります。 破壊的アクション、つまりサーバーの状態を永続的に変更(削除、追加、編集)するものは、常にPOSTリクエストによって呼び出される必要があります。純粋な「情報検索」は、不変のURL(つまりGETリクエスト)を介してアクセスできる必要があります。

POSTリクエストを作成するには、<form>を作成する必要があります。 could代わりにPOSTリクエストを作成するためにJavascriptを使用しますが、Javascriptを基本的なものに使用することはお勧めしません。送信ボタンをリンクのように見せたい場合は、通常の送信ボタンを使用して通常のフォームを作成し、CSSを使用してボタンのスタイルを変更するか、Javascriptを使用してボタンをフォームを送信するリンクに置き換えることをお勧めしますJavascriptを使用する(目的の動作をより良く再現するものに応じて)。 プログレッシブエンハンスメントの良い例でしょう。

13
deceze

リンクがクリックされると、リンクに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>
11
Rob

私の実装も共有したいと思います。ただし、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のパラメーターを表示しないことです。これはより安全です。

7
Aris

いいえ、できません。 POSTの定義を読むことをお勧めします: http://en.wikipedia.org/wiki/POST_%28HTTP%29

またはこのページ: http://en.wikipedia.org/wiki/GET_%28HTTP%29#Request_methods

5
zzarbi

まず、免責事項: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パラメーターを$ _GET変数に保存し、フォームデータを$ _POST変数に保存することがはっきりとわかります。ただし、これは非常にPHPおよびサーバー固有のものであり、間違いなく依存するものではないでしょう。

5
raiks

これは、phpスクリプトが非表示フィールドを持つ各エントリのフォームを生成し、hrefがjavascriptを使用してフォームをポストする場合に機能します。

2
tofutim