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

(图片来源网络,侵删)
-
前端判断 (客户端验证):
- 目的:在用户提交表单之前,进行初步的数据格式和必填项检查。
- 优点:响应速度快,能即时给用户反馈,减轻服务器压力。
- 缺点:可以被用户禁用JavaScript或绕过,不能作为唯一的安全验证手段。
- 实现方式:在表单模板中使用
JavaScript和正则表达式。
-
后端判断 (服务器端验证):
- 目的:在表单提交到服务器后,PHP代码对数据进行最终、安全的验证和处理。
- 优点:安全性高,是防止非法数据入库的最后一道防线。
- 缺点:如果验证失败,需要返回错误信息,用户体验稍差。
- 实现方式:修改处理表单的PHP文件(
plus/diy.php)。
前端判断 (客户端验证)
这是最常用也最简单的判断方式,适用于必填项、邮箱格式、手机号格式等。
步骤:
-
找到你的自定义表单模板文件
(图片来源网络,侵删)- 通常位于
/templets/你的模板目录/plus/diyform.htm。 - 如果你在后台为表单指定了模板,则使用指定的模板文件。
- 通常位于
-
在表单标签中添加必要的属性
织梦的自定义表单字段(如文本框、文本域)默认会生成一些特定的
class和id,我们可以利用这些来编写JS。{dede:diyfield name='字段名'/}:这是自定义字段的输出标签。required:HTML5新增的属性,表示该字段为必填,浏览器会自动进行基础验证。class="input-text":织梦默认给输入框添加的class,我们可以通过它来选择元素。
-
编写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(): 如果所有检查都通过,手动触发表单的提交。
后端判断 (服务器端验证)
后端验证更安全,因为它发生在用户无法干预的服务器端,它通常用于处理更复杂的业务逻辑,比如防重复提交。
步骤:
-
找到并修改处理文件
- 文件路径:
/plus/diy.php,这是织梦处理所有自定义表单的核心文件。
- 文件路径:
-
在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表示失败)、停留时间(毫秒)。
总结与最佳实践
| 判断类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 前端判断 | 用户体验好,即时反馈,减轻服务器压力 | 安全性低,可被绕过 | 必填项检查、格式预校验(如邮箱、手机号) |
| 后端判断 | 安全性高,是数据校验的最终防线 | 用户体验稍差,错误返回有延迟 | 防重复提交、权限校验、复杂业务逻辑、数据安全过滤 |
推荐做法:
- 前端 + 后端双重验证:对于关键表单(如注册、下单、留言),必须同时使用前端和后端验证,前端提升体验,后端保证安全。
- 前端做格式检查:用JS快速检查用户输入是否符合基本格式(非空、邮箱格式等)。
- 后端做安全检查:用PHP做最终的数据校验,特别是防重复提交、防SQL注入(织梦
/plus/diy.php本身有基础过滤,但自定义逻辑仍需注意)和业务逻辑判断。 - 错误提示友好:无论前端还是后端,验证失败时都要给出清晰、明确的错误提示,告诉用户哪里错了,应该怎么改。
通过以上方法,你就可以灵活地为织梦自定义表单添加各种强大的判断功能了。
