2010-01-11 3 views
10

J'ai essayé de comprendre comment activer $ _GET dans CI.

Il semble que le framework détruise délibérément le tableau $ _GET, et que son activation nécessite de sérieuses modifications avec les classes de base. Quelqu'un peut-il dire pourquoi cela est, et comment le surmonter?

attention, je cherche à garder l'analyse URI et le routage comme ils sont, tout simplement avoir $ _GET disponible aussi bien.

+1

pourquoi voulez-vous utiliser des variables $ _GET, lorsque vous pouvez utiliser des URL réécrite Achi avez-vous le même but dans CodeIgniter? – GSto

+2

bien, la seule raison pour laquelle je m'accepterais serait de soutenir les URL héritées. J'ai un client qui aimerait beaucoup passer à des URLs amicales, la possibilité existe de refaire leur site web "code spaghetti" en utilisant un framework, mais codeigniter ne permettra pas à leur nouveau site de supporter plusieurs dizaines de milliers (!) liens entrants à divers articles, vous comprenez pourquoi c'est inacceptable :) –

+0

La nouvelle solution consiste à utiliser [CodeIgniter Reactor] (https://bitbucket.org/ellislab/codeigniter-reactor), qui prend en charge GET correctement hors de la boîte. –

Répondre

14

Ajoutez la bibliothèque suivante à vos bibliothèques d'applications. Il remplace le comportement de la bibliothèque d'entrée par défaut de l'effacement du tableau $ _GET. Il permet un mélange de segments d'URI et de chaîne de requête.

demande /bibliothèques/MY_Input.php

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

Il est également nécessaire de modifier certains paramètres de configuration. Le paramètre uri_protocol doit être changé en PATH_INFO et le '?' le caractère doit être ajouté à la liste des caractères autorisés dans l'URI.

application/config/config.php

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

Il est alors possible d'accéder à des valeurs transmises à travers la chaîne de requête.

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

L'utilisation de PATH_INFO ne semble pas fonctionner sur les installations Windows XAMPP. –

+1

Comme si CodeIgniter 2.x, $ this-> allow_get_array est maintenant $ this -> _ allow_get_array. – jorisw

+0

Dans CodeIgniter 2.x, je ne vois pas pourquoi vous auriez besoin d'utiliser cette méthode, car dans les paramètres 2.x '$ _GET' sont activés par défaut. De config.php dans CodeIgniter 2.x: "Par défaut, CodeIgniter permet d'accéder au tableau $ _GET Si, ​​pour une raison quelconque, vous souhaitez le désactiver, définissez 'allow_get_array' sur FALSE." –

9

De l'CodeIgniter's manual about security:

GET, POST et COOKIE données

données GET est tout simplement interdit par CodeIgniter puisque le système utilise segments URI plutôt que des chaînes traditionnelles de requête d'URL (sauf si l'option de chaîne de requête est activée dans votre fichier de configuration ). Le tableau GET global est non renseigné par la classe Input pendant l'initialisation du système .

Lisez cette forum entry for possible solutions (devient intéressant de la page à mi-chemin vers le bas 1).

+0

Celui qui downvoted cela pourrait au moins laisser un commentaire expliquant pourquoi. La réponse est correcte et fournit des alternatives dans le lien donné. – Gordon

+0

Ce n'était pas moi: -S –

1

Sur le serveur, sans PATH_INFO (comme le mien), essayez ceci:

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

Vous pouvez le mettre comme ceci:

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

Je n'ai pas assez réputation commenter, mais Phil Sturgeon's answer above est la voie à suivre si le passage à Codeigniter Reactor est facile pour vous.

Vous pouvez accéder à la chaîne de requête en utilisant $ _GET ou $ this-> input-> get() sans avoir besoin du remplacement MY_Input ou même en modifiant le fichier config.php.

1

J'ai réussi à utiliser cette ligne unique dans mon contrôleur.Il reparses essentiellement l'URL de requête sans compter sur les paramètres de CodeIgniter spéciaux:

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

0

jamais utilisé _GET $ avec CI, mieux changer la logique de script pour utiliser POST ou $ this-> uri-> segment(), puis actifs _GET $ params pour moi

0

de message: CodeIgniter PHP Framework - Need to get query string

Voici un exemple complet de travail de la façon de permettre querystrings dans CodeIgnitor, comme sur la plate-forme JROX. Il suffit d'ajouter ceci à votre fichier config.php situé à:

/system/application/config/config.php 

Et vous pouvez simplement obtenir les querystrings comme normale en utilisant $ _GET ou la classe ci-dessous

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

Voici le code pour faire tout ce qu'il travail:

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

Profitez :-)