English 中文(简体)
在CodeIgniter中,URL中的GET参数
原标题:
  • 时间:2008-12-02 17:05:36
  •  标签:

我知道codeIgniter默认关闭GET参数。

但是通过在POST中完成所有内容,如果您在表单提交后按返回键,您不会因为重新发送数据请求而感到烦恼吗?

这让我很烦,但我不确定是否仅出于这个原因要允许GET。

允许使用GET参数也是如此重要的安全问题吗?

最佳回答

当我第一次开始使用CodeIgniter时,不使用GET方法确实让我感到困扰。但是后来我意识到,你可以通过使用内置的URI类来操纵URI来模拟GET参数。这太棒了,可以让你的URL看起来更好。

或者如果你真的需要GET请求工作,你可以把这个放到你的控制器中:

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

这将把变量放回GET数组中。

问题回答

这个函数与post函数完全相同,只是获取get数据:

$this->input->get()

将此翻译为中文:https://www.codeigniter.com/user_guide/libraries/input.html https://www.codeigniter.com/user_guide/libraries/input.html

这对我有用:

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

$params数组包含在问号字符后传递的参数。

现在从 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; 

您只需要在config.php中启用它,然后可以使用$this->input->get( param_name );来获取参数。

如果您的需求需要使用第一个参数。

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

你需要第二个参数使用它。

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

请将此翻译为中文:您的许多参数增强了参数。

parse_str($_SERVER[ QUERY_STRING ],$_GET); ONLY worked for me after I added the following line to applications/config/config.php:

$config [ uri_protocol ] = "PATH_INFO"; $config [ uri_protocol ] =“PATH_INFO”;

我发现在CI中$_GET参数并不是真正必要的,但是Facebook和其他网站将GET参数转储到链接的末尾,这将导致我的CI网站出现404错误!通过在config.php文件中添加上述代码行,这些页面得以正常运行。希望能够帮到大家!

将此翻译成中文:(来自https://web.archive.org/web/20101227060818/http://www.maheshchari.com/work-to-get-method-on-codeigniter/) 在Codeigniter框架中,我发现在那里调用一个获取方法非常有用,并且它也很容易实现。如果您没有使用Codeigniter,您可能需要了解第一次Codeigniter才能理解。在Codeigniter中,您可以为所有模型编写一个抽象类来执行任何通用操作。在此模型基类中,可以包括通用的Get()方法来获取所有模型中的所有数据。 例如,让我们考虑有两个模型“users_model”和“products_model”。对于每个模型,我们可以编写包含此Get()函数的抽象模型类,并在两个模型中使用该类,如下所示: class MY_Model extends Model { protected $_table = ''; public function __construct() { parent::__construct(); } function Get($condition = array(), &$result_rows = null) { $query = $this->db->get_where($this->_table, $condition); if ($query->num_rows() > 0) { if ($result_rows == null) { return $query->row_array(); } else { $result_rows = $query->result_array(); return true; } } else { return false; } } } 然后可以使用这些模型类,如下所示: class Users_model extends MY_Model { protected $_table = 'users'; public function __construct() { parent::__construct(); } } class Products_model extends MY_Model { protected $_table = 'products'; public function __construct() { parent::__construct(); } } 现在,您可以从这些模型调用获取方法并获取所需的数据,如下所示: $this->load->model('users_model'); $users = $this->users_model->Get(); #Returns all users $users = $this->users_model->Get(array('user_id'=>1)); #Returns user with user_id 1 $this->load->model('products_model'); $products = $this->products_model->Get(); #Returns all products $products = $this->products_model->Get(array('product_id'=>2)); #Returns product with product_id 2 我希望这对实现代码重用并增加代码可读性有所帮助。

You can enable query strings if you really insist. In your config.php you can enable query strings:

$config[ enable_query_strings ] = TRUE;

For more info you can look at the bottom of this Wiki page: http://codeigniter.com/user_guide/general/urls.html

不过,学习如何使用干净的URL更好的建议。

我的参数是?uid=4,可以用以下代码获得:

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

We cannot translate "wis" as it is not a meaningful or recognizable word in English. Please provide more context or a complete sentence.

如果您提交表单后按返回键,重发数据请求是不是让您感到恼火?

您可以通过从处理表单提交的页面重定向到成功页面来解决此问题。最后一个“操作”是加载成功页面,而不是表单提交,这意味着如果用户执行F5操作,它只会重新加载该页面,而不会再次提交表单。

allesklar:这有点误导性,因为脚本和机器人几乎可以像发送常规请求一样轻松地POST数据。这不是什么秘密,它是HTTP的一部分。

A little bit out of topic, but I was looking for a get function in CodeIgniter just to pass some variables between controllers and come across Flashdata.
see : http://codeigniter.com/user_guide/libraries/sessions.html
Flashdata allows you to create a quick session data that will only be available for the next server request, and are then automatically cleared.

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: 我的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 */

GET参数被Web浏览器缓存,而POST不被缓存。因此,使用POST时不必担心缓存,这就是通常被推荐的原因。

你可以试试这个。

$this->uri->segment(  );

更简单的方法是:

curl -X POST -d "param=value&param2=value" http://example.com/form.cgi

那个插件还是挺酷的。

做以下事情。对我有效。我从选择框和另一个文本框中取出值。然后在单击按钮时,我使用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;
        }
    });
});

以上代码对我起作用。





相关问题
热门标签