这个问题非常奇怪,在本地调试时,$_GET传值没有任何问题。到了服务器上$_GET传值大部分都没有问题,但有几个汉字词组每次传值都是失败,为什么会出现这种情况呢?在服务器上每次传值 女装,女鞋,BB霜,这三个词都是失败,其他的基本都可以,大家感兴趣的可以请帮我诊断一下,在此感谢大家了,这个问题困扰我快一个月了,一直在看代码可能水平有限,一直没能解决,求助高手帮忙。非常感谢测试网址 http://www.592.cc 我使用$_GET对传入值进行打印输出了,大家可以在搜索框里试下,请观察现象,如果运行的慢大家会发现,第一次$_GET输出的是qsearch 和catid 程序里使用浏览器地址跳转方式的,第二次输出的应该是截取的值,但是一遇到上面提的三个词就截取不到,$_GET数组就置为空了,不明白是怎么回事。再次谢谢大家。
souce_lis.phpt处理文件<?php
/**
 * function.php文件又包含sysfunction.php文件,此中进行url传值的各参数截获,要理解下面代码先了解此文件
 */
require_once 'function.php';
print_r($_GET);
$catid = intval(var_request("catid","0")); //取得下拉搜索所选择的栏目id,下面生成搜索时的链接就有用到
$page = var_request("page","0"); 
$sort = var_request("sort","commissionNum_desc"); 
$sortnum = var_request("sortnum",""); //获得排序数字,不算真正意义上的传值,是属于截取获值
if($sortnum=="0")$sort="commissionNum_desc"; //根据排序数字转换为排序字符串参与下面程序获取指定排序方法后的内容
if($sortnum=="1")$sort="credit_desc"; 
if($sortnum=="2")$sort="price_desc"; 
if($sortnum=="3")$sort="price_asc"; 
if($sortnum=="4")$sort="delistTime_desc"; 
$sp = var_request("sp","1"); //起始价格
$ep = var_request("ep","100000"); //结束价格
$cat_name = ""; //定义默认值  在 $q 取不到值的情况下 就变成这个栏目名了$qserach = urldecode(var_request("qserach","")); if($qserach!=""){ 
    $q = $qserach; 

