织梦自定义表单如何实现条件判断?

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

核心思路

织梦自定义表单的判断逻辑主要分为两类:

织梦自定义表单 判断
(图片来源网络,侵删)
  1. 前端判断 (客户端验证)

    • 目的:在用户提交表单之前,进行初步的数据格式和必填项检查。
    • 优点:响应速度快,能即时给用户反馈,减轻服务器压力。
    • 缺点:可以被用户禁用JavaScript或绕过,不能作为唯一的安全验证手段
    • 实现方式:在表单模板中使用 JavaScript 和正则表达式。
  2. 后端判断 (服务器端验证)

    • 目的:在表单提交到服务器后,PHP代码对数据进行最终、安全的验证和处理。
    • 优点:安全性高,是防止非法数据入库的最后一道防线。
    • 缺点:如果验证失败,需要返回错误信息,用户体验稍差。
    • 实现方式:修改处理表单的PHP文件(plus/diy.php)。

前端判断 (客户端验证)

这是最常用也最简单的判断方式,适用于必填项、邮箱格式、手机号格式等。

步骤:

  1. 找到你的自定义表单模板文件

    织梦自定义表单 判断
    (图片来源网络,侵删)
    • 通常位于 /templets/你的模板目录/plus/diyform.htm
    • 如果你在后台为表单指定了模板,则使用指定的模板文件。
  2. 在表单标签中添加必要的属性

    织梦的自定义表单字段(如文本框、文本域)默认会生成一些特定的 classid,我们可以利用这些来编写JS。

    • {dede:diyfield name='字段名'/}:这是自定义字段的输出标签。
    • required:HTML5新增的属性,表示该字段为必填,浏览器会自动进行基础验证。
    • class="input-text":织梦默认给输入框添加的class,我们可以通过它来选择元素。
  3. 编写JavaScript验证代码

    <form> 标签内部,添加一个 <script> 标签,编写你的验证函数。

示例:一个包含必填项、邮箱和手机号验证的表单

假设你的自定义表单有三个字段:

  • name (姓名, 文本)
  • email (邮箱, 文本)
  • phone (手机, 文本)
  • content (留言内容, 文本域)

修改后的 plus/diyform.htm 模板文件:

<form action="/plus/diy.php" enctype="multipart/form-data" method="post">
    <input type="hidden" name="action" value="post" />
    <input type="hidden" name="diyid" value="1" /> {!-- 这里替换为你的表单ID --}
    <input type="hidden" name="do" value="2" />
    <!-- 姓名字段 -->
    <div>
        <label>姓名:</label>
        {dede:diyfield name='name'/}
        <span class="error-msg" id="name-error"></span>
    </div>
    <!-- 邮箱字段 -->
    <div>
        <label>邮箱:</label>
        {dede:diyfield name='email'/}
        <span class="error-msg" id="email-error"></span>
    </div>
    <!-- 手机号字段 -->
    <div>
        <label>手机号:</label>
        {dede:diyfield name='phone'/}
        <span class="error-msg" id="phone-error"></span>
    </div>
    <!-- 留言内容字段 -->
    <div>
        <label>留言内容:</label>
        {dede:diyfield name='content'/}
        <span class="error-msg" id="content-error"></span>
    </div>
    <button type="submit" id="btnSubmit">提交</button>
</form>
<script>
document.getElementById('btnSubmit').addEventListener('click', function(e) {
    e.preventDefault(); // 阻止表单默认提交
    // 1. 清空之前的错误信息
    document.querySelectorAll('.error-msg').forEach(function(el) {
        el.innerHTML = '';
    });
    var isValid = true;
    // 2. 验证姓名 (必填)
    var nameInput = document.querySelector('input[name="name"]');
    if (!nameInput.value.trim()) {
        document.getElementById('name-error').innerHTML = '姓名不能为空!';
        isValid = false;
    }
    // 3. 验证邮箱 (必填且格式正确)
    var emailInput = document.querySelector('input[name="email"]');
    var emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
    if (!emailInput.value.trim()) {
        document.getElementById('email-error').innerHTML = '邮箱不能为空!';
        isValid = false;
    } else if (!emailRegex.test(emailInput.value)) {
        document.getElementById('email-error').innerHTML = '邮箱格式不正确!';
        isValid = false;
    }
    // 4. 验证手机号 (必填且格式正确)
    var phoneInput = document.querySelector('input[name="phone"]');
    var phoneRegex = /^1[3-9]\d{9}$/; // 简单的中国手机号正则
    if (!phoneInput.value.trim()) {
        document.getElementById('phone-error').innerHTML = '手机号不能为空!';
        isValid = false;
    } else if (!phoneRegex.test(phoneInput.value)) {
        document.getElementById('phone-error').innerHTML = '手机号格式不正确!';
        isValid = false;
    }
    // 5. 验证留言内容 (必填)
    var contentInput = document.querySelector('textarea[name="content"]'); // 文本域用textarea
    if (!contentInput.value.trim()) {
        document.getElementById('content-error').innerHTML = '留言内容不能为空!';
        isValid = false;
    }
    // 6. 如果所有验证都通过,则提交表单
    if (isValid) {
        document.querySelector('form').submit();
    }
});
</script>

