User-Profile-Image
hankin
  • 5
  • 首页
  • Dedecms
  • Notes
  • php
  • Tools
  • Music
  • 分类
    • Tools
    • php
    • Notes
    • Music
    • Dedecms
  • 页面
  • 友链
      请到[后台->主题设置->友情链接]中设置。
Help?

Please contact us on our email for need any support

Support
  • 首页
  • Dedecms
  • Notes
  • php
  • Tools
  • Music
    首页   ›   Dedecms   ›   正文
Dedecms

Dedecms自定义表单全攻略

2014-01-12 11:27:00
4236  0 0

为了表单安全,重命名diy.php为相关名称,例如:yuyue.php。
然后在修改里面的$diyid为当前表单ID,调用的时候直接yuyue.php就好了,免得用id泄露了其他表单数据。
下面就是一系列操作了,当你建立了表单之后,发现很多不如意的东西。
首先你会发现,提交空数据的问题,当然这个必须要JS和php双重验证,这个也是做一个表单的基本。
自定义表单必填内容:
找到

1
$dede_fields = empty($dede_fields) ? '' : trim($dede_fields);

再下面添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//增加必填字段判断
if($required!=''){
if(preg_match('/,/', $required))
{
$requireds = explode(',',$required);
foreach($requireds as $field){
if($$field==''){
//showMsg('带*号的为必填内容,请正确填写', '-1');
echo "<script language=javascript>alert('带*号的为必填内容,请正确填写');history.go(-1);</script>";
exit();
}
}
}else{
if($required==''){
//showMsg('带*号的为必填内容,请正确填写', '-1');
echo "<script language=javascript>alert('带*号的为必填内容,请正确填写');history.go(-1);</script>";
exit();
}
}
}
//end

上面代码把showmsg注释掉了,这个就是系统自带的提示,如果想弹出alert就用上面的代码吧。

很少有人会用默认的表单模版,自定义的话就查看默认的源代码。模版就在/templets/plus这个文件夹里,创建一个比如名称是post_diyform8.htm那么就是ID为8的表单。
下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="<?php echo $cfg_cmspath;?>/plus/yuyue.php" enctype="multipart/form-data" method="post">
<ul>
<input type="hidden" name="action" value="post" />
<input type="hidden" name="diyid" value="<?php echo $diyid;?>" />
<input type="hidden" name="do" value="2" />
<input type="hidden" name="ip" id="ip" value="">
<input type="hidden" name="ttime" id="ttime" value="">
<li><input type='text' name='name' id='name' class='intxt' value='' />*</li>
<li><input type='text' name='tel' id='tel' class='intxt' value=''  />*</li>
<li><input type='text' name='riqi' id='riqi' class='intxt' value='' />*</li>
<li><input type='text' name='quantity' id='quantity' class='intxt' value='1' />*</li>
<li class="beizhu"><textarea name='remark' id='remark' ></textarea></li>
<input type="hidden" name="dede_fields" value="name,text;tel,text;riqi,text;quantity,int;remark,multitext;ip;ttime" />
<input type="hidden" name="dede_fieldshash" value="<?php echo md5($cfg_cookie_encode);?>" />
<input type="hidden" name="required" value="name,tel,riqi,quantity" /> </ul>
<input type="submit" name="submit" id="submit" value="" class="button">
</form>

这些input对应后台创建的字段。
效果如图:Dedecms自定义表单
需要特别注意的是dede_fieldshash这个隐藏input,这个获取错误就不能提交表单。所以我修改了一下yuyue.php里的dede_fieldshash函数。
找到:

1
if($dede_fieldshash != md5($dede_fields.$cfg_cookie_encode))

修改为:

1
if($dede_fieldshash != md5($cfg_cookie_encode))

这样就能解决提示“数据校验不对,程序返回”了。
到这里一个表单基本就完成了,使用过程中还会发现各种问题,下面就列一下常见问题。
重复提交表单
分为访客和机器人提交。首先我们来解决访客提交的。
用IP+cookie进行限制比如30秒内只能提交一次。
找到:

1
2
3
4
5
if(!is_array($diyform))
        {
            showmsg('自定义表单不存在', '-1');
            exit();
        }

在下面添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//检测游客是否已经提交过表单
if(isset($_COOKIE['VOTE_MEMBER_IP']))
{
if($_COOKIE['VOTE_MEMBER_IP'] == $_SERVER['REMOTE_ADDR'])
{
//ShowMsg('您已经填写过表单啦','-1');
echo "&lt;script language=javascript&gt;alert('短时间内提交次数过多!请30秒后再试!');window.location = 'yuyue.php?action=post&amp;diyid=8';&lt;/script&gt;";
exit();
} else {
setcookie('VOTE_MEMBER_IP',$_SERVER['REMOTE_ADDR'],time()+30,'/');
}
} else {
setcookie('VOTE_MEMBER_IP',$_SERVER['REMOTE_ADDR'],time()+30,'/');
}

正则验证
继续在上面的代码下面加入:

1
2
3
4
5
if(!eregi("^[1,2]$",$quantity))
{
echo "&lt;script language=javascript&gt;alert('每位孕妈妈最多预约2张');history.go(-1);&lt;/script&gt;";
exit();
}

上面只列出一个,$quantity对应你的表单字段。
这样不仅能限制访客输入固定的值,还能有效的防止机器人。
到这里表单基本完成了。
后续使用中还会发现访客重复提交数据的问题,这样就要在提交的时候查询数据库进行比对,比如:验证手机号码是否存在。
找到:

1
2
3
4
5
if($fieldinfo[1] == 'textdata')
                    {
                        ${$fieldinfo[0]} = FilterSearch(stripslashes(${$fieldinfo[0]}));
                        ${$fieldinfo[0]} = addslashes(${$fieldinfo[0]});
                    }

在下面添加:

1
2
3
4
5
6
7
8
9
10
if($fieldinfo[0] == 'tel')
{
$query = "SELECT * FROM #@__diyform8 WHERE tel='${$fieldinfo[0]}'";
$row = $dsql-&gt;GetOne($query);
if(is_array($row))
{
echo "&lt;script language=javascript&gt;alert('您已经预约成功了,请勿重复提交。');history.go(-1);&lt;/script&gt;";
exit();
}
}

diyform8就是你的表单的数据表的名称。
到这里一个基本完美的表单就成功了。
转载请注明出处:https://alvin.cool/dedecms-diyform.html

评论 (0)

点击这里取消回复。

欢迎您 游客  

Archives
  • 2019年4月
  • 2018年10月
  • 2018年5月
  • 2018年2月
  • 2016年7月
  • 2015年12月
  • 2014年9月
  • 2014年3月
  • 2014年1月
  • 2013年12月
  • 2013年11月
Categories
  • Dedecms
  • Music
  • Notes
  • php
  • Tools
标签
Dedecms Dedecms短信 Dedecms自定义表单 dedecms自定义表单必填字段 dede_fieldshash showmsg sitemap 织梦 网站地图 自定义表单短信
其他操作
  • 登录
  • 条目feed
  • 评论feed
  • WordPress.org
Copyright © 2025
smarty_hankin 主题. Designed by hankin
主页
页面
博主
Alvin 管理员
14 文章 0 评论 57369 浏览
测试
测试