web-dev-qa-db-fra.com

OBTENEZ des paramètres dans l'URL avec CodeIgniter

Je sais que codeIgniter désactive les paramètres GET par défaut.

Mais en ayant tout fait dans POST, ne vous ennuyez-vous pas de renvoyer les demandes de données si jamais vous appuyez sur après la soumission d'un formulaire?

Cela m'énerve, mais je ne sais pas si je veux autoriser GET uniquement pour cette raison.

Est-ce un problème de sécurité si important d'autoriser également les paramètres GET?

48
Jon Winstanley

Lorsque j'ai commencé à travailler avec CodeIgniter, ne pas utiliser GET m'a vraiment bouleversé. Mais ensuite, j'ai réalisé que vous pouvez simuler les paramètres GET en manipulant l'URI en utilisant la fonction intégrée classe URI . C'est fantastique et cela rend vos URL plus belles.

Ou si vous avez vraiment besoin que les GET fonctionnent, vous pouvez les mettre dans votre contrôleur:

parse_str($_SERVER['QUERY_STRING'], $_GET); 

Ce qui remettra les variables dans le tableau GET.

57
Jelani Harris

Cela a fonctionné pour moi:

<?php
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'], $params);
?>

$params tableau contient les paramètres passés après le? personnage

13
Roberto Gerola

Maintenant, cela fonctionne bien à partir de CodeIgniter 2.1.0

    //By default CodeIgniter enables access to the $_GET array.  If for some
    //reason you would like to disable it, set 'allow_get_array' to FALSE.

$config['allow_get_array']      = TRUE; 
11
almix

Cette fonction est identique à la fonction post, seule elle récupère les données:

$this->input->get()

https://www.codeigniter.com/user_guide/libraries/input.html

10
Murtaza Baig

Vous devez simplement l'activer dans le fichier config.php et vous pouvez utiliser $this->input->get('param_name'); pour obtenir les paramètres.

8
Sumit

parse_str($_SERVER['QUERY_STRING'],$_GET); N'a fonctionné pour moi qu'après avoir ajouté la ligne suivante à applications/config/config.php:

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

J'ai trouvé que les paramètres $ _GET n'étaient pas vraiment nécessaires dans CI, mais Facebook et d'autres sites vidaient les paramètres GET à la fin des liens qui seraient 404 pour mon site CI !! En ajoutant la ligne ci-dessus dans config.php, ces pages ont fonctionné. J'espère que cela aide les gens!

