zihaoyu
zihaoyu

Reputation: 5721

How to make CodeIgniter accept "query string" URLs?

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?

Upvotes: 5

Views: 39470

Answers (10)

Pouria
Pouria

Reputation: 1

I have tried these steps and it was correct for me to set a query in pagination (codeigniter 3)

in controller: just add these codes.

$config['enable_query_strings'] = TRUE;

$config['page_query_string'] = TRUE;

$config['query_string_segment'] = 'page'; // you can jot down what you want instead of page in this one. and you could get by this name your $_GET method. So, if you don't use this line, it will automatically create a query with "per_page" and this will be your query. 

related link: https://codeigniter.com/userguide3/libraries/pagination.html#customizing-the-pagination

Even, if you want to add your own specific class to the (a tags that are created by pagination), you must add the following code to have your own favorite style for pagination links.

$config['attributes'] = array('class' => 'page-link'); // this is the example of the above and you can write what you want instead of 'page-link' as the value of class.

This will be very useful when we want to add page-link class as boostrap style to the a tag.

result: <a href="home?action=questions&amp;page=12" class="page-link" data-ci-pagination-page="5" dideo-checked="true">5</a>

as you see page-link was added to this a tag.

related link: https://codeigniter.com/userguide3/libraries/pagination.html#adding-attributes-to-anchors

Upvotes: 0

Gulshan S
Gulshan S

Reputation: 1104

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>");  
    }
}

Upvotes: 1

tormuto
tormuto

Reputation: 585

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;

Upvotes: 0

Alex X Nguyen
Alex X Nguyen

Reputation: 11

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 :)

Upvotes: 1

Nassif Bourguig
Nassif Bourguig

Reputation: 765

//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
}    

Upvotes: 6

GkDreamz
GkDreamz

Reputation: 51

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.

Upvotes: 0

Adam Frisby
Adam Frisby

Reputation: 11

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);

Upvotes: 1

WeeJames
WeeJames

Reputation: 540

For reliable use of query strings I've found you need to do 3 things

  1. In application/config/config.php set $config['enable_query_strings'] = true;
  2. Again in application/config/config.php set $config['uri_protocol'] = "PATH_INFO";
  3. 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]

Upvotes: 10

Colin Brock
Colin Brock

Reputation: 21575

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.

Upvotes: 0

wallyk
wallyk

Reputation: 57794

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.

Upvotes: 0

Related Questions