使用DedeCMS自带的/plus/diy.php验证码功能(推荐,最简单)
这是最标准、最简单的方法,直接利用DedeCMS内置的验证码功能,无需修改核心文件,兼容性最好。

适用场景
- 创建一个新的自定义表单。
- 或者,为已有的自定义表单添加验证码。
操作步骤
第1步:创建或修改自定义表单
- 登录您的DedeCMS后台。
- 进入【核心】 -> 【内容频道模型】 -> 【自定义表单】。
- 如果是新建表单:
- 点击【增加自定义表单】,填写表单名称(留言反馈”),选择表单目录(默认为
/plus/),然后点击“保存”。 - 进入新创建的表单管理页面,点击【字段管理】。
- 点击【增加字段】,添加您需要的字段(如姓名、电话、内容等)。
- 点击【增加自定义表单】,填写表单名称(留言反馈”),选择表单目录(默认为
- 如果是为已有表单添加验证码:
直接进入该表单的字段管理页面。
第2步:添加验证码字段
这是最关键的一步,您需要添加一个专门用于接收验证码输入的字段。

- 在字段管理页面,点击左上角的【增加字段】。
- 填写字段信息:
- 字段名称:
validatecode(这是系统约定好的名称,必须使用,大小写敏感) - 字段提示:
验证码(这是在前端显示给用户的提示文字) - 字段类型:
单行文本 - 前台提交:
是 - 必填项:
是(强烈建议设置为必填,防止用户不填写) - 其他选项:保持默认即可。
- 字段名称:
- 点击【保存】。
第3步:修改表单模板文件
您需要在前端页面中,让用户能看到输入框和验证码图片。
- 进入【核心】 -> 【内容频道模型】 -> 【自定义表单】,找到您刚才创建的表单。
- 在表单管理页面,点击【选择模板】,系统会默认生成一个模板文件,路径通常是
/templets/plus/diyform.htm。 - 用FTP或网站后台的文件管理器,打开这个
diyform.htm文件。 - 在您希望显示验证码的位置(通常是提交按钮的上方),添加以下HTML代码:
<div class="form-group">
<label for="validatecode">验证码:</label>
<div class="input-group">
<input type="text" class="form-control" name="validatecode" id="validatecode" style="width:150px;" required>
<img src="/plus/vdimgck.php" onclick="this.src='/plus/vdimgck.php?'+Math.random();" title="看不清?点击换一张" style="cursor:pointer;height:32px;vertical-align:middle;">
</div>
</div>
代码解释:
<input type="text" ... name="validatecode">:这个name属性必须和您在第2步中创建的字段名称validatecode完全一致。<img src="/plus/vdimgck.php">:这是DedeCMS生成验证码图片的固定地址。onclick="this.src='/plus/vdimgck.php?'+Math.random();":这是点击图片刷新验证码的JavaScript代码,提升用户体验。
第4步:修改处理文件以启用验证

需要告诉DedeCMS在接收表单数据时,要验证这个验证码。
-
用FTP或文件管理器,打开
/plus/diy.php文件。 -
找到以下代码段(通常在文件末尾,在
if($dsql->Execute('add')){之前)://在这里执行入库操作 $addvar = array(); $addvalue = array(); foreach($diy->getOneTableFields() as $field=>$v) { if($v[1] == 'text' || $v[1] == 'textarea' || $v[1] == 'number' || $v[1] == 'datetime') { $addvar[] = $field; $addvalue[] = "'".addslashes(${$field})."'"; } } $inquery = "INSERT INTO `{$diy->table}` (`".implode('`,`', $addvar)."`) VALUES (".implode(',', $addvalue).")"; //echo $inquery; $dsql->ExecuteNoneQuery($inquery); -
在这段代码的前面,添加如下验证代码:
//验证码检查 if(preg_match("/3d/",$safe_gdopen)){ //验证码类型为3D if(strtolower($vdcode)!=$GLOBALS['validatecode']){ showMsg('验证码错误!', '-1'); exit(); } }else{ //验证码类型为普通 if(strtolower($vdcode)!=$GLOBALS['validatecode']){ showMsg('验证码错误!', '-1'); exit(); } } unset($_SESSION['validatecode']);
代码解释:
- 这段代码会获取用户提交的
vdcode(隐藏字段,DedeCMS自动生成)和validatecode(我们刚才添加的输入框的值)进行比较。 - 如果不一致,就提示“验证码错误!”并停止执行。
unset($_SESSION['validatecode']);验证成功后,销毁session中的验证码,防止重复提交。
第5步:清理缓存
完成以上所有步骤后,登录DedeCMS后台,点击右上角的【生成】->【一键更新网站】,然后选择“更新缓存”,确保修改生效。
您的表单就已经成功加上了验证码功能!
为已有表单页面手动添加验证码(适用于未使用diy.php的情况)
开发者可能直接在自己的页面模板里写表单提交逻辑,而不是使用/plus/diy.php,这种情况下,需要手动引入和验证。
操作步骤
第1步:在前端表单页面添加验证码HTML
在您的表单代码中,添加和【方法一】第3步完全相同的HTML代码块:
<div class="form-group">
<label for="validatecode">验证码:</label>
<div class="input-group">
<input type="text" class="form-control" name="validatecode" id="validatecode" style="width:150px;" required>
<img src="/plus/vdimgck.php" onclick="this.src='/plus/vdimgck.php?'+Math.random();" title="看不清?点击换一张" style="cursor:pointer;height:32px;vertical-align:middle;">
</div>
</div>
第2步:修改表单提交地址
确保您的<form>标签的 action 属性指向处理文件,action="/plus/diy.php"。
第3步:在处理文件中添加验证逻辑
假设您的表单提交到 plus/your_handler.php,您需要在这个文件里加入验证码验证代码。
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php"); // 引入DedeCMS核心文件
// 1. 接收表单数据
$name = isset($_POST['name']) ? $_POST['name'] : '';
$tel = isset($_POST['tel']) ? $_POST['tel'] : '';
$validatecode = isset($_POST['validatecode']) ? $_POST['validatecode'] : '';
// 2. 验证码校验
// 从session中获取系统生成的验证码
$sessionCode = isset($_SESSION['validatecode']) ? $_SESSION['validatecode'] : '';
// 比较用户输入的和session中的,不区分大小写
if (strtolower($validatecode) !== strtolower($sessionCode)) {
// 验证失败,返回提示
echo json_encode(['code' => 0, 'msg' => '验证码错误!']);
exit;
}
// 3. 验证通过,继续处理您的业务逻辑(例如入库等)
// ...您的代码...
// 示例:成功后返回JSON
echo json_encode(['code' => 1, 'msg' => '提交成功!']);
?>
注意:
- 这种方法需要您手动处理所有表单数据和业务逻辑。
- 必须引入
common.inc.php才能使用$_SESSION变量。 - 验证成功后,同样建议
unset($_SESSION['validatecode']);。
常见问题与解决方案 (FAQ)
Q1: 为什么我添加了验证码,但提交时仍然提示“验证码错误”?
- 原因1:
/plus/diy.php文件没有修改,或者修改后没有清理缓存。 - 原因2:字段名称
validatecode拼写错误,或者大小写不一致。 - 原因3:服务器
session功能未开启或配置有问题,检查php.ini文件中的session.save_path是否有写入权限。 - 原因4:使用了缓存插件,导致验证码逻辑被覆盖。
Q2: 验证码图片不显示,显示一个红叉或者 broken 图片图标。
- 原因1:GD库未开启,在您的服务器
php.ini文件中,找到;extension=gd和;extension=php_gd2.dll(Windows),去掉前面的分号 ,然后重启Apache或Nginx。 - 原因2:
/plus/vdimgck.php文件丢失或权限错误,请确保该文件存在,并且有可执行权限。 - 原因3:服务器目录权限问题,导致无法生成临时验证码图片。
Q3: 如何修改验证码的样式(如字符数、干扰点等)?
- 验证码的生成逻辑在
/include/vdimgck.php文件中,您可以修改这个文件里的$rndc(字符数)、$noise(干扰点)等变量来自定义样式,但请注意,直接修改核心文件不利于后期升级。
希望这份详细的教程能帮助您成功为DedeCMS表单添加验证码!
