There are questions remain, We'll search for the answers together. But one thing we known for sure,the future is not set!

【原创文章】DEDE后台部分文章内容不显示的原因和解决办法

dedecms 百蔬君 3376℃ 已收录 0评论

这些天在DEDE后台发现一个问题,发现文章的内容页为空白,但是前台打开是有内容的。明明这个升级php到5.4之后标题空白之类的问题之前解决了的啊(具体见此文:升级PHP5.4后dede和帝国发表文章中文标题和内容不识别的解决办法),现在怎么内容空白了呢?

在后台一阵翻腾,发现问题是部分文章有内容,而部分文章无内容!那么这个问题让我意识到,是文章内容字符有问题,从而导致了前端可以显示,而后台文章内容空白。

通过截半判断法,查找到是因为文章里面包含了一个字符“”,从而导致无法显示。这个字符“”和中文状态下的“-”是有差别的!我意识到是之前升级网站系统时候加htmlspecialchars的问题了。

DEDE后台编辑器我使用的是ckeditor,打开显示文章内容的相关php文件\include\ckeditor\ckeditor_php5.php,之前为了使网站适应php5.4,做了优化,相关代码如下:

public function editor($name, $value = "", $config = array(), $events = array())
	{
		$attr = "";
		foreach ($this->textareaAttributes as $key => $val) {
			$attr.= " " . $key . '="' . str_replace('"', '"', $val) . '"';
		}
		$out = "<textarea name=\"" . $name . "\"" . $attr . ">" . htmlspecialchars($value, ENT_COMPAT, 'GB2312') . "</textarea>\n";
		if (!$this->initialized) {
			$out .= $this->init();
		}

这是我们在网上看到的绝大多数的解决dede与php5.4的兼容办法。

开始我还以为是这个函数转化html语言的问题,跑去数据库一看,文章内容完整保存在数据库,看来仅仅是编辑器这边读出数据并显示的问题了。

仔细研究了php的htmlspecialchars函数。

htmlspecialchars($value, ENT_COMPAT, 'GB2312')这句代码有2个作用,第一个作用就是把value中的把预定义的字符转换为 HTML 实体, ENT_COMPAT的限制作用是只转换双引号。第二个就是使编码value的内容为gb2312编码,但是这里的问题来了,它如果遇到了无效编码,那么就会返回一个空的字符串。很显然,我们这里就是遇到了无效编码“”,所以返回为空!

解决办法也很简单,就是忽略无效的编码。将上面的语句htmlspecialchars($value, ENT_COMPAT, 'GB2312')修改为htmlspecialchars($value, ENT_IGNORE, 'GB2312')

这样就解决问题了,后台文章内容都显示了。

解决问题的方法并不难,要从现象找出内在问题所在,这才是难点!

 

 

转载请注明:百蔬君 » 【原创文章】DEDE后台部分文章内容不显示的原因和解决办法

喜欢 (3)or分享 (0)
发表我的评论
取消评论

请证明您不是机器人(^v^):

表情