if($qserach!="" && $weijingtai){ 
    redirect_to($rootroad."/".$wjtpagelist.$catid."-0-1-100000-".$qstr.$wjtpagehz); 
} if($weijingtai){ 
    $q = getcnstr(var_request("q","")); 
}else{ 
    $q = urldecode(var_request("q","")); 

$q = setsplitkeyword($searchkeypb,$q,""); $qstr = $q; //赋值 链接url中的组成部分 这里还是普通文字
if($weijingtai){ //伪静态 时 通过关键词链接操作时 
    $qstr = setcnstr($qstr); //对url链接中的字符编码 用于附加到链接 这个变量在list.php中要用到
} if(checkpingbi($catidpb,$catid)){ 
    exit("alert('对不起,该类别已被屏蔽。');location.href='".$sitetitleurl."';"); 

?>
function.php文件<?php
/**
 * 前台函数页
 */
error_reporting(0);
//error_reporting(E_ALL);
date_default_timezone_set('Asia/Shanghai');
require_once "application.php";//反序列化和写入序列化后的文件
require_once "data/configdata.php";//配置文件
require_once 'Taoapi.php';
$applicationarray = array ();//初始化
$applicationarray = application("",ROOT."applicationdate.php");//读取应用配置的数据/**
 * 引入系统函数
 */
require_once 'sysfunction.php';if($weijingtai=="1") {
    mod_rewrite();
}$read_data_num = 0;//只在Taoapi.php中154行有此变量调用
$arr_app = getoneapp();//获得 app
$Taoapi_Config = Taoapi_Config::Init();
$Taoapi_Config->setTestMode(false) ->setVersion(2) ->setAppKey($arr_app[0]) ->setAppSecret($arr_app[1]);
 
$Taoapi = new Taoapi;
$Taoapi->Cache->setCacheTime($setCacheTime);//缓存时间
 
if((time() % 500)==0)//这句的意思实际是每隔500秒 如果恰好有访问者访问的页面是调用此文件的 则会触发执行一次删除操作;
{  
    deldir("Apicache",$setCacheTime*60*60);

;
?>
sysfunction.php
<?php
/**
 * 系统函数页
 */
/**
 * url 64位加密 
 */
function url_base64_encode($str) { 
    if($str=="") return "";
    $code=base64_encode($str);
    $code=str_replace('+',"!",$code);//用!替换+
    $code=str_replace('/',",",$code);
    $code=str_replace('=',"",$code);
    return $code;

/**
 * url 64位解密
 */
function url_base64_decode($code) { 
    if($code=="") return "";
    $code=str_replace("!",'+',$code);//用+替换!
    $code=str_replace(",",'/',$code);
    $str=base64_decode($code);
    return $str;
}  
/**
 * 伪静态处理
 */
function mod_rewrite(){ 
    global $_GET;
    global $wjtpagelist;
    global $wjtpageshop;
     if(isset($_SERVER["REQUEST_URI"])){ 
         $nav = $_SERVER["REQUEST_URI"];//域名之后的部分
    }else{ 
        if(isset($_SERVER["PATH_INFO"])){ 
            $nav = $_SERVER["PATH_INFO"];// .php 之后的部分 不含.php 含/
        } 
    } 
    if(!isset($nav)){ 
        return;
    } 
    if(strpos("---".$nav,"?")){ //如果寻找到? 
        return;//其实不能这样判断 因为如果在位置strpos返回的是位置,如果?在位置0处,就没法判断,不过这里加了前置---
    } 
    if(strpos("---".$nav,".php/")==0){ //如果寻找到 .php/ 所处的位置是0 的时候
        return;
    } 
    $script_name = $_SERVER["SCRIPT_NAME"];// 域名 和.php 之间的部分 含.php
    $arr = explode(".htm",$nav);//使用.htm分割url字符串,第二个元素是html后的l    if(count($arr)>1){ //***这一段暂时没发现有什么用***
        $nav = $arr[1];
    }     $nav = $arr[0];//去除.html后缀的部分    if(substr($nav,0,1)=="/"){ 
        $nav = substr($nav,1);//去掉开头的/号
    }else{ 
        return;
    } 
    $vars = explode("/",$nav);//获得'/'分割后的数组
    $vars = $vars[count($vars)-1];//获得主体部分
    $vars = explode("-",$vars);//获得主体部分里'-'分割后的数组    /**
     * 商品展示页
     */    
    if(strpos($script_name,"product.php")>0){ 
    $_GET["iid"]=$vars[0];//数字部分
    return $_GET;
    }    /**
     * 列表页
     */         
    if(strpos($script_name,"list.php")>0 && count($vars)>0){ 
        if(isset($vars[0]) && $vars[0]!="") $_GET["catid"]= $vars[0];
        if(isset($vars[1])) $_GET["sortnum"] = $vars[1];
        if(isset($vars[2])) $_GET["sp"] = $vars[2];
        if(isset($vars[3])) $_GET["ep"] = $vars[3];
        if(isset($vars[4])){ //实际获得的是导航热点关键词的值,搜索框里输出显示的就是这个值
                $_GET["q"] = $vars[4];//给GET数组赋值,这样才能传出去
        }
        if(isset($vars[5])) $_GET["page"] = $vars[5];//截取页码
        return $_GET;
    } 
      
    return $_GET;

/**
 * 获得GET或POST的值
 */
function var_request($key, $default){ 
    $value = $default;
    if(isset($_GET[$key])){ 
        $value = $_GET[$key];
    } 
    if(isset($_POST[$key])) { 
        $value = $_POST[$key];
    } 
    if($value=="") $value = $default;
    return $value;

/**
 * 重定向
 */
function redirect_to($url) { 
    echo '<meta http-equiv="refresh" content="0;url='.$url.'">';
    exit;
} //获取一个app 在function.php使用  这里面的文件路径明明是有问题为什么这样却可以指向正确呢
function getoneapp(){ 
    global $ArrayAppKey;//存在于配置文件configdata.php中
    global $ArrayAppSecret;
    $appkey_arr = explode(",",$ArrayAppKey);
    $appsecret_arr = explode(",",$ArrayAppSecret);
    if(application("nowapp",ROOT."appnum.php")==""){ //当前APP位置为空的情况
        setapplication("nowapp","0",ROOT."appnum.php",true);//默认当前APP赋值为0
    } 
    $i = application("nowapp",ROOT."appnum.php");//$i取的是当前APP在数组中的位置
    if($i>count($appkey_arr)-1){ //这个意思是有删除情况出现了
        $i = count($appkey_arr)-1;//这样就是取数组中最后一个,因为数组键值是0开始的,通过这样保证删除APP时同步
        setapplication("nowapp",$i,ROOT."appnum.php",true);//写入位置键值
    } 
    $arrayapp = array();//赋初值
    $arrayapp[0] = $appkey_arr[$i];//appkey
    $arrayapp[1] = $appsecret_arr[$i];//appsecret
    return $arrayapp;
}
//在Taoapi.php中使用 和上面的函数很类似
function getoneappChange(){ 
    global $ArrayAppKey;
    global $ArrayAppSecret;
    $appkey_arr = explode(",",$ArrayAppKey);
    $appsecret_arr = explode(",",$ArrayAppSecret);
    if(application("nowapp",ROOT."appnum.php")==""){ 
        setapplication("nowapp","0",ROOT."appnum.php",true);
    } 
    $i = application("nowapp",ROOT."appnum.php");
    if(count($appkey_arr)>1){ //有两个以上APP时
        $i++;
        if($i==count($appkey_arr)){//当前使用的APP键值始终应该小于数组个数的,如果相等了说明有错 
            $i=0;//设为默认值0
        } 
    } 
    setapplication("nowapp",$i,ROOT."appnum.php",true);
    $arrayapp = array();
    $arrayapp[0] = $appkey_arr[$i];
    $arrayapp[1] = $appsecret_arr[$i];
    return $arrayapp;
}
//编码转换
function Newiconv($_input_charset,$_output_charset,$input ) { 
    $output = "";
    if(!isset($_output_charset) )
    $_output_charset = $_input_charset;
    if($_input_charset == $_output_charset || $input == null) { 
        $output = $input;
    } elseif (function_exists("mb_convert_encoding")){ 
        $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
    } elseif(function_exists("iconv")) { 
        $output = iconv($_input_charset,$_output_charset,$input);
    } else die("对不起,你的服务器系统无法进行字符转码.请联系空间商。");
    return $output;

//关键词链接,商品内容页锚文本替换也是这个起作用的
function getsearchurl($keyword){ 
    global $weijingtai;
    global $rootroad;
    global $wjtpagelist;//伪静态列表
    global $wjtpagehz;//伪静态后缀
    global $wjturlencode;//url编码形式
    $keyword = str_replace("/"," ",$keyword);
    if($weijingtai){ 
        return $rootroad."/".$wjtpagelist."0-0-1-100000-".setcnstr($keyword).$wjtpagehz;
    }else{ 
        return $rootroad."/list.php?q=".urlencode($keyword);
    } 

//字符串编码
function setcnstr($str) { 
    global $wjturlencode;//这个变量在function.php文件里定义
    if($wjturlencode=="base64"){ //默认配置是这个
        return url_base64_encode($str);
    } 
    if($wjturlencode=="true"){ 
        return urlencode($str);
    } if($wjturlencode=="false"){ 
        return ($str);
    } 

//字符串解码
function getcnstr($str) {
    global $wjturlencode;
    if($wjturlencode=="base64"){ 
        return url_base64_decode($str);
    }
    if($wjturlencode=="true"){ 
        return urldecode($str);
    } 
    if($wjturlencode=="false"){ 
        return urldecode($str);
    } 
}
?>

解决方案 »

  1.   

    http://www.592.cc/list.php?catid=0&sortnum=0&sp=1&ep=10000&q=女装我又试了下 在浏览器地址栏直接输入上述链接,$_GET可以打印出全部取到的内容
      

  2.   

    你本地的和服务器的配置不一样 初步估计是 register_globals用phpinfo()比较下 
      

  3.   

    结贴:确实是编码的问题,感谢各位,解决方法是:urlencode两次后传值 需要的时候再urldecode两次就可以了,具体机理还不太清楚