可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
According to CI's docs, CodeIgniter uses a segment-based approach, for example:
example.com/my/group
If I want to find a specific group (id=5), I can visit
example.com/my/group/5
And in the controller, define
function group($id='') {
...
}
Now I want to use the traditional approach, which CI calls "query string" URL. Example:
example.com/my/group?id=5
If I go to this URL directly, I get a 404 page not found. So how can I enable this?
回答1:
For reliable use of query strings I've found you need to do 3 things
- In
application/config/config.php
set $config['enable_query_strings'] = true;
- Again in
application/config/config.php
set $config['uri_protocol'] = "PATH_INFO";
- Change your .htaccess to remove the ? (if present) in the rewrite rule
I use the following
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
回答2:
//Add this method to your (base) controller :
protected function getQueryStringParams() {
parse_str($_SERVER['QUERY_STRING'], $params);
return $params;
}
// Example : instagram callback action
public function callback()
{
$params = $this->getQueryStringParams();
$code = !empty($params['code']) ? $params['code'] : '';
if (!empty($code))
{
$auth_response = $this->instagram_api->authorize($code);
// ....
}
// .... handle error
}
回答3:
This might help some people; put this into your controller's constructor to repopulate $_GET on a controller-by-controller basis (e.g. if you are integrating a third party lib that relies on $_GET - such as most PHP OAuth libraries).
parse_str(str_replace($_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']),$_GET);
回答4:
Html:
<a href="?accept=1" class="btn btn-sm btn-success">Accept</a>
Controller Function
if ($this->input->get('accept')!='')
{
$id = $this->input->get('accept', TRUE );
$this->camprequests->accept($id);
redirect('controllername/functionname');
}
Model Function
public function accept($id)
{
$data = array('status'=>'1');
$this->db->where('id','1');
if($this->db->update('tablename',$data)) {
$this->session->set_flashdata("accpeted","<div class='col-sm-12 alert alert-success'>Accpeted successfully.</div>");
} else {
$this->session->set_flashdata("accpeted","<div class='col-sm-12 alert alert-success'>Error..</div>");
}
}
回答5:
Modify application/config.php
at the line:
$config['enable_query_strings'] = FALSE;
Make this true instead. There are other details you'll have to pay attention to also. See here.
回答6:
After setting $config['enable_query_strings'] = TRUE;
in your config.php file, you can use the segment-based approach in conjunction with query strings, but only if you use 2 or more variables (separated by a "&") in the query string like this:
example.com/my/group?id=5&var=something
See this answer for more information.
回答7:
CodeIgniter optionally supports this capability, which can be enabled in your application/config.php file. If you open your config file you'll see these items:
enter code here $config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
If you change "enable_query_strings" to TRUE this feature will become active.
回答8:
You may change
URI PROTOCOL
in your config file
to
$config['uri_protocol'] = "ORIG_PATH_INFO";
and
$config['enable_query_strings'] = FALSE;
It'll accept query strings and allow your URLs.
Worked for me :)
回答9:
This is actually tested and confirmed
It works with any method you like; giving you freedom to mix match the query string and / segment approach (as opposed to the previous responses)
either you want to use:
example.com/my/group/?id=5
(please note the trailing / before ?). OR
example.com/my/group/5
(depending on your url pattern definitions in the router file). OR EVEN
example.com/index.php/?my/group/?id=5
(though that looks awkward enough)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
and in you codigniter's config/config.php file, set
$config['uri_protocol'] = 'AUTO';
$config['enable_query_strings'] = TRUE;