Как передать параметры POST в URL? - PullRequest
36 голосов
/ 02 июня 2011

В принципе, я думаю, что я не могу, но был бы очень рад оказаться неправым.

Я генерирую HTML-меню динамически на PHP, добавляя по одному элементу для каждого текущего пользователя, так что я получаю что-то вроде <a href="process_user.php?user=<user>>, но у меня есть предпочтение POST, а не GET.

Есть ли способ передать информацию в виде параметра POST, а не GET из кликабельной ссылки HREF?


Обновление: извините, мне не разрешено использовать JS - я должен сказать, мой плохой


Обновление до обновления: похоже, что @Rob находится в каком-то значении с «Вы можете использовать кнопку вместо привязки и просто стилизовать кнопку, чтобы она выглядела как ссылка. Таким образом, вы можете хранить свои значения в скрытых полях внутри». ту же форму для отправки по почте "

Ответы [ 7 ]

42 голосов
/ 02 июня 2011

Вы можете использовать форму в виде ссылки, 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/

13 голосов
/ 02 июня 2011

Параметры в URL - это параметры GET, а тело запроса, если оно есть, - это данные POST. Так что ваша основная предпосылка по определению недостижима.

Вы должны выбрать, использовать ли POST или GET в зависимости от действия. Любое разрушительное действие, то есть то, что постоянно изменяет состояние сервера (удаление, добавление, редактирование), всегда должно вызываться запросами POST. Любой чистый «поиск информации» должен быть доступен через неизменяемый URL (т.е. запросы GET).

Чтобы сделать запрос POST, вам нужно создать <form>. Вы могли бы использовать Javascript для создания запроса POST, но я бы не советовал использовать Javascript для чего-то такого базового. Если вы хотите, чтобы ваша кнопка отправки выглядела как ссылка, я бы посоветовал вам создать нормальную форму с обычной кнопкой отправки, затем использовать CSS для изменения стиля кнопки и / или использовать Javascript для замены кнопки ссылкой, которая отправляет форму использование Javascript (в зависимости от того, что лучше воспроизводит желаемое поведение). Это был бы хороший пример прогрессивного улучшения .

11 голосов
/ 02 июня 2011

Вы можете сделать так, чтобы ссылка выполняла пост-запрос ajax при нажатии.

В jQuery:

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

Вы также можете сделать ссылку, отправив POST-форму с javascript

<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>
7 голосов
/ 25 февраля 2013

Я также хотел бы поделиться своей реализацией. Это требует некоторого 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, что безопаснее.

5 голосов
/ 25 марта 2016

Прежде всего, отказ от ответственности: я не думаю, что объединение 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 голосов
/ 02 июня 2011

Нет, вы не можете этого сделать.Я предлагаю вам прочитать определение POST: http://en.wikipedia.org/wiki/POST_%28HTTP%29

или эту страницу: http://en.wikipedia.org/wiki/GET_%28HTTP%29#Request_methods

2 голосов
/ 02 июня 2011

Это может сработать, если скрипт php генерирует форму для каждой записи со скрытыми полями, а href использует javascript для публикации формы.

...