这些天在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后台部分文章内容不显示的原因和解决办法