织梦的自定义表单功能非常灵活,但默认情况下限制较少,这可能导致垃圾信息提交或数据不规范,在实际应用中,我们通常需要手动添加一些限制。
以下是常见的限制类型和实现方法,从易到难:
限制必填字段
这是最基本也是最常用的限制,确保用户提交了关键信息。
实现方法:
在织梦后台,你无法直接设置“必填”,但可以通过修改模板文件来实现。
-
打开自定义表单模板文件
- 这个文件通常位于你的模板目录下,路径为:
/templets/plus/diyform.htm - 如果你在后台“模板管理”中为自定义表单指定了单独的模板,则打开那个指定的文件。
- 这个文件通常位于你的模板目录下,路径为:
-
为需要必填的
<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>
-
(可选)添加前端提示 为了更好的用户体验,你可以在
<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。
-
在
diyform.htm中找到<form>,通常它有一个onsubmit事件。<!-- 找到类似这样的代码 --> <form action="/plus/diy.php" enctype="multipart/form-data" method="post">
-
添加自定义的校验函数
<form action="/plus/diy.php" enctype="multipart/form-data" method="post" onsubmit="return returnCheck();">
-
在页面底部
<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。
-
打开
/plus/diy.php文件 -
找到处理表单提交的核心代码段,通常在
if($do == 2)附近。 -
在写入数据库之前,添加频率限制逻辑
示例代码:
// 在 $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 两个文件。
-
修改
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>
-
-
修改
/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(); } // --- 结束:添加文件类型和大小限制 --- }
使用验证码(最有效的防刷手段)
验证码是区分人类和机器人的最直接方法。
实现方法:
织梦自带验证码功能,集成到自定义表单中非常方便。
-
打开
diyform.htm -
在合适的位置添加验证码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+'?'":点击图片刷新验证码。
-
(可选)在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 |
最有效的防机器人手段,强烈推荐 |
在实际项目中,通常会组合使用这些方法,以达到最佳的表单控制和用户体验,必填字段 + 格式校验 + 验证码 是一个非常标准和安全的组合。
