最近一个朋友过来问我织梦系统网页 404 的问题,具体情况是:在后台一键更新网站、更新文档 HTML,显示已经全部生成了,但很多文章打开还是 404,向我寻求解决办法。经过我的测试,出现的原因是织梦的 SQL 语句写的有些问题,解决步骤如下:
打开织梦后台目录下的 makehtml_archives_action.php
,搜索 如果生成数量大于500,并且没选栏目,按栏目排序生成
找到 :
//如果生成数量大于500,并且没选栏目,按栏目排序生成
if($totalnum > 500 && empty($typeid))
{
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql ORDER BY typeid ASC $limitSql");
} else {
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql $limitSql");
}
这段代码的起始位置大概在 86 行。这里生成总数量超过 500 时,织梦使用了ORDER BY
排序,上网查一下关于 mysql 使用 order by 语句有数据但是查不到的内容还是蛮多的,我们继续解决。
既然知道问题是出在 order by,其实就比较好解决了,有两种解决办法,我个人比较推荐第二种。
第一种办法:直接把生成数量超过 500 的也换成不带排序的 SQL,具体代码如下,整块代码替换即可。
//如果生成数量大于500,并且没选栏目,按栏目排序生成
if($totalnum > 500 && empty($typeid))
{
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql $limitSql");
} else {
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql $limitSql");
}
第二种办法:给 order by 再增加一个约束条件,这也是我目前采用的办法。具体代码如下,整块代码替换即可。
//如果生成数量大于500,并且没选栏目,按栏目排序生成
if($totalnum > 500 && empty($typeid))
{
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql ORDER BY typeid ASC,id ASC $limitSql");
} else {
$dsql->Execute('out',"SELECT id FROM `dede_arctiny` $idsql $limitSql");
}
把代码修改保存。此时再去织梦后台生成文档 HTML 看看,是不是完美解决啦?