问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用thinkphp的model来验证前端表单

发布网友 发布时间:2022-04-07 05:00

我来回答

3个回答

懂视网 时间:2022-04-07 09:21

对注册到test表的表单进行验证

在注册之前要对表单进行验证:

用户名非空验证,两次输入密码必须一致即相等验证,年龄在18~50之间即范围验证,邮箱格式正则验证。

自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证。

数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。

数据验证有两种方式:

  • 静态方式:在模型类里面通过$_validate属性定义验证规则。

  • 动态方式:使用模型类的validate方法动态创建自动验证规则。

  • 无论是什么方式,验证规则的定义是统一的规则,定义格式为:

    array(
    array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    ......
    );

    验证字段 (必须)

    需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等。有个别验证规则和字段无关的情况下,验证字段是可以随意设置的,例如expire有效期规则是和表单字段无关的。如果定义了字段映射的话,这里的验证字段名称应该是实际的数据表字段而不是表单字段。

    验证规则 (必须)

    要进行验证的规则,需要结合附加规则,如果在使用正则验证的附加规则情况下,系统还内置了一些常用正则验证的规则,可以直接作为验证规则使用,包括:require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字。

    提示信息 (必须)

    用于验证失败后的提示信息定义

    验证条件 (可选)

    包含下面几种情况:

  • self::EXISTS_VALIDATE 或者0 存在字段就验证(默认)

  • self::MUST_VALIDATE 或者1 必须验证

  • self::VALUE_VALIDATE或者2 值不为空的时候验证

  • 附加规则 (可选)

    配合验证规则使用,包括下面一些规则:

    1.jpg

    验证时间(可选)

  • self::MODEL_INSERT或者1新增数据时候验证

  • self::MODEL_UPDATE或者2编辑数据时候验证

  • self::MODEL_BOTH或者3全部情况下验证(默认)

  • 这里的验证时间需要注意,并非只有这三种情况,你可以根据业务需要增加其他的验证时间。

    验证有两种方式:静态验证与动态验证。

    一、静态验证

    在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义。

    验证时要在test表的Model里面加验证条件:新建testModel.class.php,在模型类里面定义了$_validate属性如下:

    <?php
    namespace HomeModel;
    use ThinkModel;
    class testModel extends Model
    {
     //静态验证
     protected $_validate = array( 
     array('uid','require','用户名不能为空'), 
     array('pwd','require','密码不能为空'),
     array('repwd','pwd','确认密码不正确',1,'confirm'),
     array('age','18,50','年龄必须在18-50岁之间',1,'between'),
     array('email','email','邮箱格式不正确'),
     
     ); 
     
    }

    定义好验证规则后,就可以在使用create方法创建数据对象的时候自动调用:

    <?php
    namespace HomeController;
    use HomeControllerCheckController;
    class ZhuCeController extends CheckController
    {
     function ZhuCe()
     {
     //静态验证,不能在后面直接显示,必须全部通过验证才能注册
     $cw = "";
     if(!empty($_GET))
     {
      $cw = $_GET["cw"]; 
     }
     if(empty($_POST))
     {
      $this->assign("error",$cw);
      $this->display();
     }
     else
     {
      $model = new HomeModel	estModel();
      //$model = D("test"); //动态验证可以用D方法
      
      if(!$model->create())
      {  
      $e = $model->getError();
      $url = "ZhuCe/cw/{$e}";
      $this->error("注册失败!",$url,1);
      }
      else
      {
      $model->add(); 
      }

    模板ZhuCe.html:

    <body>
    <form action="__ACTION__" method="post">
    <div>用户名:<input type="text" name="uid" id="uid" /> </div><br />
    <div>密码:<input type="text" name="pwd" id="pwd" /></div><br />
    <div>确认密码:<input type="text" name="repwd" id="repwd" /> </div><br />
    <div>年龄:<input type="text" name="age" id="age" /> </div><br />
    <div>邮箱:<input type="text" name="email" id="email" /> </div><br />
    <div>姓名:<input type="text" name="name" /></div><br />
    <div><{$error}></div> <!--显示错误信息-->
    <input type="submit" value="注册" />
    </form>

    请求ZhuCe方法:

    2.jpg

    二、动态验证

    如果采用动态验证的方式,就比较灵活,可以根据不同的需要,在操作同一个模型的时候使用不同的验证规则,例如上面的静态验证方式可以改为:

    <?php
    namespace HomeController;
    use HomeControllerCheckController;
    class ZhuCeController extends CheckController
    {
     function ZhuCe()
     { 
     if(empty($_POST))
     {  
      $this->display();
     }
     else
     {
      //$model = new HomeModel	estModel();
      $model = D("test"); //动态验证可以用D方法  
      //动态验证
      $rules = array(
      array('uid','require','用户名不能为空')
      );
      //调用validate()加入验证规则
      $r = $model->validate($rules)->create();//若验证失败返回false,成功返回注册的test表数组信息
      //var_dump($r);
      if(!$r)
      {
      echo $model->getError(); //若验证失败则输出错误信息 
      }
      else
      {
      $model->add(); 
      }
      
     } 
     }

    我们还可以在表单后面直接显示错误提示,这就要用到ajax。以验证用户名非空为例:

    在模板ZhuCe.html中:

    <script src="../../../../../jquery-1.11.2.min.js"></script> 
    </head>
    
    <body>
    <form action="__ACTION__" method="post">
    <div>用户名: <input type="text" name="uid" id="uid" /> <span id="ts"></span></div><br />
    <div>密码:  <input type="text" name="pwd" id="pwd" /> <span id="pts"></span></div><br />
    <div>确认密码:<input type="text" name="repwd" id="repwd" /> <span id="rpts"></span></div><br />
    <div>年龄:  <input type="text" name="age" id="age" /> <span id="nts"></span></div><br />
    <div>邮箱:  <input type="text" name="email" id="email" /> <span id="ets"></span></div><br />
    <div>姓名:  <input type="text" name="name" /></div><br />
    <!--<div><{$error}></div> --> <!--显示错误信息-->
    <input type="submit" value="注册" />
    </form>
    </body>
    </html>
    <script type="text/javascript">
    $(document).ready(function(e) {
     $("#uid").blur(function(){
     var uid = $(this).val();
     $.ajax({
      
      url:"__CONTROLLER__/Yhm", <!--提交到方法,而不是页面-->
      data:{uid:uid}, <!--因为做的是表单验证,所以提交时要与表单name值一致,相当于提交表单 -->
      type:"POST",
      dataType:"TEXT", <!--返回数据类型要与ajaxReturn中的参数对应,TEXT对应eval-->
      success: function(data){
      //alert(data);
      var str = "";
      if(data.trim()=="OK")
      {
       str = "<span style='color:green'>"+data+"</span>";
      }
      else
      {
       str = "<span style='color:red'>"+data+"</span>"; 
      }
      
      $("#ts").html(str);
      }
      }); 
     })

    在ZhuCe控制器中再做一个Yhm方法:

    //验证用户名非空
     function Yhm()
     {
     $model = D("test"); 
     $rules = array(
      array('uid','require','用户名不能为空')
      );
      
      if(!$model->validate($rules)->create())
      {
      $fh = $model->getError();
      $this->ajaxReturn($fh,'eval'); //ajax返回数据,默认返回json格式,eval返回字符串,因为dataType是TEXT,所以用eval格式
      }
      else
      {
      $fh = "OK"; 
      $this->ajaxReturn($fh,'eval');
      }
     }

    请求ZhuCe方法:

    3.jpg

    其他验证也是类似的方法,提交相应数据到对应方法,使用相应的验证规则。

    推荐教程:《TP5》

    热心网友 时间:2022-04-07 06:29

    验证传递的参数呗,用model层来验证前端表单,这个想法个人觉得还是不值得提倡的

    热心网友 时间:2022-04-07 07:47

    thinkphp有自带的验证器。详见think\Validate;
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    电脑常用的系统是常见的电脑操作系统有哪些 电脑有哪些系统软件电脑都有哪些系统 csgo箱子开哪个性价比高-七种高性价比箱子详情介绍 word的空白页怎么删除不了word中空白页删不掉解决方法 word空白页怎么删除不了 删除不掉解决方法 word空白页怎么删除不了word中为什么空白页删不掉 word中删除空白页怎么删word空白页删除不掉咋办 表白两次她都说我们继续做朋友,我还有机会吗? 糖尿病人运动最佳方式 糖尿病的人要怎样运动 一个手机号付卡能不能申请微信,那个主卡能不能知道? 副卡怎么注册? 公祭日诗经体《和平宣言》是怎样出炉的 和平宣言属于是民谣还是童谣 古诗中的山水风光的诗与春夏秋冬的诗各10首.每首做题解,说明作者、朝代,并对原诗做简要介绍 描写山水风景的诗句 描写山景的诗句 副卡怎么注册? 形容山景美的诗句 描写山水景色的古诗 描写“高山美景”的诗句有哪些? 宝马是什么车 描写山景的诗句要诗题和作者 开天猫旗舰店怎么开,要多少资金 天猫旗舰店怎么开 空中课堂是什么短语类型? 3月2号上海空中课堂三年级第一节课语文作业是什么? 开天猫官方旗舰店流程?怎么开? 小学一年级除了26节课以外其他4节空课干什么 在岳阳什么频道观看小学一年级空中课堂课程? 手机负卡丢了,别人能用它注册吗? 有框画和无框画有什么区别啊~ 手机付卡能申请吗? 有框装饰画是装裱表面有玻璃封装和油画一样还是直接画布裸露? 如何自我诊断是否出现半月板损伤 怎样描述运动自我诊断 沙发背景墙画是带框的还是不带框的好 皮肤过敏应该怎样自我诊断 客厅该选哪种墙面装饰画?用墙面装饰画做装饰好吗? 请问一下,客厅的装饰画,商家推荐我买无框画,这个是什么意思啊?跟有框画有什么区别啊? 客厅装饰画选用无框的还是有框的好 另外带时钟的无框画好不 尚尚木莲 进口画芯 美克美家欧式客厅装饰画有框画壁画幸福树C18 质量行... 车载感应充电器怎么使用 墙纸壁画和墙纸有何区别 手绘油画装饰画有框,但是不是都没玻璃罩 新买的微波炉怎么清洗? 想买个装饰画,请问在哪有真迹啊? 日常家庭急救 首次使用微波炉该怎么清洗 之前没有用过微波炉,第一次使用是不是需要消毒?顺便把一些注意事项和使用技巧告诉我下,谢谢!感激不尽