用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2765|回复: 12
收起左侧

[版本 3.x] $this->input->get()的获取数据不全 求教大神们!!!

[复制链接]
发表于 2017-3-29 11:36:55 | 显示全部楼层 |阅读模式
信息如下:config.php
$config['uri_protocol'] = 'PATH_INFO';$config['allow_get_array'] = TRUE;
Nginx配置:location / {
    root /home/$domain/git/backend/;

    try_files      $uri $uri/ /index.php?$query_string;
        fastcgi_pass   unix:/var/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  SERVER_NAME      backend.xxxx.com;
        fastcgi_param  UNIQUE_ID        $uniqueid;
        fastcgi_param  PHP_ROOT         /home/$domain/git/backend/;
    }

这是我发现的get取的数据不全:(我访问的URL:http://backend.xxxx.org/register/test?cellphone=138xxxxxxxx&pic_code=11)
public function test(){
   $a=$this->input->get('cellphone');
   $b=$this->input->get('pic_code');
   var_dump($a,$b) ;exit;
结果:string(11) "13821783943" NULL
然后我追踪到问题到URI.PHP  _parse_request_uri()方法中 206行左右var_dump('111======',$_SERVER['REQUEST_URI']);
$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);
var_dump('222======',$uri);
$query = isset($uri['query']) ? $uri['query'] : '';
var_dump('333======',$query);exit;
$uri = isset($uri['path']) ? $uri['path'] : '';
string(9) "111======"
string(52) "/register/test?cellphone=138xxxxxxxx&pic_code=11"
string(9) "222======"
array(5) {
   ["scheme"]=>
  string(4) "http"
   ["host"]=>
  string(5) "dummy"
   ["path"]=>
  string(14) "/register/test"
   ["query"]=>
  string(22) "cellphone=138xxxxxxxx&"
   ["fragment"]=>
  string(14) "38;pic_code=11"
}
string(9) "333======"
string(22) "cellphone=138xxxxxxxx&"

这里$query的数据 是在$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); 发生变化的,,,我就是不明白$uri中的["fragment"]=> string(14) "38;pic_code=11"是怎么来的?    求教大神们!!!!

 楼主| 发表于 2017-3-30 11:12:05 | 显示全部楼层
本帖最后由 phillu 于 2017-3-30 11:13 编辑
Hex 发表于 2017-3-30 10:44
感觉可能是配置有问题,你用这个 nginx 配置试试,CI 中国用的就是类似这样,应该可以正确获取 QUERY_STRI ...

我Nginx配置

server {

    listen 80;
    listen 443 ssl;
    server_name ~^(?<domain>\w+).driver-backend.xxxx.org$ ;
    index index.html index.php

    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/alphassl.xxxx.org.ngx.crt;
    ssl_certificate_key  /etc/pki/tls/private/alphassl.xxxx.org.nopass.key;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;


    root /home/$domain/git/driver-backend/;

    gzip              on;
    gzip_min_length   1000;
    #gzip_proxied     expired no-cache no-store private auth;
    gzip_proxied      any;
    gzip_types        text/plain application/x-javascript text/css application/xml;
    gzip_disable      "MSIE [1-6]\.";
    gzip_http_version 1.0;

    error_log  /var/log/nginx/driver-backend_error_log;
    access_log /var/log/nginx/${domain}_driver-backend_access_log main;

    error_page 404 /error/404.php;
    rewrite ^/error/404.php /error/404.php break;

    if ( $scheme = https ) {
        rewrite !^/(payment|login|register|ajax|images|order|brand\/payment|brand\/ajax|i|corp|touch)/ http://www.xxxx.com/$1/ redirect;
    }



    location / {
        root /home/$domain/git/driver-backend/;

        try_files      $uri $uri/ /index.php$uri?$args;
        fastcgi_pass   unix:/var/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            set $real_script_name $1;
            set $path_info $2;
        }

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $path_info;
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param  SERVER_NAME      driver-backend.xxxx.com;
        fastcgi_param  UNIQUE_ID        $uniqueid;
        fastcgi_param  PHP_ROOT         /home/$domain/git/driver-backend/;
    }

    location ~* \.(js|css|ico|gif|jpg|jpeg|png|swf|htc|xml|mp3|otf|svg|ttf|woff|xap|txt|eot|bin)$ {
        root /home/$domain/git/driver-backend/;
    }

    location ~ ^/(app|bd|demo|job|intro|car|service|help|xw|car|service) {
        root /home/y/var/www/cms/cms/page/;

        try_files $uri $uri/index.html $uri/index.php =404;
        fastcgi_pass   unix:/var/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  UNIQUE_ID        $uniqueid;
        fastcgi_param  PHP_ROOT         /home/$domain/git/driver-backend/;
    }

    location /cms {
        root /home/y/var/www/cms/;

        try_files $uri $uri/index.html $uri/index.php =404;
        fastcgi_pass   unix:/var/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  UNIQUE_ID        $uniqueid;
        fastcgi_param  PHP_ROOT         /home/$domain/git/driver-backend/;
    }
}

 楼主| 发表于 2017-3-30 10:12:50 | 显示全部楼层
