织梦自定义表单限制

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

织梦的自定义表单功能非常灵活,但默认情况下限制较少,这可能导致垃圾信息提交或数据不规范,在实际应用中,我们通常需要手动添加一些限制。

以下是常见的限制类型和实现方法,从易到难:


限制必填字段

这是最基本也是最常用的限制,确保用户提交了关键信息。

实现方法:

在织梦后台,你无法直接设置“必填”,但可以通过修改模板文件来实现。

  1. 打开自定义表单模板文件

    • 这个文件通常位于你的模板目录下,路径为:/templets/plus/diyform.htm
    • 如果你在后台“模板管理”中为自定义表单指定了单独的模板,则打开那个指定的文件。
  2. 为需要必填的 <input> 添加 required 属性 在HTML表单元素中,找到需要设置为必填的字段(如姓名、邮箱等),在标签内添加 required 属性。

    示例:

    <!-- 原始代码 -->
    <input type="text" name="name" id="name" class="intxt" />
    <!-- 修改后(必填) -->
    <input type="text" name="name" id="name" class="intxt" required="required" />
    <!-- 同样适用于文本域 -->
    <!-- 原始代码 -->
    <textarea name="content" id="content" rows="5" cols="80"></textarea>
    <!-- 修改后(必填) -->
    <textarea name="content" id="content" rows="5" cols="80" required="required"></textarea>
  3. (可选)添加前端提示 为了更好的用户体验,你可以在 <input> 标签旁边添加一个 <span> 来显示提示信息。

    <dl>
        <dt><label for="name">您的姓名:</label></dt>
        <dd>
            <input type="text" name="name" id="name" class="intxt" required="required" />
            <span style="color:red;">*</span>
        </dd>
    </dl>

原理: required 属性是HTML5的新特性,现代浏览器会自动阻止表单提交,并提示用户该字段不能为空。


限制字段格式(如邮箱、手机号)

使用正则表达式来验证输入内容的格式,确保用户输入了有效的邮箱、手机号等。

实现方法:

同样需要修改 diyform.htm 文件,使用 pattern 属性或 onsubmit 事件。

使用 pattern 属性(推荐,更简单)

pattern 属性允许你设置一个正则表达式来匹配输入值。

示例:

<!-- 邮箱验证 -->
<input type="email" name="email" id="email" class="intxt" required="required" 
       pattern="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" 
       title="请输入有效的邮箱地址,user@example.com" />
<!-- 手机号验证 (以1开头,第二位是3-9,共11位) -->
<input type="tel" name="phone" id="phone" class="intxt" required="required" 
       pattern="1[3-9]\d{9}" 
       title="请输入有效的11位手机号码" />
  • type="email"type="tel" 本身就有一定的校验能力,但结合 pattern 可以更精确。 属性会在验证失败时显示给用户的提示信息。

使用JavaScript onsubmit 事件(更灵活)

如果校验逻辑比较复杂,可以使用JavaScript。

  1. diyform.htm 中找到 <form>,通常它有一个 onsubmit 事件。

    <!-- 找到类似这样的代码 -->
    <form action="/plus/diy.php" enctype="multipart/form-data" method="post">
  2. 添加自定义的校验函数

    <form action="/plus/diy.php" enctype="multipart/form-data" method="post" onsubmit="return returnCheck();">
  3. 在页面底部 <script> 标签中编写校验函数

    <script type="text/javascript">
    function returnCheck() {
        // 获取手机号输入框的值
        var phone = document.getElementById('phone').value;
        // 定义手机号正则
        var phoneReg = /^1[3-9]\d{9}$/;
        // 进行校验
        if (!phoneReg.test(phone)) {
            alert('请输入正确的手机号码!');
            return false; // 阻止表单提交
        }
        // 可以继续添加其他字段的校验
        // ...
        return true; // 所有校验通过,允许提交
    }
    </script>

限制提交频率(防刷)

为了防止恶意用户或机器人短时间内重复提交表单,可以限制每个IP地址的提交频率。

实现方法:

这个修改稍微复杂一些,需要修改织梦的PHP处理文件 /plus/diy.php

  1. 打开 /plus/diy.php 文件

  2. 找到处理表单提交的核心代码段,通常在 if($do == 2) 附近。

  3. 在写入数据库之前,添加频率限制逻辑

    示例代码:

    // 在 $diy->add($addvar); 这行代码之前添加以下逻辑
    // --- 开始:添加提交频率限制 ---
    $ip = GetIP(); // 获取当前用户IP
    $time_limit = 60; // 限制时间为60秒
    $submit_count = 1; // 限制次数为1次(即60秒内只能提交1次)
    // 从数据库中读取该IP的上次提交时间
    $dsql->SetQuery("SELECT ctime FROM `dediy_iplog` WHERE ip = '{$ip}' ORDER BY ctime DESC LIMIT 0,1");
    $dsql->Execute();
    $row = $dsql->GetArray();
    // 如果存在记录,计算时间差
    if ($row) {
        $time_diff = time() - $row['ctime'];
        if ($time_diff < $time_limit) {
            ShowMsg('您提交的太快了,请稍后再试!', '-1', 0, 10000); // 提示信息
            exit();
        }
    }
    // 记录本次提交的IP和时间到日志表
    $ctime = time();
    $dsql->ExecuteNoneQuery("INSERT INTO `dediy_iplog` (ip, ctime) VALUES ('{$ip}', '{$ctime}');");
    // --- 结束:添加提交频率限制 ---
    // 原有的写入数据库代码
    if($diy->add($addvar))
    {
        $goto = isset($cfg_cmspath) ? $cfg_cmspath : '/';
        $bkmsg = '发布成功,正在返回...';
        ShowMsg($bkmsg, $goto, 0, 10000);
    }
    else
    {
        ShowMsg('发布失败,请检查内容是否填写完整!', '-1', 0, 10000);
    }

