直接修改数据库(最简单、最直接)
如果你只是想快速给已有的表单数据加上一个提交时间,并且不介意手动操作数据库,这是最快的方法。

操作步骤:
-
找到你的自定义表单数据表
- 登录你的网站后台,进入【核心】-> 【内容模型管理】-> 【自定义表单管理】。
- 找到你创建的那个自定义表单,点击后面的“管理”按钮。
- 在打开的页面中,你会看到一个类似
dede_addonxx的表名(xx是一个数字,这是你的表单数据存储的表)。
-
修改表结构,添加时间字段
- 使用 phpMyAdmin 或其他数据库管理工具登录你的数据库。
- 找到上一步确认的
dede_addonxx表。 - 点击“结构”或“操作” -> “添加字段”。
- 添加一个新字段:
- 字段名:
uptime(或者你喜欢的任何名字,如subtime,posttime) - 类型:
int(10)或bigint(20)(存储时间戳) - 默认值:
0 - 保存。
- 字段名:
-
修改表单提交处理文件
(图片来源网络,侵删)-
在你的网站根目录下,找到
/plus/diy.php文件。 -
用代码编辑器打开它。
-
找到处理表单数据的代码段,通常是在一个
if条件语句里,类似if($dsql->Execute('addsql')){...}。 -
在执行插入数据库的SQL语句之前,添加一行代码来获取当前时间戳。
-
找到类似这样的代码:
$inquery = "INSERT INTO `{$diy->table}` (`{$inaddfield}`) VALUES('$addvalue');"; -
在
$addvalue变量中,你需要把时间戳加进去。$addvalue是一个数组,修改代码如下:// 在 $addvalue 赋值之后,$inquery 之前添加 $addvalue .= ",'".time()."'"; // 将当前时间戳拼接到值列表的末尾 $inquery = "INSERT INTO `{$diy->table}` (`{$inaddfield}`) VALUES($addvalue);";注意:
{$inaddfield}和$addvalue的字段和值顺序必须一一对应,因为你刚刚在表结构里添加了uptime字段,所以这里也要在值的末尾加上对应的时间戳。
-
-
(可选)修改后台列表显示
- 进入后台自定义表单管理页面,点击“字段管理”。
- 添加一个新字段用于显示时间:
- 字段名:
uptime(必须和数据库字段名一样) - 字段类型:
单行文本 - 前台显示:
否 - 后台显示:
是 - : 这里需要一个函数来转换时间戳,输入:
function GetDateTimeMK($mtime) { if($mtime > 0) { return GetDateTime($mtime); } else { return "暂无"; } }
- 字段名:
- 保存后,刷新你的自定义表单列表页面,就能看到“uptime”列了,并且显示的是格式化后的时间。
修改 diy.php 文件以自动记录时间(推荐)
这个方法比方法一更规范,因为它会自动为新添加的字段设置默认值,而不是手动在SQL里拼接。
操作步骤:
-
修改表结构(同方法一第一步)
- 在
dede_addonxx表中添加一个名为uptime的int(10)字段。
- 在
-
修改
diy.php文件- 打开
/plus/diy.php文件。 - 找到处理表单数据的核心部分,关键在于
$inaddfield和$addvalue这两个变量的构建。 - 我们需要确保在构建这两个变量时,把我们的
uptime字段和时间戳也包含进去。 - 搜索类似
foreach($fieldarr as $field=>$fielddata)的循环代码块。 - 在这个循环之后,
$inquery语句之前,添加以下代码:// 自动添加提交时间字段 $inaddfield .= ", `uptime`"; $addvalue .= " , '".time()."'";
- 这样,无论你的表单有多少个字段,提交时都会自动把
uptime和当前时间戳加进去,SQL语句会自动匹配。
- 打开
-
(可选)修改后台显示(同方法一第四步)
- 和方法一一样,在后台字段管理中添加一个
uptime字段,并设置“列表内容”为转换函数,以便在后台以可读格式显示时间。
- 和方法一一样,在后台字段管理中添加一个
使用DedeCMS钩子功能(最专业、最灵活)
如果你想让这个功能可以复用,或者不想频繁修改核心文件(如 diy.php),使用DedeCMS的钩子是最佳实践。
操作步骤:
-
创建钩子文件
-
在你的网站根目录下创建一个新文件夹,
myhooks。 -
在
myhooks文件夹里创建一个 PHP 文件,formtime.php。 -
在
formtime.php中写入以下代码:<?php /** * 自定义表单提交时间钩子 */ function diyFormTime(&$dede_addon, &$field, &$value) { // 确保我们只在处理自定义表单时执行 if (defined('DEDEMODULE') && DEDEMODULE == 'diy') { // 获取当前时间戳 $time = time(); // 将时间戳添加到待插入的数据中 // $dede_addon 是关联数组,直接添加即可 $dede_addon['uptime'] = $time; } } ?>
-
-
注册钩子
- 登录DedeCMS后台,进入【系统】-> 【系统基本参数】-> 【核心设置】。
- 找到 “钩子文件目录” 这一项,将其值修改为你的钩子文件夹,
/myhooks。 - 保存。
-
在
diy.php中调用钩子- 打开
/plus/diy.php文件。 - 在文件顶部引入钩子类,通常在
require_once(dirname(__FILE__)."/../include/common.inc.php");这行之后添加:require_once(DEDEINC.'/hook.class.php');
- 找到执行插入数据库操作的地方,即在
if($dsql->Execute('addsql'))之前,添加钩子调用代码:// 在执行插入前调用钩子 $hook = new Hook(); $hook->listen('diyFormSubmit', array(&$diy, &$addvar, &$addvalue));注意:
diyFormSubmit是一个我自定义的钩子名称,你可以换成任何你喜欢的唯一名称。
- 打开
-
修改钩子文件以匹配调用
-
回到你的
myhooks/formtime.php文件,修改函数名和参数,以匹配diy.php中的调用。<?php /** * 自定义表单提交时间钩子 */ function diyFormSubmit(&$diy, &$addvar, &$addvalue) { // $addvar 是字段数组,$addvalue 是值数组 // 将时间戳添加到值数组中 $addvalue[] = time(); // 如果需要,也可以添加到字段数组中,但通常DedeCMS会自动处理 // $addvar[] = 'uptime'; } ?> -
这种方式下,DedeCMS在构建SQL时会自动将新加入的
$addvalue对应到数据库的自定义字段上(前提是数据库表结构里已经有这个字段)。
-
-
(可选)修改后台显示(同方法一第四步)
这一步是必须的,否则你在后台看不到时间,操作同方法一。
总结与建议
| 方法 | 优点 | 缺点 | 适用人群 |
|---|---|---|---|
| 直接修改 | 速度快,无需理解复杂逻辑 | 不规范,容易出错,升级DedeCMS后可能失效 | 新手,临时需求,一次性修改 |
| 修改diy.php | 相对规范,能自动处理 | 修改了核心文件,升级DedeCMS后可能需要重新修改 | 有一定PHP基础,希望代码更规范的开发者 |
| 钩子功能 | 最专业,解耦,可复用,升级影响小 | 设置最复杂,需要理解DedeCMS钩子机制 | 专业开发者,需要长期维护或开发多功能的网站 |
对于绝大多数用户,我推荐使用【方法二】,它在实现效果和操作复杂度之间取得了最好的平衡,既解决了问题,又不会让代码变得过于臃肿或难以理解。
重要提醒:在修改任何文件或数据库之前,请务必备份你的网站文件和数据库!以防操作失误导致网站无法正常运行。
