我知道使用GET方法的结果页面可以被标记,而使用POST的结果页面不能。我也知道GET方法的限制。
现在假设我想构建一个搜索引擎,默认情况下使用GET允许用户书签,但是当搜索短语的长度超过限制时,切换到POST。在服务器端,我使用$ _GET或$ _POST,具体取决于设置的内容。
这可行吗? 如果不是,为什么? 如果是,请提供简要说明。
由于
答案 0 :(得分:12)
这是可行的,没问题。
有$_REQUEST
数组合并GET,POST和COOKIE值,但更好的方法是在脚本中手动处理GET和POST。
让您的引擎同时检查$_GET["variable"]
和$_POST["variable"]
并使用设置的任何一个。如果在两种方法中都设置了变量,则需要确定要优先使用哪一种。
两种方法之间唯一值得注意的区别是GET参数的大小限制取决于浏览器和接收Web服务器(POST也有限制,但它们通常在几兆字节的范围内)。 我认为一般规则是GET字符串不应超过1024个字符。
答案 1 :(得分:10)
以下是如何在一个中使用GET和POST:
<form action="myfile.php?var1=get1&var2=get2&var3=get3" method="post">
<input type="hidden" name="var1" value="post1" />
<input type="hidden" name="var2" value="post2" />
<input type="submit" />
</form>
PHP:
print_r($_REQUEST);
// var1 = "post1"
// var2 = "post2"
// var3 = "get3"
print_r($_GET)
// var1 = "get1"
// var2 = "get2"
// var3 = "get3"
print_r($_POST);
// var1 = "post1"
// var2 = "post2"
答案 2 :(得分:1)
您可以使用以下内容:
<?php
function getParam($key)
{
switch (true) {
case isset($_GET[$key]):
return $_GET[$key];
case isset($_POST[$key]):
return $_POST[$key];
case isset($_COOKIE[$key]):
return $_COOKIE[$key];
case isset($_SERVER[$key]):
return $_SERVER[$key];
case isset($_ENV[$key]):
return $_ENV[$key];
default:
return null;
}
}
答案 3 :(得分:1)
同样要注意的是,使用GET会在某些用户组中引发诱惑,操纵URL以“查看发生的情况”,因此绝对有必要确保您的代码适当地清理输入变量。
当然你还是那样做;-)。但是得到双重偏执是值得的。
我自己如果我正在使用GET我通常也会设置一个cookie并在其中删除某种ID,然后将其与GET列表中的变量进行交叉关联,以确保绝对没有问题用户A操纵输入并让他们看到源自用户B的任何内容。
答案 4 :(得分:1)
是的,尽管如此(恕我直言),GET变得麻烦的限制远远大于提供这么多信息的用户界面变得无法使用的阈值。此外,您提交给传统搜索引擎的查询越复杂,就越有效地解析它。
但我猜你有理由。
从您提供的信息中,最简单的方法是使用javascript在运行时将表单方法从GET更改为POST,例如
<form method='GET' id='searchform' target='search.php' onsubmit='
if (document.getElementById("searchdata")) {
if ((document.getElementById("searchdata").length >$some_threshold)
&& (document.getElementById("searchform"))) {
// 2nd if in case this moved to action for button
document.getElementById("searchform").method="POST";
}
}
return true;'>
<textarea name='searchdata' id='searchdata'>
</textarea>
<input type='submit' value='go get it'>
</form>
对于非JavaScript客户端,它也会降级很好。
下进行。
答案 5 :(得分:1)
function getQVar($key){
return isset($_GET[$key]) ? $_GET[$key] : (isset($_POST[$key]) ? $_POST[$key] : null);
}
echo getQVar("name");
切换$ _GET和$ _POST以优先处理GET vars上的POST。