本帖最后由 phillu 于 2017-3-30 10:34 编辑
Hex 发表于 2017-3-29 17:02
你把打印的结果 var_dump 一下我看看。

另外,你把 & 替换了,肯定可以啊,$this->input->server('QUE ...

这个是$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); 打出来的
array(5) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(5) "dummy"
  ["path"]=>
  string(14) "/register/test"
  ["query"]=>
  string(22) "cellphone=138xxxxxxxx&"
  ["fragment"]=>
  string(14) "38;pic_code=11"
}
这个是parse_url('http://dummy/register/test?cellphone=138xxxxxxxx&pic_code=11') 打出来的
array(4) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(5) "dummy"
  ["path"]=>
  string(14) "/register/test"
  ["query"]=>
  string(33) "cellphone=138xxxxxxxx&pic_code=11"
}

还有我用preg_replace('&','&',$_SERVER['REQUEST_URI']),,,报错  说找不到以&;

这个是$this->input->server('QUERY_STRING', false)打出来的
string(16) "QUERY_STRING===="
string(22) "cellphone=138xxxxxxxx&"
发表于 2017-3-30 10:44:29 | 显示全部楼层
phillu 发表于 2017-3-30 10:12
这个是$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); 打出来的
array(5) {
  ["scheme"]=>

感觉可能是配置有问题,你用这个 nginx 配置试试,CI 中国用的就是类似这样,应该可以正确获取 QUERY_STRING:

  1. location / {
  2.   try_files $uri $uri/ /index.php$uri?$args;
  3. }
  4. location ~ ^(.+\.php)(.*)$ {
  5.   fastcgi_pass unix:/var/run/php-fpm/www.sock;
  6.   fastcgi_index index.php;
  7.   include fastcgi_params;

  8.   set $path_info "";
  9.   set $real_script_name $fastcgi_script_name;
  10.   if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
  11.     set $real_script_name $1;
  12.     set $path_info $2;
  13.   }

  14.   fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
  15.   fastcgi_param SCRIPT_NAME $real_script_name;
  16.   fastcgi_param PATH_INFO $path_info;
  17. }
复制代码
 楼主| 发表于 2017-3-29 11:39:08 | 显示全部楼层
还是我哪里配置的不正确呢?
发表于 2017-3-29 14:49:34 | 显示全部楼层
在控制器构造函数里执行这句话试试:

PHP复制代码
parse_str($this->input->server('QUERY_STRING', false), $_GET);
复制代码
 楼主| 发表于 2017-3-29 14:57:41 | 显示全部楼层
Hex 发表于 2017-3-29 14:49
在控制器构造函数里执行这句话试试:

还是不行的   他把url中&给实体化了   然后再parse_url() 后就把#当作fragment了,,,,,,,我想把URI.php里$query = isset($uri['query']) ? $uri['query'] : '';  改成$query = isset($_SERVER['QUERY_STRING']) ?$_SERVER['QUERY_STRING'] : '';   因为初次使用 这样改  不知道会不会 造成其他功能影响
发表于 2017-3-29 15:05:03 | 显示全部楼层
phillu 发表于 2017-3-29 14:57
还是不行的   他把url中&给实体化了   然后再parse_url() 后就把#当作fragment了,,,,,,,我想把URI.php里$ ...

那你就做一个 urldecode 或者把 &#38 替换成 & 试试?
 楼主| 发表于 2017-3-29 15:31:20 | 显示全部楼层
Hex 发表于 2017-3-29 15:05
那你就做一个 urldecode 或者把 &#38 替换成 & 试试?

还是  不可以    请教 源码里  $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);  和 parse_url('http://dummy/register/test?cellphone=13821783943&pic_code=11'); 这么写打出来的结果为什么不一样呢?  
发表于 2017-3-29 17:02:19 | 显示全部楼层
phillu 发表于 2017-3-29 15:31
还是  不可以    请教 源码里  $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);  和 parse_u ...

你把打印的结果 var_dump 一下我看看。

另外,你把 &#38 替换了,肯定可以啊,$this->input->server('QUERY_STRING', false) 这个取出来的是什么?
 楼主| 发表于 2017-3-30 11:07:40 | 显示全部楼层
Hex 发表于 2017-3-30 10:44
感觉可能是配置有问题,你用这个 nginx 配置试试,CI 中国用的就是类似这样,应该可以正确获取 QUERY_STRI ...

额   Access denied. 了

本版积分规则