2010-05-24 40 views
4

根據CI的文檔,CodeIgniter使用一個基於段的方法,例如:如何讓CodeIgniter接受「查詢字符串」網址?

example.com/my/group 

如果我想找到一個特定的組(ID = 5),我可以訪問

example.com/my/group/5 

和Controller,定義

function group($id='') { 
    ... 
    } 

現在我想用傳統的方法,其中CI來電「查詢字符串」 URL。例如:

example.com/my/group?id=5 

如果我直接去這個網址,我得到一個404頁找不到。那我該如何啓用它?

回答

9

爲可靠使用的查詢字符串的我發現,你需要做3件事

  1. application/config/config.php設置$config['enable_query_strings'] = true;
  2. 再在application/config/config.php設置$config['uri_protocol'] = "PATH_INFO";
  3. 更改你的.htaccess刪除? (如果存在的話)在重寫規則

我用下面的

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
+0

我仍然得到一個404錯誤CodeIgniter位於'我的。 server.com/project/ci',有'my.server.com/project/ci/index.php','my.server.com/project/ci/.htaccess'和'my.server.com/project/ci/system/application'。 – zihaoyu 2010-05-24 17:33:47

+1

我的不好,我有剛剛意識到你問了什麼。 你不能混合和匹配查詢字符串/段的方法。如果你想使用段來訪問控制器/方法,你需要通過該方法以及example.com/my/group/5 /'來傳遞id。或者你需要在方法的頂部包含'$ id = $ this-> input-> get('id)';',如果你真的想把它從查詢字符串中取出。 或者您可以啓用查詢字符串並使用它來選擇控制器和方法以及'my.server.com/project/ci/index.php?c = my&m = group&id = 5'。 – WeeJames 2010-05-25 07:14:11

+0

謝謝,我把'$ id = $ this-> input-> get('id')'放在我的控制器的開頭,並設置了'$ config ['uri_protocol'] =「QUERY_STRING」;'在config.php中。但是'example.com/my/group?id = 5'仍然不起作用。我得到了404錯誤。還有什麼應該做的? – zihaoyu 2010-05-27 16:56:51

0

修改application/config.php在該行:

$config['enable_query_strings'] = FALSE; 

使這個真不是。還有其他的細節你也必須注意。請參閱here

+0

即配置似乎指示URL解釋使用查詢字符串,而不是路徑段用於其的控制器/方法的參數。我不太確定這是提問者想要的。 – eyelidlessness 2010-05-24 01:18:09

+0

我已經重讀了這個問題,並且問題似乎是「如何啓用查詢字符串網址? – wallyk 2010-05-24 01:21:16

+0

我同意無眼瞼。此設置僅允許您在查詢字符串網址中使用控制器和方法參數。 – zihaoyu 2010-05-24 01:21:48

0

在你的config.php文件設置$config['enable_query_strings'] = TRUE;後,您可以使用基於段的方法與查詢字符串,但結合只有當你在查詢字符串中使用2個或多個變量(由「&」隔開)這樣的:

example.com/my/group?id=5&var=something 

See this answer以獲取更多信息。

+0

你是說如果我只有一個參數(id),那麼我不能使用查詢字符串的URL? – zihaoyu 2010-05-24 17:34:37

+0

@Peter:如果你想要控制器和方法作爲URI參數(而不是查詢字符串中的變量),那麼是的 - 基於一些簡短的測試如果只有一個變量存在,它會拋出一個404錯誤 – 2010-05-24 19:15:12

1

這可能幫助一些人;把它放到控制器的構造函數中,以逐控制器的方式重新生成$ _GET(例如,如果你正在集成依賴於$ _GET的第三方庫,比如大多數PHP OAuth庫)。

parse_str(str_replace($_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']),$_GET); 
+0

我嘗試了parse_str($ _ SERVER ['QUERY_STRING'],$ _ GET);哪些不起作用。但是這個爲我做。謝謝! – mseo 2012-01-06 01:58:50

0

CodeIgniter可以選擇支持這個功能,它可以在你的application/config.php文件中啓用。如果你打開你的配置文件,你會看到這些項目:

enter code here $config['enable_query_strings'] = FALSE; 

$配置[ 'controller_trigger'] = 'C'; $ config ['function_trigger'] ='m';

如果將「enable_query_strings」更改爲TRUE,則此功能將變爲活動狀態。

+0

複製粘貼時請註明您的來源。 http://codeigniter.com/user_guide/general/urls.html – 2012-07-05 09:01:54

3
//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 
}  
+0

太棒了!這是一個完美的解決方案,您希望將查詢字符串的使用限制爲僅強制使用它們的那些API。 – bottleboot 2013-05-21 09:33:03

0

你可以改變 URI PROTOCOLconfig file

$config['uri_protocol'] = "ORIG_PATH_INFO"; 

$config['enable_query_strings'] = FALSE; 

它會接受查詢字符串,並允許您的網址。 爲我工作:)

0

這實際上是經過測試,確認

它適用於任何你喜歡的方法;讓您自由搭配匹配的查詢字符串和/段的方法(而不是以往的迴應)

要麼你想使用:(?請注意結尾/前)

example.com/my/group/?id=5 

。或

example.com/my/group/5 

(取決於您在路由器文件中的url模式定義)。甚至

example.com/index.php/?my/group/?id=5 

(儘管這看起來很彆扭)

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 

和你codigniter的config/config.php文件,設置

$config['uri_protocol'] = 'AUTO'; 
$config['enable_query_strings'] = TRUE; 
1

HTML:

<a href="?accept=1" class="btn btn-sm btn-success">Accept</a> 

控制器功能

if ($this->input->get('accept')!='') 
{ 
    $id = $this->input->get('accept', TRUE); 
    $this->camprequests->accept($id); 
    redirect('controllername/functionname'); 
} 

型號功能

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>"); 
    } 
} 
相關問題