为了表单安全,重命名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对应后台创建的字段。
效果如图:
需要特别注意的是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 "<script language=javascript>alert('短时间内提交次数过多!请30秒后再试!');window.location = 'yuyue.php?action=post&diyid=8';</script>"; 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 "<script language=javascript>alert('每位孕妈妈最多预约2张');history.go(-1);</script>"; 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->GetOne($query); if(is_array($row)) { echo "<script language=javascript>alert('您已经预约成功了,请勿重复提交。');history.go(-1);</script>"; exit(); } } |
diyform8就是你的表单的数据表的名称。
到这里一个基本完美的表单就成功了。
转载请注明出处:https://alvin.cool/dedecms-diyform.html