2010-01-11 4 views
10

Ich habe versucht, herauszufinden, wie Sie $ _GET in CI aktivieren.

Es scheint, dass das Framework das $ _GET-Array absichtlich zerstört, und dass die Aktivierung es erfordert, ernsthaft mit den Kernklassen zu basteln. kann jemand sagen, warum das so ist und wie man es überwinden kann?

wohlgemerkt, ich bin auf der Suche nach URI Parsing und Routing, wie sie sind, einfach nur die $ _GET zur Verfügung.

+1

warum Sie $ _GET Variablen verwenden möchten, wenn Sie neu geschrieben URLs verwenden können, um Achi: Arbeit Eve den gleichen Zweck in CodeIgniter? – GSto

+2

Nun, der einzige Grund, warum ich mich selbst akzeptieren würde, wäre die Unterstützung von Legacy-URLs. Ich habe einen Kunden, der sehr gerne zu Friendly-URLs wechseln möchte, die Möglichkeit besteht, ihre "Spaghetticode" -Webseite mit Hilfe eines Frameworks neu zu gestalten, aber Codeigniter erlaubt ihrer neuen Site nicht, mehrere Zehntausend (!) eingehende Links zu verschiedenen Artikeln, Sie verstehen, warum das inakzeptabel ist :) –

+0

Die neue Lösung ist die Verwendung von [CodeIgniter Reactor] (https://bitbucket.org/ellislab/codeigniter-reactor), der GET ordnungsgemäß unterstützt. –

Antwort

14

Fügen Sie den Anwendungsbibliotheken die folgende Bibliothek hinzu. Sie überschreibt das Verhalten der Standard-Input-Bibliothek zum Löschen des $ _GET-Arrays. Es ermöglicht eine Mischung aus URI-Segmenten und Abfragezeichenfolgen.

application/Bibliotheken/MY_Input.php

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

Es ist auch notwendig, einige Konfigurationseinstellungen zu ändern. Die uri_protocol-Einstellung muss in PATH_INFO geändert werden und das '?' Zeichen muss zur Liste der erlaubten Zeichen im URI hinzugefügt werden.

application/config/config.php

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

Es ist dann möglich, Werte in durch die Query-String übergeben zuzugreifen.

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

Die Verwendung von PATH_INFO scheint nicht auf Windows XAMPP-Installationen zu funktionieren. –

+1

Wie bei CodeIgniter 2.x ist $ this-> allow_get_array jetzt $ this -> _ allow_get_array. – jorisw

+0

In CodeIgniter 2.x sehe ich nicht, warum Sie diese Methode überhaupt verwenden müssen, weil in 2.x '$ _GET' Parameter standardmäßig aktiviert sind. Von config.php in CodeIgniter 2.x: "Standardmäßig aktiviert CodeIgniter den Zugriff auf das $ _GET-Array. Wenn Sie es aus irgendeinem Grund deaktivieren möchten, setzen Sie 'allow_get_array' auf FALSE." –

9

Vom CodeIgniter's manual about security:

GET, POST und Cookie-Daten

GET-Daten einfach durch CodeIgniter, da das System nicht anerkannt werden verwendet Segmente URI statt herkömmliche URL Query-Strings (es sei denn, Sie haben die Option Abfragezeichenfolge in Ihrer Konfigurationsdatei aktiviert). Das globale GET-Array ist nicht durch die Input-Klasse während Systeminitialisierung Initialisierung festgelegt.

Lesen durch diese forum entry for possible solutions (wird von halb nach unten Seite 1 interessant).

+0

Wer auch immer runtergeregelt wird, könnte zumindest einen Kommentar hinterlassen, der erklärt warum. Die Antwort ist richtig und bietet Alternativen in dem gegebenen Link. – Gordon

+0

Es war nicht ich: -S –

1

On Server, ohne PATH_INFO (wie mir) versuchen Sie dies:

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

Sie kann es einfach so:

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

Ich habe nicht genug Ruf Kommentar, aber Phil Sturgeon's answer above ist der Weg zu gehen, wenn für Sie leicht zu Codeigniter Reactor wechseln ist.

Sie können auf die Abfragezeichenfolge zugreifen, indem Sie $ _GET oder $ this-> input-> get() verwenden, ohne die MY_Input-Überschreibung verwenden oder die Datei config.php ändern zu müssen.

1

Ich hatte Erfolg mit dieser einzelnen Zeile in meinem Controller.Es reparses im Grunde die URL ohne auf spezielle CodeIgniter Einstellungen unter Berufung:

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

0

Nie $ _GET mit CI verwendet, besser Skriptlogik verwenden POST oder $ this-> uri-> Segment() zu ändern, dann aktiv für mich $ _GET params

0

von Beitrag: CodeIgniter PHP Framework - Need to get query string

Hier ist ein voll funktionierendes Beispiel dafür, wie querystrings in CodeIgnitor zu ermöglichen, wie auf JROX Plattform. Fügen Sie einfach diese Datei auf Ihrer config.php sich unter:

/system/application/config/config.php 

Und dann kann man einfach die querystrings wie normale $ _GET oder die Klasse unter

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

der Code hier mit bekommen es alle zu machen Genießen Sie

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

:-)