注意:

  • 上述代码中用到了一个名为 dediy_iplog 的表,你需要提前在数据库中创建它。
  • 创建SQL语句:
    CREATE TABLE `dediy_iplog` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `ip` varchar(20) NOT NULL,
      `ctime` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  • 这个方法只能防范普通用户,对于专业刷机效果有限,更高级的防护可以使用验证码。

限制上传文件类型和大小

如果你的表单包含文件上传功能,这是必须的限制。

实现方法:

修改 diyform.htm/plus/diy.php 两个文件。

  1. 修改 diyform.htm 中的 <input type="file">

    • 限制类型: 使用 accept 属性,虽然这个属性对用户约束不强,但可以作为引导。

      <input type="file" name="pic" id="pic" accept="image/jpeg, image/png, image/gif" />
    • 限制大小: 需要JavaScript在前端校验。

      <script>
      document.getElementById('yourFormId').onsubmit = function() {
          var fileInput = document.getElementById('pic');
          var fileSize = fileInput.files[0].size; // 获取文件大小(字节)
          var maxSize = 2 * 1024 * 1024; // 设置最大为2MB
          if (fileSize > maxSize) {
              alert('上传文件大小不能超过2MB!');
              return false;
          }
          return true;
      };
      </script>
  2. 修改 /plus/diy.php 中的后端处理代码 这是关键,因为前端校验可以被绕过,后端校验才是安全的。 在处理上传文件的部分(通常在 $fileurl 相关代码附近),添加以下逻辑:

    // 在处理上传文件之前添加
    if($_FILES['pic']['error'] == 0) // 确保文件上传成功
    {
        $upload = new upload('pic');
        $upload->set_dir(date('Ym/d'));
        $fileurl = $upload->save();
        // --- 开始:添加文件类型和大小限制 ---
        $file_type = strtolower(pathinfo($fileurl, PATHINFO_EXTENSION)); // 获取文件后缀
        $allow_type = array('jpg', 'jpeg', 'png', 'gif'); // 允许的文件类型
        $allow_size = 2 * 1024 * 1024; // 允许的文件大小 (2MB)
        // 检查文件类型
        if (!in_array($file_type, $allow_type)) {
            ShowMsg('上传的文件类型不被允许!', '-1', 0, 10000);
            exit();
        }
        // 检查文件大小 (upload对象可能已经保存了文件大小信息)
        // 如果没有,可以自己用 $_FILES['pic']['size'] 获取
        if ($_FILES['pic']['size'] > $allow_size) {
            ShowMsg('上传的文件大小超过限制!', '-1', 0, 10000);
            exit();
        }
        // --- 结束:添加文件类型和大小限制 ---
    }

使用验证码(最有效的防刷手段)

验证码是区分人类和机器人的最直接方法。

实现方法:

织梦自带验证码功能,集成到自定义表单中非常方便。

  1. 打开 diyform.htm

  2. 在合适的位置添加验证码HTML

    <dl>
        <dt><label for="vdcode">验证码:</label></dt>
        <dd>
            <input type="text" name="vdcode" id="vdcode" class="intxt" style="width:50px;text-transform:uppercase;" />
            <img id="vdimgck" align="absmiddle" style="cursor:pointer;margin-left:5px;" onclick="this.src=this.src+'?'" src="/include/vdimgck.php" alt="看不清?点击换一张" />
        </dd>
    </dl>
    • name="vdcode":这个 name 是固定的,织梦后台会自动识别。
    • src="/include/vdimgck.php":这是织梦验证码图片的地址。
    • onclick="this.src=this.src+'?'":点击图片刷新验证码。
  3. (可选)在CSS中美化样式 你可以添加CSS样式让验证码和输入框更美观。

织梦后端会自动校验 vdcode 这个字段是否正确,无需手动编写PHP代码。


限制类型 实现方法 修改文件 备注
必填字段 HTML5 required 属性 templets/plus/diyform.htm 最简单,现代浏览器支持
格式校验 HTML5 pattern 属性 或 JS onsubmit 事件 templets/plus/diyform.htm pattern 更简洁,JS更灵活
提交频率 PHP + 数据库记录IP和时间 /plus/diy.php + 数据库 需要额外创建数据表,防普通刷机
文件上传 JS前端校验 + PHP后端校验 diyform.htm + /plus/diy.php 后端校验是必须的,确保安全
验证码 织梦自带标签 templets/plus/diyform.htm 最有效的防机器人手段,强烈推荐

在实际项目中,通常会组合使用这些方法,以达到最佳的表单控制和用户体验,必填字段 + 格式校验 + 验证码 是一个非常标准和安全的组合。

-- 展开阅读全文 --
头像
dede调用更新时间,如何正确显示?
« 上一篇 04-22
dede插件安装目录
下一篇 » 04-22

相关文章

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