【问题标题】:How to retrieve data from a hyperlink using POST instead of GET in PHP?如何在 PHP 中使用 POST 而不是 GET 从超链接中检索数据?
【发布时间】:2018-04-03 09:17:28
【问题描述】:

以下代码工作正常。但我更喜欢使用 POST 方法而不是 GET,如果有什么方法可以做到这一点?

<?php
$lang=$_GET['lang'];
$langArray=array('en','ar','ch');
$found=false;
if(in_array($lang,$langArray))
$found=true;
if(!$found)
$lang='en';

$xml=simplexml_load_file("languages.xml") or die("xml not found!");
$title=$xml->title->$lang;
$text=$xml->text->$lang;
?>

<h1><?php echo $title ?></h1>
<div><?php echo $text ?></div>
<div style="margin-top:50px;">

Languages:

<a href="?lang=en">English</a>
<a href="?lang=ar">Arabic</a>
<a href="?lang=ch">Chinese</a>

【问题讨论】:

  • 你为什么要这样做?您只需将$_GET 替换为$_POST
  • 不,它不起作用。
  • 应该的。您实际上是在发送发布请求而不是获取请求吗?显然只改变变量,但不改变请求是行不通的。

标签: php html xml post get


【解决方案1】:

正如下面评论的那样,这不是一个很好的解决方案或优雅的解决方案,因为$_POST 如果您继续向其发布内容,通常会使浏览器表现得滑稽。它甚至可能停止加载网站期间。所以$_GET 应该没问题...您始终可以加密URL,因此如果有人正在查看连接,可能不会意识到他们正在查看的内容。

是的,不是……至少不是我认为你想要做的那样,但我可能是错的。它会改变你正在做的任何事情的结构,要使用$_POST,你必须通过表单提交它,根据 PHP:

$_POST

在请求中使用 application/x-www-form-urlencoded 或 multipart/form-data 作为 HTTP Content-Type 时,通过 HTTP POST 方法传递给当前脚本的变量关联数组。

所以理论上你可以提交一个带有lang 值的表单,然后从

$lang=$_GET['lang'];

收件人:

$lang=$_POST['lang'];

因此,不要使用简单的链接,而是使用按钮或下拉菜单设置表单:

<form id="web_lang" method="post">
    <button name="lang" value="en">English</button>
    <button name="lang" value="ar">Arabic</button>
    <button name="lang" value="ch">Chinese</button>
</form>

注意:不要使用未经过滤的$_GET$_POST,它们是用户输入,您永远不要相信用户输入,它们可以传递恶意代码并对您的网站造成严重损害。

【讨论】:

  • 我想反对这样做,因为你通过切换到类似这样的帖子来带来不友好的用户体验。使用 post 时,使用浏览器的前进/后退/刷新功能会变得很笨拙,因为系统会询问您“是否要重新发送表单数据?”或类似的词语。
  • 我同意,但我只是向他展示了这样做是可能的。 @Scoots
  • 我不想重新发送或发送任何数据,这些超链接只是为了从一种语言切换到另一种语言。
  • @Shko 您可以设置一个 $_SESSION 变量来保存语言,如果他们选择不同的语言,请切换 $_SESSION 值...这样您就不必拥有 @987654334 @ 参数,您可以轻松使用您的用户会话
【解决方案2】:
 <?php
    $lang=$_POST['lang'];
    $langArray=array('en','ar','ch');
    $found=false;
    if(in_array($lang,$langArray))
    $found=true;
    if(!$found)
    $lang='en';

    $xml=simplexml_load_file("languages.xml") or die("xml not found!");
    $title=$xml->title->$lang;
    $text=$xml->text->$lang;
    ?>

    <h1><?php echo $title ?></h1>
    <div><?php echo $text ?></div>
    <div style="margin-top:50px;">

    Languages:

<form method="post" action="">
    <select name="lang">

        <option VALUE=""> choose language </option>
        <option VALUE="en"> English</option>
        <option VALUE="ar"> Arabic</option>
        <option VALUE="ch"> Chinese</option>
    </select>
<INPUT TYPE="submit" name="submit" />

【讨论】:

  • 这行得通,但我不想提交任何表格。
  • 您不想提交任何表单,但您想使用 POST 来自...哪里?
【解决方案3】:

让链接做POST请求可以有两种方式,一种是简单地让链接发送一个表单,像这样:

<form method=POST id=f1>
<input name=hidden value=whatever>
</form>
<a href='#' onclick='document.getElementById("f1").submit()' />clickme</a>

另一种是让js链接发送XMLHttpRequest或者新的jsfetch() api发送数据。

这种方法的可用性缺点是人们无法共享链接或在新标签中打开,这很常见。

让链接成为链接,让表单成为表单。

根据它的安全方面,GETPOST 都是不安全的,如果您不使用 HTTPS,请记住 GET 应该是幂等的,POST 需要在浏览器刷新时重新确认,进一步降低可用性。

【讨论】:

    【解决方案4】:

    虽然表面上看起来似乎只需将 OPs 代码中的“$_GET”更改为“$_POST”,但这种更改并非微不足道。

    必须创建一个表单以通过 POST 方法提交或发出 HTTP POST 请求。如果您选择前者,那么您的链接将指向包含该表单的网页。如果您选择后者,那么您的链接将引用可能使用 fsockopen() 或 curl 的 PHP 脚本。这是Tamlyn 提供的discussion 中的一些示例代码,说明了 fsockopen() 的机制:

    <?php
    
    $fp = fsockopen('example.com', 80);
    
    $vars = array(
        'hello' => 'world'
    );
    $content = http_build_query($vars);
    
    fwrite($fp, "POST /reposter.php HTTP/1.1\r\n");
    fwrite($fp, "Host: example.com\r\n");
    fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
    fwrite($fp, "Content-Length: ".strlen($content)."\r\n");
    fwrite($fp, "Connection: close\r\n");
    fwrite($fp, "\r\n");
    
    fwrite($fp, $content);
    
    header('Content-type: text/plain');
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    

    请注意,您需要将数据排列成键值对数组以发出 HTTP POST 请求。或者,您可能会发现使用 AJAX 更容易;看到这个example

    【讨论】:

      【解决方案5】:

      因为你可以加密 URL 和不敏感的数据,我建议继续使用 _GET 方法,它比 _POST 方法快

      【讨论】:

        猜你喜欢
        • 2011-04-24
        • 2018-01-09
        • 2013-01-29
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多