使用 CodeIgniter 获取 URL 中的参数
Posted
技术标签:
【中文标题】使用 CodeIgniter 获取 URL 中的参数【英文标题】:GET parameters in the URL with CodeIgniter 【发布时间】:2010-09-24 23:36:59 【问题描述】:我知道 codeIgniter 默认关闭 GET 参数。
但是通过在 POST 中完成所有操作,如果您在提交表单后按回,您不会对重新发送数据请求感到恼火吗?
这让我很恼火,但我不确定是否纯粹出于这个原因允许 GET。
允许 GET 参数也有这么大的安全问题吗?
【问题讨论】:
从 CodeIgniter 2.x 开始,GET 参数现在默认启用。 【参考方案1】:当我第一次开始使用 CodeIgniter 时,不使用 GET 真的让我很沮丧。但后来我意识到你可以通过使用内置的URI Class 操作 URI 来模拟 GET 参数。这太棒了,它使您的网址看起来更好。
或者,如果您真的需要 GET 工作,您可以将其放入您的控制器中:
parse_str($_SERVER['QUERY_STRING'], $_GET);
这会将变量放回 GET 数组中。
【讨论】:
是的 - 使用 CodeIgniter 默认处理 URL 的方式,URI 中的额外段充当控制器方法的参数。 如果你切换到 $config['uri_protocol'] = 'PATH_INFO']; 这个方法有效否则 ?foo=bar&baz=meh 会变成 /foo/baz。 我正在构建一个 facebook 应用程序,并计划订阅 graph api 支持的 facebook 更新。这需要 GET 参数。 developers.facebook.com/docs/reference/api/realtime 对于此代码,您必须添加 $config['uri_protocol'] = "PATH_INFO";在 config.php 中 URL Helper “URL Helper 文件包含有助于处理 URL 的函数。” ellislab.com/codeigniter/user-guide/helpers/url_helper.html【参考方案2】:这个函数和post函数一样,只是它获取get数据:
$this->input->get()
https://www.codeigniter.com/user_guide/libraries/input.html
【讨论】:
不适用于 codeigniter4【参考方案3】:这对我有用:
<?php
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'], $params);
?>
$params
数组包含在 ? 之后传递的参数人物
【讨论】:
【参考方案4】:现在从 CodeIgniter 2.1.0 可以正常工作
//By default CodeIgniter enables access to the $_GET array. If for some
//reason you would like to disable it, set 'allow_get_array' to FALSE.
$config['allow_get_array'] = TRUE;
【讨论】:
【参考方案5】:你只需要在config.php中启用它,你就可以使用$this->input->get('param_name');
来获取参数。
【讨论】:
【参考方案6】:如果您需要第一个参数,请使用它。
$this->uri->segment('3');
你需要第二个参数使用它
$this->uri->segment('4');
让你的多参数增强参数
【讨论】:
【参考方案7】:parse_str($_SERVER['QUERY_STRING'],$_GET);
仅在我将以下行添加到 applications/config/config.php 后才为我工作:
$config['uri_protocol'] = "PATH_INFO";
我发现 $_GET 参数在 CI 中并不是真正需要的,但是 Facebook 和其他网站将 GET 参数转储到链接的末尾,这对于我的 CI 站点来说是 404!通过在 config.php 中添加上面的行,这些页面就可以工作了。我希望这对人们有所帮助!
(来自https://web.archive.org/web/20101227060818/http://www.maheshchari.com/work-to-get-method-on-codeigniter/)
【讨论】:
【参考方案8】:如果你真的坚持,你可以启用查询字符串。 在您的 config.php 中,您可以启用查询字符串:
$config['enable_query_strings'] = TRUE;
有关更多信息,您可以查看此 Wiki 页面的底部: http://codeigniter.com/user_guide/general/urls.html
不过,学习使用干净的 url 是一个更好的建议。
【讨论】:
【参考方案9】:“如果您在提交表单后回击,您不会对重新发送数据请求感到恼火”
您可以通过从处理表单提交的页面重定向到成功页面来解决此问题。最后一个“动作”是加载成功页面,而不是表单提交,这意味着如果用户执行 F5,它只会重新加载该页面而不会再次提交表单。
【讨论】:
太好了,谢谢!从那以后我发现了这一点,但是是的,这是一个很好的提示。【参考方案10】:allesklar:这有点误导,因为脚本和机器人可以像发送普通请求一样轻松地发布数据。这不是秘密,它是 HTTP 的一部分。
【讨论】:
【参考方案11】:有点跑题了,但我在 CodeIgniter 中寻找一个 get 函数只是为了在控制器之间传递一些变量并遇到 Flashdata。 见:http://codeigniter.com/user_guide/libraries/sessions.html Flashdata 允许您创建一个快速会话数据,该数据仅可用于下一个服务器请求,然后自动清除。
【讨论】:
【参考方案12】:MY_Input.php:
<?php
// this class extension allows for $_GET access
class MY_Input extends CI_input
function _sanitize_globals()
// setting allow_get_array to true is the only real modification
$this->allow_get_array = TRUE;
parent::_sanitize_globals();
/* End of file MY_Input.php */
/* Location: .application/libraries/MY_Input.php */
MY_URI.php:
<?php
/*
| this class extension allows for $_GET access by retaining the
| standard functionality of allowing query strings to build the
| URI String, but checks if enable_query_strings is TRUE
*/
class MY_URI extends CI_URI
function _fetch_uri_string()
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
// If the URL has a question mark then it's simplest to just
// build the URI string from the zero index of the $_GET array.
// This avoids having to deal with $_SERVER variables, which
// can be unreliable in some environments
//
// *** THE ONLY MODIFICATION (EXTENSION) TO THIS METHOD IS TO CHECK
// IF enable_query_strings IS TRUE IN THE LINE BELOW ***
if ($this->config->item('enable_query_strings') === TRUE && is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
$this->uri_string = key($_GET);
return;
// Is there a PATH_INFO variable?
// Note: some servers seem to have trouble with getenv() so we'll test it two ways
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if (trim($path, '/') != '' && $path != "/".SELF)
$this->uri_string = $path;
return;
// No PATH_INFO?... What about QUERY_STRING?
$path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, '/') != '')
$this->uri_string = $path;
return;
// No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
$path = str_replace($_SERVER['SCRIPT_NAME'], '', (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO'));
if (trim($path, '/') != '' && $path != "/".SELF)
// remove path and script information so we have good URI data
$this->uri_string = $path;
return;
// We've exhausted all our options...
$this->uri_string = '';
else
$uri = strtoupper($this->config->item('uri_protocol'));
if ($uri == 'REQUEST_URI')
$this->uri_string = $this->_parse_request_uri();
return;
$this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
// If the URI contains only a slash we'll kill it
if ($this->uri_string == '/')
$this->uri_string = '';
/* End of file MY_URI.php */
/* Location: .application/libraries/MY_URI.php */
【讨论】:
这并不能真正回答问题【参考方案13】:我的参数是 ?uid=4 并通过以下方式获取:
$this->uid = $this->input->get('uid', TRUE);
echo $this->uid;
是
【讨论】:
那个 TRUE 标志是干什么用的?【参考方案14】:GET 参数由 Web 浏览器缓存,POST 不是。因此,使用 POST 您不必担心缓存,这就是通常首选它的原因。
【讨论】:
但是如果你需要 GET 你需要 GET,那么可收藏链接、提要等呢? 这些都很好,但你必须明白,如果没有添加正确的标头,浏览器可能会缓存这些 GET 请求。 IMO,没有 GET 是 CI 最大的缺陷之一。 GET 是 HTTP 的核心方面,应该相应地使用。缓存是一个好的东西!【参考方案15】:你可以试试这个
$this->uri->segment('');
【讨论】:
【参考方案16】:更简单:
curl -X POST -d "param=value¶m2=value" http://example.com/form.cgi
不过这个插件很酷。
【讨论】:
【参考方案17】:在下面执行此操作。为我工作。我从一个选择框和另一个文本框中获取值。然后在按钮单击时,我在 javascript 函数中获取了整个数据并使用 javascript 重定向。
//Search Form
$(document).ready (function($)
$("#searchbtn").click(function showAlert(e)
e.preventDefault();
var cat = $('#category').val();
var srch = $('#srch').val();
if(srch=="")
alert("Search is empty :(");
else
var url = baseurl+'categories/search/'+cat+'/'+srch;
window.location.href=url;
);
);
上面的代码对我有用。
【讨论】:
以上是关于使用 CodeIgniter 获取 URL 中的参数的主要内容,如果未能解决你的问题,请参考以下文章