Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用POST而不是GET从超链接检索数据?_Php_Html_Xml_Post_Get - Fatal编程技术网

如何在PHP中使用POST而不是GET从超链接检索数据?

如何在PHP中使用POST而不是GET从超链接检索数据?,php,html,xml,post,get,Php,Html,Xml,Post,Get,下面的代码工作正常。但我更喜欢使用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 no

下面的代码工作正常。但我更喜欢使用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>

正如下面所评论的,这不是一个很好的解决方案,也不是一个优雅的解决方案,因为$\u POST通常会导致浏览器在您不断向其发布内容时表现得很滑稽。它甚至可能会停止加载网站。所以,你得到的美元应该很好。。。您可以始终加密URL,以便任何人查看连接时都可能不知道他们在查看什么

是的,也不是。。。至少不是我认为你想做的,我可能错了。它将改变您正在做的任何事情的结构,要使用$\u POST,您必须通过表单提交,如PHP所示:

$\邮政:

在请求中使用application/x-www-form-urlencoded或multipart/form数据作为HTTP内容类型时,通过HTTP POST方法传递到当前脚本的变量的关联数组

所以理论上,您可以提交一个带有lang值的表单,并从

$lang=$_GET['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>
注意:不要使用$\u GET或$\u POST unfiltered,这些都是用户输入,您永远不信任用户输入,它们可能传递恶意代码并对您的网站造成严重损害

 <?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请求可以通过两种方式完成,一种是让链接发送表单,如下所示:

<form method=POST id=f1>
<input name=hidden value=whatever>
</form>
<a href='#' onclick='document.getElementById("f1").submit()' />clickme</a>
另一种方法是让js链接发送XMLHttpRequest或新的JSFETCH api来发送数据

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

让链接成为链接,形式成为形式


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

虽然表面上看起来似乎只需在OPs代码中将$GET更改为$POST即可,这种变化并非微不足道

必须通过POST方法创建提交表单或发出HTTP POST请求。如果选择前者,则链接将指向包含表单的网页。如果您选择后者,那么您的链接将引用可能使用fsockopen或curl的PHP脚本。下面是由提供的一些示例代码,说明了使用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更容易;看这个

因为你可以对URL和数据进行加密,所以我建议继续使用_GET方法,它比_POST方法快

你为什么要这样做?你只需要用$\u post来替换$\u GET不,它不起作用,应该这样。您是否确实发送了post请求而不是get请求?显然,仅仅改变变量,而不是请求是行不通的。我反对这样做,因为你通过切换到post来获得这样的东西,带来了不友好的用户体验。使用post时,当询问您是否要重新发送表单数据时,使用浏览器的正向/反向/刷新功能会变得笨拙?我同意,但我只是向他表明,这样做是可能的@ScootsI不想重新发送或发送任何来自数据的超链接,这些超链接只用于从一种语言切换到另一种语言。@Shko您可以设置一个保存该语言的$\u会话变量,如果他们选择其他语言,请切换$\u会话值。。。这样你就不必有url参数,你可以轻松地使用你的用户会话。这很有效,但我不我不想提交任何表单。你不想提交任何表单,但你想使用来自。。。哪里
<?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);
}