thinkphp里url参数值有中文
web ThinkPHP 2018-10-29 2921 0
关于本站

“最难不过坚持”

本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作

有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339

6443128 2613 39
最新评论
https://jueru.net/
评 留言
:weixiao:
评 留言
:shuijiao: :weiqu: :zhenbang: :leng:
评 留言
:yiwen: :yiwen: :yiwen: :yiwen:
评 EasySass: could not generate CSS file. See Output panel for details.
这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
评 TP6模型事件-查询后onAfterRead不好用
文章标签更多
ThinkPHP (254)
Mysql (58)
DedeCms (33)
jQuery (67)
证件照 (1)
setInc (4)
setDec (4)
onclick (5)
打开边栏(ESC) 关闭边栏(ESC)

thinkphp里url参数值有中文,如http://taotaoit.com/web/白.html,怎么也获得不到参数值。

刚开始以为是thinkphp路由规则有问题,查了很久也没解决。

后来以为,汉字转换成了UrlEncode编码,然后就用UrlDecode解码,还是不行。

I("webColor")就没有接收到值。


继续查找发现,I方法好像是存在bug,接受不到值,于是改$_GET["webColor"]接收,有值但是乱码,所以用iconv转码,然后就正常接收参数了。代码如下:


$webColor = iconv("gb2312","utf-8",$_GET["webColor"]); //从gb2312编码转为utf-8编码



20190510


后台搜索汉字也出现同样的情况,而且更复杂。

情况说明:

1,第一次点查询按钮搜索,传递参数方式是post,参数编码是utf-8;点击翻页,传递参数方式是get,不知道为什么参数编码变成了gb2312;

2,接收的参数需要在sql语句中进行模糊查询,还需要通过控制器返回到视图中显示;

解决方案:

I()函数,可以接收utf-8编码的参数,接收gb2312编码的参数出错,所以直接用$_REQUEST接收参数,包含post,get两种方式。然后判断参数的编码类型,不是utf-8编码的参数,转成utf-8编码。由于翻页时,传递的参数是用I()传递的,I()接收的参数是个一维数组,所以把数组中涉及汉字的查询参数,替换成转码后的参数,再传递给分页函数就可以了。

具体解决如下:

ArticlesModel.class.php修改的代码


$articleTitle = $_REQUEST["articleTitle"]; // 第一次点查询的时候,传递参数是post,之后点分页的时候是get,所以单独用$_POST和$_GET都不行,I()接收不到url编码的汉字,所以只能用$_REQUEST
		if($articleTitle != ''){
			// echo '1:' . $articleTitle . '<br>';
			$encode = mb_detect_encoding($articleTitle, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); // 判断接收到的字符串编码
			if ($encode != 'UTF-8'){
				// 如果不是UTF-8编码,则转成UTF-8编码(针对之后的分页),如果是,继续执行(针对第一次查询)
				$articleTitle = iconv("gb2312",'UTF-8',$articleTitle); // gb2312转成UTF-8编码
				// echo '2:' . $articleTitle . '<br>';
			}
		}
		// echo $encode; // EUC-CN    是gb2312编码的一种表示方法		
		$articleContent = $_REQUEST["articleContent"];
		if($articleContent != ''){
			$encode = mb_detect_encoding($articleContent, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); 
			if ($encode != 'UTF-8'){
				$articleContent = iconv("gb2312",'UTF-8',$articleContent); // gb2312转成UTF-8编码
			}
		}
ArticlesAction.class.php修改的代码:



$canshu = I(); // 翻页是用到的参数,如果articleTitle和articleContent不为空的话,则把它们替换成转码之后的值,这样翻页就不会丢失参数了		
		$articleTitle = $_REQUEST["articleTitle"];
		if($articleTitle != ''){
			$encode = mb_detect_encoding($articleTitle, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
			if ($encode != 'UTF-8'){				
				$articleTitle = iconv("gb2312",'UTF-8',$articleTitle);
			}
			$canshu['articleTitle'] = $articleTitle;
		}	
		$this->assign('articleTitle',$articleTitle);
		$articleContent = $_REQUEST["articleContent"];
		if($articleContent != ''){
			$encode = mb_detect_encoding($articleContent, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); 
			if ($encode != 'UTF-8'){
				$articleContent = iconv("gb2312",'UTF-8',$articleContent); // gb2312转成UTF-8编码
			}
			$canshu['articleContent'] = $articleContent;
		}
		$this->assign('articleContent',$articleContent);
$pager = new \Think\Page($page['total'],$page['pageSize'],$canshu);// 实例化分页类 



20191114

汉字“小”“写”上述方法不管用,不知道为什么

版权声明:本篇文章来源于网络。 来源链接

相关推荐
thinkphp 3.2.3 Runtime\Logs日志文件太多怎么关闭日志功能
ThinkPHP | 2019-11-05 6830
'LOG_RECORD' => false, // 默认不记录日志 'LOG_TYPE' => 'File', // 日志记录类型 默认为文件方式 'LOG_LEVEL' => 'EMERG,ALERT,CRIT,ERR',// 允许记录的...
thinkphp3.2.3打印sql语句
ThinkPHP | 2018-12-29 5418
方法一 echo M()->getLastSql(); 方法二 echo M()->_sql();
评论:0条
评论加载中...
发表评论