(depuis http://www.maheshchari.com/work-to-get-method-on-codeigniter/ )

6
Benjamin Sussman

Vous pouvez activer les chaînes de requête si vous insistez vraiment. Dans votre config.php, vous pouvez activer les chaînes de requête:

$config['enable_query_strings'] = TRUE;

Pour plus d'informations, vous pouvez consulter le bas de cette page Wiki: http://codeigniter.com/user_guide/general/urls.html

Pourtant, apprendre à travailler avec des URL propres est une meilleure suggestion.

4
Tomas

"Ne vous ennuyez-vous pas de renvoyer les demandes de données si jamais vous appuyez à nouveau après la soumission d'un formulaire"

vous pouvez contourner ce problème en effectuant une redirection depuis la page qui traite la soumission de votre formulaire vers la page de réussite. la dernière "action" a été le chargement de la page de réussite, pas la soumission du formulaire, ce qui signifie que si les utilisateurs font un F5, il rechargera simplement cette page et ne soumettra plus le formulaire.

2
stef

Si vous avez besoin d'un premier paramètre, utilisez-le.

$this->uri->segment('3');

Et votre besoin d'un second paramètre l'utilise

$this->uri->segment('4');

Demandez à vos nombreux paramètres d'améliorer le paramètre

2
Md.Jewel Mia

MY_Input.php:

<?php
// this class extension allows for $_GET access
class MY_Input extends CI_input {

    function _sanitize_globals()
    {
        // setting allow_get_array to true is the only real modification
        $this->allow_get_array = TRUE;

        parent::_sanitize_globals();
    }

}
/* End of file MY_Input.php */
/* Location: .application/libraries/MY_Input.php */

MY_URI.php:

<?php
/*
 | this class extension allows for $_GET access by retaining the
 | standard functionality of allowing query strings to build the 
 | URI String, but checks if enable_query_strings is TRUE
*/
class MY_URI extends CI_URI{

    function _fetch_uri_string()
    {
        if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
        {
            // If the URL has a question mark then it's simplest to just
            // build the URI string from the zero index of the $_GET array.
            // This avoids having to deal with $_SERVER variables, which
            // can be unreliable in some environments
            //
            //  *** THE ONLY MODIFICATION (EXTENSION) TO THIS METHOD IS TO CHECK 
            //      IF enable_query_strings IS TRUE IN THE LINE BELOW ***
            if ($this->config->item('enable_query_strings') === TRUE && is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
            {
                $this->uri_string = key($_GET);
                return;
            }

            // Is there a PATH_INFO variable?
            // Note: some servers seem to have trouble with getenv() so we'll test it two ways
            $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
            if (trim($path, '/') != '' && $path != "/".SELF)
            {
                $this->uri_string = $path;
                return;
            }

            // No PATH_INFO?... What about QUERY_STRING?
            $path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
            if (trim($path, '/') != '')
            {
                $this->uri_string = $path;
                return;
            }

            // No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
            $path = str_replace($_SERVER['SCRIPT_NAME'], '', (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO'));
            if (trim($path, '/') != '' && $path != "/".SELF)
            {
                // remove path and script information so we have good URI data
                $this->uri_string = $path;
                return;
            }

            // We've exhausted all our options...
            $this->uri_string = '';
        }
        else
        {
            $uri = strtoupper($this->config->item('uri_protocol'));

            if ($uri == 'REQUEST_URI')
            {
                $this->uri_string = $this->_parse_request_uri();
                return;
            }

            $this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
        }

        // If the URI contains only a slash we'll kill it
        if ($this->uri_string == '/')
        {
            $this->uri_string = '';
        }
    }

}
/* End of file MY_URI.php */
/* Location: .application/libraries/MY_URI.php */
1
Brian Temecula

Un peu hors sujet, mais je cherchais une fonction get dans CodeIgniter juste pour passer des variables entre les contrôleurs et rencontrer Flashdata.
voir: http://codeigniter.com/user_guide/libraries/sessions.html
Flashdata vous permet de créer des données de session rapides qui ne seront disponibles que pour la prochaine demande de serveur, puis sont automatiquement effacées.

1
Rwahyudi

mon paramètre est? uid = 4 et l'obtiens avec:

$this->uid = $this->input->get('uid', TRUE);
  echo $this->uid;

wis

1
Ks Sjkjs

Faites ceci ci-dessous. A travaillé pour moi. J'ai pris des valeurs dans une zone de sélection et une autre zone de texte. Ensuite, sur le bouton, j'ai pris toutes les données dans la fonction Javascript et redirigé en utilisant javascript.

//Search Form
$(document).ready (function($){
    $("#searchbtn").click(function showAlert(e){
        e.preventDefault();
        var cat = $('#category').val();
        var srch = $('#srch').val();

        if(srch==""){
            alert("Search is empty :(");
        }
        else{
            var url = baseurl+'categories/search/'+cat+'/'+srch;            
            window.location.href=url;
        }
    });
});

Le code ci-dessus a fonctionné pour moi.

0
JD_bravo

Les paramètres GET sont mis en cache par le navigateur Web, POST ne l'est pas. Donc avec un POST vous n'avez pas à vous soucier de la mise en cache, c'est pourquoi il est généralement préférable.

0
Nick Berardi

Vous pouvez essayer ceci

$this->uri->segment('');
0
Inspire Shahin