织梦自定义表单如何获取访客IP地址?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 织梦建站 正文

通过修改 dede/plus/diy.php 文件(最推荐,通用性强)

这是最标准、最推荐的方法,通过修改处理表单提交的核心文件,来在数据入库前自动获取IP地址,这种方法的好处是,无论你创建多少个自定义表单,都无需再进行额外配置。

操作步骤:

  1. 找到并打开文件 使用FTP或主机管理面板,登录到您的网站服务器,找到并打开以下文件: 根目录/dede/plus/diy.php

  2. 定位关键代码 在文件中,找到处理表单数据并插入数据库的代码段,通常在文件的后半部分,搜索 //diy.php 或者 //保存到数据表 等关键词,可以快速定位到大约在第 530行 左右的位置,你会看到类似这样的代码:

    //处理完毕,插入数据库
    $query = "INSERT INTO `{$diy->table}` (`id`, `typeid`, `ifcheck` $addvar) VALUES (NULL, '$typeid', '$diy->public' $addvalue);";
    $db->Execute('me',$query);
  3. 修改代码以获取IP 在上述代码的 上方,添加获取客户端IP地址的代码,织梦本身有一个获取IP的函数 GetIP(),我们可以直接使用它。

    //处理完毕,插入数据库 这一行 之前,插入以下代码:

    // 获取用户IP地址
    $ip = GetIP();
  4. 将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'";
  5. 保存文件 保存 diy.php 文件,至此,后台修改已完成。

  6. 修改自定义表单的HTML模板 在你网站前端显示自定义表单的HTML页面中,你需要添加一个隐藏的input字段,用来在提交时传递IP值(虽然我们是在后台获取的,但保持表单结构完整是好的习惯)。

    在你的 <form> 标签内,添加如下代码:

    <input type="hidden" name="ip" value="" />

    这个 name="ip" 必须存在,虽然我们在后台没有使用它,但它可以避免一些前端校验的错误。

  7. 创建数据表字段 这是最关键的一步!你必须在数据库的自定义表单数据表中,添加一个用于存储IP地址的字段。

    • 登录你的网站后台。
    • 进入【核心】 -> 【内容模型管理】 -> 【自定义表单】。
    • 点击你正在使用的那个自定义表单的“管理”或“修改”按钮。
    • 你会看到数据表的结构,点击“添加新字段”。
    • 字段名称: ip
    • 字段类型: VARCHAR
    • 字段长度: 20 (足够存储IPv4地址,如 255.255.255)
    • 是否为空:
    • 默认值: 留空
    • 其他选项保持默认即可,然后保存。

当用户提交表单时,系统会自动获取其IP地址,并将其存入数据库的 ip 字段中。


通过修改JS提交文件(适用于特定场景)

你可能不想修改核心的 diy.php 文件,或者希望在前端就获取到IP,可以通过修改织梦自带的JS提交文件来实现,这种方法需要确保你的表单是通过JS提交的(默认是)。

操作步骤:

  1. 找到并打开JS文件 打开以下文件: 根目录/dede/plus/diylist.js

  2. 修改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 文件不行,所以不推荐。
  3. 修改 diy.php 以接收JS传来的IP 即使你用JS获取了IP,最终还是要交给 diy.php 来处理,所以你仍然需要按照 方法一 的步骤修改 diy.php,让它能从 $_POST 中接收 ip 值并存入数据库。

    • diy.php 中,获取IP的代码可以修改为:$ip = isset($_POST['ip']) ? $_POST['ip'] : GetIP(); 这样更灵活。
    • 后续的 $addvar$addvalue 修改步骤与方法一完全相同。
  4. 创建数据表字段 这一步与方法一完全相同,必须在数据库中添加 ip 字段。


总结与对比

特性 方法一 (修改 diy.php) 方法二 (修改 diylist.js)
推荐度 ⭐⭐⭐⭐⭐ (最推荐) ⭐⭐⭐ (特定需求)
实现原理 在后端PHP代码中获取IP,直接入库。 在前端JS中获取IP,随表单数据一同提交给后端。
优点 最稳定可靠,不受前端环境影响。
通用性强,对所有自定义表单生效。
逻辑清晰,符合MVC思想。
可以在前端获取更精确的IP(如淘宝IP库)。
不修改核心文件(如果只改JS)。
缺点 修改了核心文件,升级时需要注意覆盖。 依赖JS执行,可能被用户禁用。
需要额外调用外部IP库(如淘宝)。
最终还是需要修改diy.php来接收数据。
适用场景 几乎所有情况,是标准的解决方案。 需要极高精度IP,且能接受JS方案带来的不确定性。

对于绝大多数用户来说,方法一 是最佳选择,它简单、直接、稳定,是织梦开发者社区公认的标准做法。

-- 展开阅读全文 --
头像
int main函数在C语言中具体作用是什么?
« 上一篇 01-09
织梦CMS有微信支付吗
下一篇 » 01-09

相关文章

取消
微信二维码
支付宝二维码

目录[+]