代码解释:

  • e.preventDefault(): 阻止按钮的默认提交行为,让我们有机会先做检查。
  • document.querySelector('[name="字段名"]'): 通过 name 属性找到对应的输入框。
  • .trim(): 去除字符串两端的空格。
  • .value: 获取输入框的值。
  • 正则表达式: 用于验证邮箱、手机号等复杂格式。
  • isValid: 一个标志变量,如果任何一项验证失败,就设为 false
  • document.querySelector('form').submit(): 如果所有检查都通过,手动触发表单的提交。

后端判断 (服务器端验证)

后端验证更安全,因为它发生在用户无法干预的服务器端,它通常用于处理更复杂的业务逻辑,比如防重复提交

步骤:

  1. 找到并修改处理文件

    • 文件路径:/plus/diy.php,这是织梦处理所有自定义表单的核心文件。
  2. 在PHP文件中添加验证逻辑

    • 我们需要在数据入库之前,对 $_POST 接收到的数据进行检查。
    • 如果验证失败,使用 ShowMsg() 函数返回错误信息给用户。
    • 验证通过后,再继续执行原有的入库逻辑。

示例:防止同一IP在短时间内重复提交

修改 /plus/diy.php 文件:

找到类似 //增加处理 的代码段,在其之前添加以下逻辑:

<?php
// ... 文件头部的代码 ...
// 获取当前提交的表单ID
$diyid = isset($diyid) ? preg_replace("/[^0-9]/", '', $diyid) : 0;
// 获取当前用户的IP地址
$ip = GetIP();
// 防重复提交逻辑:检查同一IP在10秒内是否提交过
$allowTime = 10; // 允许的最小间隔时间(秒)
$currentTime = time();
// 从session中获取上次提交的时间戳
// 注意:如果用户禁用了cookie,session可能不工作,这是一个简单的实现
session_start();
$lastSubmitTime = isset($_SESSION['last_diy_submit_time_' . $diyid]) ? $_SESSION['last_diy_submit_time_' . $diyid] : 0;
if ($currentTime - $lastSubmitTime < $allowTime) {
    // 如果时间间隔太短,提示错误并终止
    ShowMsg('您提交得太快了,请稍后再试!', '-1', 0, 5000);
    exit();
}
// 如果验证通过,记录本次提交时间到session
$_SESSION['last_diy_submit_time_' . $diyid] = $currentTime;
// --- 以下是织梦原有的处理代码 ---
// 增加处理
if($action == 'post')
{
    // ... 后续的验证码、字段检查、数据处理等代码 ...
}
// ... 文件结尾 ...
?>

代码解释:

  • GetIP(): 织梦内置函数,用于获取用户IP地址。
  • session_start(): 启动会话,用于在服务器端临时存储数据。
  • $_SESSION[...]: 我们用一个session变量来记录上一次提交表单的时间,变量名中包含表单ID,这样不同表单可以独立计时。
  • ShowMsg(): 织梦的提示函数,用于显示操作结果,参数分别是:提示信息、跳转URL(-1表示返回上一页)、是否成功(0表示失败)、停留时间(毫秒)。

总结与最佳实践

判断类型 优点 缺点 适用场景
前端判断 用户体验好,即时反馈,减轻服务器压力 安全性低,可被绕过 必填项检查、格式预校验(如邮箱、手机号)
后端判断 安全性高,是数据校验的最终防线 用户体验稍差,错误返回有延迟 防重复提交、权限校验、复杂业务逻辑、数据安全过滤

推荐做法:

  1. 前端 + 后端双重验证:对于关键表单(如注册、下单、留言),必须同时使用前端和后端验证,前端提升体验,后端保证安全。
  2. 前端做格式检查:用JS快速检查用户输入是否符合基本格式(非空、邮箱格式等)。
  3. 后端做安全检查:用PHP做最终的数据校验,特别是防重复提交、防SQL注入(织梦/plus/diy.php本身有基础过滤,但自定义逻辑仍需注意)和业务逻辑判断。
  4. 错误提示友好:无论前端还是后端,验证失败时都要给出清晰、明确的错误提示,告诉用户哪里错了,应该怎么改。

通过以上方法,你就可以灵活地为织梦自定义表单添加各种强大的判断功能了。

-- 展开阅读全文 --
头像
织梦网站攻击手法有哪些防御措施?
« 上一篇 03-07
dede安装后锁文件未删除怎么办?
下一篇 » 03-07

相关文章

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

目录[+]