- 完全无法保存:提交文章后,发布时间、更新时间等字段在数据库里是空的或者为0000-00-00 00:00:00。
- 时间不正确:时间被保存了,但显示的是错误的时间,比如1970年、服务器时间、或者一个固定的时间。
下面我将从最常见到最罕见的顺序,为你提供详细的排查和解决方案。
第一步:检查最常见的原因 - 时间服务器设置
这是导致时间问题的首要原因,特别是对于新用户或刚迁移服务器的用户。
问题现象:文章发布后,时间显示为 1970-01-01 08:00:00 或者一个明显错误的时间。
原因分析:
织梦CMS在保存时间时,会调用PHP的 time() 函数。time() 函数返回的是服务器的Unix时间戳,如果服务器的时区设置不正确,或者服务器时间本身是错误的,那么织梦保存的时间自然就是错的。
解决方案:
检查并设置服务器时区
登录你的服务器(通过SSH或宝塔面板等),找到并修改 php.ini 文件。
- 定位php.ini:通常在
/etc/php.ini或/usr/local/php/etc/php.ini,如果你使用的是宝塔面板,可以在“软件商店” -> “PHP设置” -> “配置修改”中找到。 - 修改时区:找到
date.timezone这一行,确保它被注释(前面有分号 )并且值设置为你需要的时区。;date.timezone =
修改为:
date.timezone = PRC
或者
date.timezone = Asia/Shanghai
PRC是“中华人民共和国”的时区,等同于Asia/Shanghai。 - 重启PHP服务:修改保存后,必须重启PHP服务才能生效。
- 命令行:
service php-fpm restart或/etc/init.d/php-fpm restart - 宝塔面板:在“PHP设置”页面点击“重启服务”。
- 命令行:
检查服务器时间本身 如果时区设置正确但时间还是错的,那可能是服务器本身的时间就不对。
-
查看当前时间:在服务器命令行输入
date命令。date
如果显示的时间和北京时间相差很大,就需要同步服务器时间。
-
同步时间(以CentOS为例):
# 安装ntpdate服务 yum install ntpdate -y # 同步阿里云的时间服务器 ntpdate ntp.aliyun.com # 将时间写入硬件时钟 hwclock --systohc
检查织梦后台的全局参数设置 有时候织梦后台的设置会覆盖PHP的时区设置。
- 登录织梦后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “时间显示格式” 和 “发布文章时,默认的时间” 这两项。
- 时间显示格式:确保格式正确,
Y-m-d H:i:s。 - 发布文章时,默认的时间:这里应该选择
当前时间,如果选择的是0000-00-00 00:00:00,那么文章保存时时间就是空的。
- 时间显示格式:确保格式正确,
第二步:检查数据库权限和字段问题
如果第一步的时区设置正确,但时间依然是空的,那么问题可能出在数据库上。
问题现象:提交文章后,数据库中 dede_archives 表的 pubdate 和 senddate 字段值为空或为0。
原因分析:
织梦在写入文章时,需要向数据库的 pubdate (发布时间) 和 senddate (更新时间) 字段写入时间戳,如果数据库用户没有写入权限,或者这两个字段在数据库中被错误地修改过(被设置成了不允许NULL值但没有默认值),就会导致写入失败。
解决方案:
检查数据库表结构
- 使用phpMyAdmin等工具登录你的数据库。
- 找到织梦的数据库,点击
dede_archives表。 - 点击“结构”或“Structure”标签。
- 检查
pubdate和senddate这两个字段。- 类型:必须是
int(10)或int(11),用来存储Unix时间戳,如果被改成了varchar或其他类型,就需要改回来。 - 允许NULL:应该是
否或NO。 - 默认值:允许NULL”是“否”,默认值”最好是
0,如果为空,可能会导致写入失败。
- 类型:必须是
修复数据库表 即使表结构看起来没问题,也可能存在轻微的损坏。
- 在phpMyAdmin中,选中
dede_archives表。 - 点击“操作”或“Operations”标签。
- 在“表维护”区域,点击“修复表”或
Repair table。 - 同样,对
dede_arctiny表也执行一次修复操作。
检查数据库用户权限
确保你的数据库用户(在 data/common.inc.php 文件中配置的那个用户)对 dede_archives 表有 SELECT, INSERT, UPDATE 权限,这通常不是问题,但如果你修改过用户权限,就需要确认一下。
第三步:检查模板和JS冲突
这种情况相对少见,但确实发生过。
问题现象:只在后台保存文章时出问题,前台正常,或者页面加载时有JS错误。
原因分析: 织梦后台的文章编辑页面会加载一些JS文件来处理日期和时间,如果模板文件或自定义的JS代码与这些文件产生了冲突,可能会导致时间无法正确获取和提交。
解决方案:
- 恢复默认后台模板:进入后台目录
dede/templets/,将article_add.htm和article_edit.htm这两个文件从官方织梦程序包中重新覆盖一遍,这可以排除模板文件被修改导致的问题。 - 检查浏览器控制台:按F12打开浏览器开发者工具,切换到“Console”(控制台)标签,提交文章时,看看有没有红色的错误信息,如果有,根据错误信息去排查是哪个JS文件的问题。
- 禁用插件:某些后台插件可能会干扰正常的表单提交,尝试在后台暂时禁用所有非必要的插件,然后看看问题是否解决。
第四步:检查文件被修改或病毒
这是最坏的情况,但也不能排除。
问题现象:以上所有方法都无效,或者网站出现其他异常。
原因分析: 织梦的核心文件被黑客或恶意程序修改过,导致其功能异常,或者被植入了木马,在提交数据时做了手脚。
解决方案:
- 比对核心文件:从织梦官网下载一个与你网站版本完全相同的官方程序包,使用工具(如WinDiff或Beyond Compare)将你网站上的核心文件(特别是
dede/archives_do.php,这是处理文章保存的核心文件)与官方的进行对比,看看是否有差异。 - 全站杀毒:使用专业的网站杀毒工具(如D盾、安全狗等)对你的网站进行全面扫描。
- 恢复备份:如果你有网站的全量备份(包括文件和数据库),这是最直接有效的解决方法,恢复到出现问题之前的时间点。
总结与排查顺序建议
遇到“织梦不能保存文章时间”的问题,请按照以下顺序进行排查,这样能最高效地解决问题:
- 【优先检查】服务器时区:修改
php.ini的date.timezone=PRC,并重启PHP,这是80%的可能性所在。 - 【后台设置】检查织梦全局参数:确保后台“系统基本参数”中的时间设置是“当前时间”。
- 【数据库层面】检查表结构和修复表:用phpMyAdmin检查
dede_archives表的pubdate和senddate字段类型,并执行“修复表”操作。 - 【文件层面】恢复默认模板:重新上传
article_add.htm等后台模板文件。 - 【终极手段】检查文件完整性和恢复备份:如果以上都无效,考虑文件被篡改或恢复备份。
希望这些步骤能帮助你成功解决问题!如果在排查过程中遇到任何具体困难,可以随时提出。
