通过修改 dede/plus/diy.php 文件(最推荐,通用性强)
这是最标准、最推荐的方法,通过修改处理表单提交的核心文件,来在数据入库前自动获取IP地址,这种方法的好处是,无论你创建多少个自定义表单,都无需再进行额外配置。
操作步骤:
-
找到并打开文件 使用FTP或主机管理面板,登录到您的网站服务器,找到并打开以下文件:
根目录/dede/plus/diy.php -
定位关键代码 在文件中,找到处理表单数据并插入数据库的代码段,通常在文件的后半部分,搜索
//diy.php或者//保存到数据表等关键词,可以快速定位到大约在第 530行 左右的位置,你会看到类似这样的代码://处理完毕,插入数据库 $query = "INSERT INTO `{$diy->table}` (`id`, `typeid`, `ifcheck` $addvar) VALUES (NULL, '$typeid', '$diy->public' $addvalue);"; $db->Execute('me',$query); -
修改代码以获取IP 在上述代码的 上方,添加获取客户端IP地址的代码,织梦本身有一个获取IP的函数
GetIP(),我们可以直接使用它。在
//处理完毕,插入数据库这一行 之前,插入以下代码:// 获取用户IP地址 $ip = GetIP();
-
将IP变量添加到SQL插入语句中 我们需要将获取到的
$ip变量添加到SQL插入语句中,这需要两步修改:- 修改
$addvar字符串:这个变量包含了所有自定义表单的字段名,我们需要在里面加入ip字段。 - 修改
$addvalue字符串:这个变量包含了所有要插入的值,我们需要在里面加入$ip这个变量值。
找到这两行代码:
$addvar = ''; $addvalue = '';
在循环处理表单字段的
foreach循环 内部(通常在第490行左右),修改逻辑,将IP字段也加入进去。将原来的
foreach循环部分(大概在第490-520行)替换为以下代码:foreach($diy->item as $field=>$item) { if($item->auto == 1) continue; // 跳过自增ID等系统字段 if($field == 'ip') continue; // 如果你的表单里恰好有个叫ip的字段,这行可以防止冲突,但一般不会有 $value = isset($$_field) ? ${$_field} : ''; if($item->type != 'text' && $item->type != 'textarea' && $item->type != 'number') { // ... (其他类型处理逻辑,保持不变) } else { $value = htmlspecialchars($value); } // 如果字段值为空,则不添加,根据你的需求调整 if($value != '') { $addvar .= ', `'.$field.'`'; $addvalue .= ", '$value'"; } } // --- 在 foreach 循环结束后,添加IP字段 --- $addvar .= ', `ip`'; $addvalue .= ", '$ip'"; - 修改
-
保存文件 保存
diy.php文件,至此,后台修改已完成。 -
修改自定义表单的HTML模板 在你网站前端显示自定义表单的HTML页面中,你需要添加一个隐藏的input字段,用来在提交时传递IP值(虽然我们是在后台获取的,但保持表单结构完整是好的习惯)。
在你的
<form>标签内,添加如下代码:<input type="hidden" name="ip" value="" />
这个
name="ip"必须存在,虽然我们在后台没有使用它,但它可以避免一些前端校验的错误。 -
创建数据表字段 这是最关键的一步!你必须在数据库的自定义表单数据表中,添加一个用于存储IP地址的字段。
- 登录你的网站后台。
- 进入【核心】 -> 【内容模型管理】 -> 【自定义表单】。
- 点击你正在使用的那个自定义表单的“管理”或“修改”按钮。
- 你会看到数据表的结构,点击“添加新字段”。
- 字段名称:
ip - 字段类型:
VARCHAR - 字段长度:
20(足够存储IPv4地址,如255.255.255) - 是否为空:
是 - 默认值: 留空
- 其他选项保持默认即可,然后保存。
当用户提交表单时,系统会自动获取其IP地址,并将其存入数据库的 ip 字段中。
通过修改JS提交文件(适用于特定场景)
你可能不想修改核心的 diy.php 文件,或者希望在前端就获取到IP,可以通过修改织梦自带的JS提交文件来实现,这种方法需要确保你的表单是通过JS提交的(默认是)。
操作步骤:
-
找到并打开JS文件 打开以下文件:
根目录/dede/plus/diylist.js -
修改JS代码 在JS文件中找到处理提交数据的函数,通常是
submitAjax()函数,找到构建data对象的部分,在data对象中添加ip属性。找到类似这样的代码:
var data = { action: '', diyid: diyid, do: 2, type: type, data: $(form).serialize() };修改为:
// 获取用户IP地址 var userIp = returnCitySN["cip"] || '127.0.0.1'; // 使用淘宝IP库或默认值 var data = { action: '', diyid: diyid, do: 2, type: type, data: $(form).serialize() + '&ip=' + userIp // 将IP附加到序列化的数据中 };returnCitySN["cip"]是调用淘宝的IP库接口来获取真实IP,非常准确,你需要确保页面加载了淘宝的JS库:<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>。- 如果不想用淘宝库,可以用
<?php echo GetIP(); ?>直接输出PHP获取的IP,但这需要JS文件能被PHP解析,.js文件不行,所以不推荐。
-
修改
diy.php以接收JS传来的IP 即使你用JS获取了IP,最终还是要交给diy.php来处理,所以你仍然需要按照 方法一 的步骤修改diy.php,让它能从$_POST中接收ip值并存入数据库。- 在
diy.php中,获取IP的代码可以修改为:$ip = isset($_POST['ip']) ? $_POST['ip'] : GetIP();这样更灵活。 - 后续的
$addvar和$addvalue修改步骤与方法一完全相同。
- 在
-
创建数据表字段 这一步与方法一完全相同,必须在数据库中添加
ip字段。
总结与对比
| 特性 | 方法一 (修改 diy.php) |
方法二 (修改 diylist.js) |
|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ (最推荐) | ⭐⭐⭐ (特定需求) |
| 实现原理 | 在后端PHP代码中获取IP,直接入库。 | 在前端JS中获取IP,随表单数据一同提交给后端。 |
| 优点 | 最稳定可靠,不受前端环境影响。 通用性强,对所有自定义表单生效。 逻辑清晰,符合MVC思想。 |
可以在前端获取更精确的IP(如淘宝IP库)。 不修改核心文件(如果只改JS)。 |
| 缺点 | 修改了核心文件,升级时需要注意覆盖。 | 依赖JS执行,可能被用户禁用。 需要额外调用外部IP库(如淘宝)。 最终还是需要修改 diy.php来接收数据。 |
| 适用场景 | 几乎所有情况,是标准的解决方案。 | 需要极高精度IP,且能接受JS方案带来的不确定性。 |
对于绝大多数用户来说,方法一 是最佳选择,它简单、直接、稳定,是织梦开发者社区公认的标准做法。
