как передать переменную POST по ссылкам на собственные страницы? - PullRequest
5 голосов
/ 31 июля 2011

Привет, я хочу получить переменную $ _POST по ссылке на собственные страницы.Пример:

<?PHP
$var = 'PIG';
echo "<a href='test.php?var=$var'>link</a>";

if (isset($_POST['var']))
{
echo $_POST['var']);
}


?>

это ссылки на собственные страницы.(test.php) Это не работает, кто может мне помочь, пожалуйста.Спасибо

Ответы [ 5 ]

4 голосов
/ 31 июля 2011

Ссылка не может POST данные, только GET.

В отличие от метода запроса GET, когда на сервер отправляются только URL и заголовки, запросы POST также включают сообщениетело.Это позволяет отправлять на сервер данные произвольной длины любого типа.

По сути, POST требует два запроса, 1) сервер получает "обычный" запрос с дополнительным заголовкомзначение, указывающее, что необходимо отправить больше данных.В этот момент сервер отправляет подтверждение и 2) клиент отправляет тело POST.Такое поведение не может быть достигнуто только с помощью ссылки.

Тем не менее, есть решения для этого, и я видел некоторые методы, среди прочего, для вывода form с автоматической отправкой, что-то вроде

<form name="frm" method="post" action="http://your.domain.com/path/to/page.php?param1=1&param2=2">
<input type="hidden" name="foo" value="bar" />
</form>
<script type="text/javascript">
    document.forms["frm"].submit();
</script>

, что приведет к вызову page.php с этими аргументами

$_GET = array('param1' => '1', 'param2' => '2');
$_POST = array('foo' => 'bar');

Обратите внимание, что это простой метод "перенаправления", но вы можете создать <a> элементы, чтобы фактически вызвать некоторую скрытую форму, подобную этой.вместо использования стандартной ссылки.(непроверенный код)

<a href="http://your.domain.com/path/to/page.php?param1=1&param2=2" onclick="return dopost(this.href, {foo:'bar'});">A simple link</a>
<script type="text/javascript">
   function dopost(url, params) {
       var pe = '';
       for (var param : params) {
           pe += '<input type="hidden" name="'+param+'" value="'+params[param]+'" />';
       }
       var frmName = "frm" + new Date().getTime();
       var form = '<form name="'+frmName+'" method="post" action="'+url'">'+pe+'</form>';
       var wrapper = document.createElement("div");
       wrapper.innerHTML = form;
       document.body.appendChild(wrapper);
       document.forms[frmName].submit();
   }
</script>

Это, вероятно, то, что вам нужно, на самом деле.

1 голос
/ 12 мая 2016

Этот код ниже демонстрирует идею идеи T30.

Мое обоснование для прохождения через $ _POST состоит в том, чтобы предотвратить показ определенных переменных в URL, что достигается здесь.Тем не менее, они все равно будут отображаться через «источник просмотра».

<?php

/*
This demonstrates how to set $_POST from a link in .php without ajax based on the idea from http://stackoverflow.com/a/27621672/1827488. The rationale for doing so is to prevent certain variables ('userid') from being exposed in the url via $_GET. However, there does not seem to be a way to avoid those variables being exposed by 'view source'.
*/

echo "<!DOCTYPE html><html lang='en'><head><title>Test Data Link</title></head><body>";

// only one hidden form
echo "<form class='hiddenForm' method='post'>
        <input class='hiddenFormUserid' type='hidden' name='userid'/>
      </form>";

// as many links as you need
echo "<p><a class='hiddenFormLink' href='?following=1' data-userid=101>Following</a> &bull; <a class='hiddenFormLink' href='?followers=1' data-userid=101>Followers</a></p>";
echo "<p><a class='hiddenFormLink' href='?following=1' data-userid=102>Following</a> &bull; <a class='hiddenFormLink' href='?followers=1' data-userid=102>Followers</a></p>";
echo "<p><a class='hiddenFormLink' href='?following=1' data-userid=103>Following</a> &bull; <a class='hiddenFormLink' href='?followers=1' data-userid=103>Followers</a></p>";

echo "<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'></script>";

echo "<script type='text/javascript'>
        console.log('jq');
        $('.hiddenFormLink').click(function(e){
          console.log('data-userid=' + $(this).attr('data-userid') + ', value=' + $('.hiddenFormUserid').val());
          e.preventDefault();
          $('.hiddenFormUserid')
            .val($(this).attr('data-userid'));
          $('.hiddenForm')
            .attr('action',$(this).attr('href'))
            .submit();
        });
      </script>";

if (isset($_GET["following"]) || isset($_GET["followers"])) {

  if (isset($_GET["following"])) {
    echo "followed by ";
  } else {
    echo "followers of ";
  }

  if (isset($_POST["userid"])) {
    echo $_POST["userid"]."<br>";
  } else {
    echo "no post<br>";
  }

} else {
  echo "no get<br>";
}

echo "</body></html>";

$_POST["userid"] = "";

?>
1 голос
/ 23 декабря 2014

Если у вас есть несколько ссылок, и вы не хотите переписывать их все, просто добавьте одну фальшивую форму, подобную этой:

<form id="fakeForm" method="post">
    <input type="hidden" name="post_key" value="post_value" />
</form>

и настройте правильный jquery:

$('a').click(function(event){
    event.preventDefault();
    $('#fakeForm').attr('action',$(this).attr('href')).submit();
});

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

Обратите внимание: если ссылка нажата не левой кнопкой мыши (или js отключена), ссылка работает правильно, но значение не передается!

1 голос
/ 31 июля 2011

К сожалению, вы действительно не можете этого сделать. Если вам нужно использовать привязку для отправки значения, вам нужно будет получить доступ к переменным через $_GET или $_REQUEST.

Если это должно быть $_POST (если вы настроены на это дизайнерское решение, потому что $_GET на самом деле имеет гораздо больше смысла), вы можете использовать форму и стиль кнопки отправки, чтобы она выглядела очень похоже на ссылку. Поместите этот код в текстовый редактор и проверьте его.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>    
        <style type="text/css">
        .button {border:none;background-color:#FFFFFF}
        .button:hover{ color:blue; }
        </style>
    </head>
    <body>
        <form action="test.php">
            <input type="hidden" name="var" value="<?php echo $val; ?>" />
            This kinda looks like a link: 
               <input type="submit" value="link" class="button" />
        </form>
    </body>
</html>
1 голос
/ 31 июля 2011

Элементы в строке запроса доступны через $_GET, , а не $_POST, поскольку они на самом деле не размещены.Если вы хотите выполнить POST, вы должны либо использовать форму с method из post, либо выполнить XHR как POST.

...