2010-01-11 12 views
10

Tôi đã cố gắng tìm ra cách bật $ _GET trong CI.

Dường như khung công tác cố ý phá hủy mảng $ _GET và việc bật tính năng này đòi hỏi phải có sự khắc phục nghiêm trọng với các lớp lõi. bất cứ ai có thể nói tại sao điều này là, và làm thế nào để vượt qua nó?

nhớ bạn, tôi đang tìm cách giữ cho phân tích cú pháp URI và định tuyến theo cách của chúng, chỉ đơn giản là có sẵn $ _GET.

+1

tại sao bạn muốn sử dụng $ _GET biến, khi bạn có thể sử dụng các URL viết lại để Achi eve cùng một mục đích trong CodeIgniter? – GSto

+2

tốt, lý do duy nhất tôi tự chấp nhận là hỗ trợ các URL cũ. tôi có một khách hàng rất muốn chuyển sang các URL thân thiện, khả năng tồn tại để làm lại trang web "mã spaghetti" của họ bằng cách sử dụng khung, nhưng người viết mã sẽ không cho phép trang web mới của họ hỗ trợ hàng chục nghìn (!) các liên kết đến các bài viết khác nhau, bạn hiểu tại sao điều này là không thể chấp nhận được :) –

+0

Giải pháp mới là sử dụng [ReacI Reactor Reactor] (https://bitbucket.org/ellislab/codeigniter-reactor), hỗ trợ GET đúng cách. –

Trả lời

14

Thêm thư viện sau vào thư viện ứng dụng của bạn. Nó ghi đè hành vi của thư viện đầu vào mặc định của việc xóa mảng $ _GET. Nó cho phép kết hợp các phân đoạn URI và chuỗi truy vấn.

application/thư viện/MY_Input.php

class MY_Input extends CI_Input 
{ 
    function _sanitize_globals() 
    { 
     $this->allow_get_array = TRUE; 
     parent::_sanitize_globals(); 
    } 
} 

của nó cũng cần thiết để sửa đổi một số thiết lập cấu hình. Cài đặt uri_protocol cần phải được thay đổi thành PATH_INFO và '?' cần thêm ký tự vào danh sách các ký tự được cho phép trong URI.

application/config/config.php

$config['uri_protocol'] = "PATH_INFO"; 
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-?'; 

Đó là sau đó có thể truy cập thông qua các giá trị trong thông qua chuỗi truy vấn.

$this->input->get('x'); 
+0

Sử dụng PATH_INFO dường như không hoạt động trên các cài đặt Windows XAMPP. –

+1

Như thể CodeIgniter 2.x, $ this-> allow_get_array bây giờ là $ this -> _ allow_get_array. – jorisw

+0

Trong CodeIgniter 2.x Tôi không thấy lý do tại sao bạn cần phải sử dụng phương pháp này ở tất cả, bởi vì trong 2.x '$ _GET' tham số được kích hoạt theo mặc định. Từ config.php trong CodeIgniter 2.x: "Theo mặc định CodeIgniter cho phép truy cập vào mảng $ _GET. Nếu vì lý do nào đó bạn muốn vô hiệu hóa nó, hãy đặt 'allow_get_array' thành FALSE." –

9

Từ CodeIgniter's manual about security:

GET, POST và COOKIE liệu

GET dữ liệu chỉ đơn giản là không được phép bởi CodeIgniter kể từ khi hệ thống sử dụng đoạn URI chứ không phải là truyền thống chuỗi truy vấn URL (trừ khi bạn đã bật tùy chọn chuỗi truy vấn trong tệp cấu hình ). Mảng GET toàn cục là không được đặt bởi lớp đầu vào trong khi khởi động hệ thống .

Đọc qua số forum entry for possible solutions (này thú vị từ nửa chừng trang 1).

+0

Bất cứ ai đã bỏ phiếu này ít nhất cũng có thể để lại một bình luận giải thích lý do tại sao. Câu trả lời là chính xác và cung cấp các lựa chọn thay thế trong liên kết đã cho. – Gordon

+0

Đó không phải là tôi: -S –

1

Trên máy chủ, mà không PATH_INFO (giống như tôi) thử này:

parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET); 

Bạn có thể đặt nó chỉ như thế này:

class Your_controller extends Controller { 

function Your_controller() 
{ 
    parent::Controller(); 

    date_default_timezone_set('Asia/Jakarta'); // set my timezone 

    parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET); 

} 

function test() 
{ 
    print_r($_GET); // here your $_GET vars 
} 

} 
2

tôi không có đủ uy tín để nhận xét, nhưng Phil Sturgeon's answer above là cách để đi nếu chuyển sang Codeigniter Reactor thật dễ dàng cho bạn.

Bạn có thể truy cập chuỗi truy vấn bằng cách sử dụng $ _GET hoặc $ this-> input-> get() mà không cần ghi đè MY_Input hoặc thậm chí thay đổi tệp config.php.

1

Tôi đã thành công khi sử dụng dòng đơn này trong bộ điều khiển của mình.Về cơ bản nó reparses URL yêu cầu mà không dựa vào bất kỳ cài đặt CodeIgniter đặc biệt:

parse_str(array_pop(explode('?',$_SERVER['REQUEST_URI'],2)),$_GET);

0

Không bao giờ sử dụng $ _GET với CI, tốt hơn để thay đổi kịch bản logic để sử dụng POST hoặc $ this-> uri-> segment(), sau đó đến hoạt động $ _GET params cho tôi

0

Từ bài: CodeIgniter PHP Framework - Need to get query string

Dưới đây là một ví dụ làm việc đầy đủ về cách để cho phép querystrings trong Codeignitor, giống như trên nền tảng JROX. Đơn giản chỉ cần thêm video này vào tập tin config.php của bạn nằm tại địa chỉ:

/system/application/config/config.php 

Và sau đó bạn chỉ có thể nhận được querystrings như bình thường sử dụng $ _GET hoặc lớp dưới

$yo = $this->input->get('some_querystring', TRUE); 
$yo = $_GET['some_querystring']; 

Dưới đây là đoạn code để làm cho nó tất cả công việc:

/* 
|-------------------------------------------------------------------------- 
| Enable Full Query Strings (allow querstrings) USE ALL CODES BELOW 
|--------------------------------------------------------------------------*/ 

/* 
|---------------------------------------------------------------------- 
| URI PROTOCOL 
|---------------------------------------------------------------------- 
| 
| This item determines which server global should 
| be used to retrieve the URI string. The default 
| setting of 'AUTO' works for most servers. 
| If your links do not seem to work, try one of 
| the other delicious flavors: 
| 
| 'AUTO'    Default - auto detects 
| 'PATH_INFO'   Uses the PATH_INFO 
| 'QUERY_STRING'  Uses the QUERY_STRING 
| 'REQUEST_URI' Uses the REQUEST_URI 
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO 
| 
*/ 
if (empty($_SERVER['PATH_INFO'])) { 
    $pathInfo = $_SERVER['REQUEST_URI']; 
    $index = strpos($pathInfo, '?'); 
    if ($index !== false) { 
     $pathInfo = substr($pathInfo, 0, $index); 
    } 
    $_SERVER['PATH_INFO'] = $pathInfo; 
} 

$config['uri_protocol'] = 'PATH_INFO'; // allow all characters 

$config['permitted_uri_chars'] = ''; // allow all characters 

$config['enable_query_strings'] = TRUE; // allow all characters 

parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET); 

Thưởng thức :-)