【问题标题】:Data validation using old field value使用旧字段值进行数据验证
【发布时间】:2014-07-31 08:10:25
【问题描述】:

我正在 CakePHP 上开发应用程序,但我是数据验证的新手。 我需要的是在修改字段时检查日期时间值,所以我需要检查旧的日期时间值并验证新的日期时间值是否相等或更高。 我觉得最好是使用自定义验证,但是不知道如何获取字段的旧值,以及如何区分创建和编辑。

这里是一个简单的例子:

1) 我在我的数据库中注册了一个新事件,它有名称、开始日期、结束日期、ecc...

2) 我想编辑这个事件,所以我插入一个新的开始日期和一个新的结束日期,现在我需要这个验证:

如果旧值在新值之前:

更新记录;

其他:

数据校验失败,不更新记录;

【问题讨论】:

    标签: php mysql cakephp validation


    【解决方案1】:

    数据验证在您的模型中进行(如果您真的需要,可以在您的控制器中完成,但如果在模型中完成,Cake 会让事情变得更容易)。

    在您的“事件”模型中:

    $public validate = array(    //each field can have its own validation rule set here
        'end_date' => array(
            'rule' => 'customEndDateValidation',    //the name of our custom validation function to use
            'on' => 'update',    //only do this when we update a record
            'message' => 'New end date must be greater than previous end date'    //message if validation fails
        )
    );
    
    public function customEndDateValidation($check) {
        //get previous end date
        $old_record = $this->find(
            'all',
            array(
                'conditions' => array(
                    'Event.id' => $this->data[$this->alias]['id']
                ),
                'fields' => array(
                    'Event.end_date'
                )
            )
        );
    
        //if the new end date is greater than the old one return true - otherwise it will reach the return false
        if (strtotime($check['end_date']) > strtotime($old_record['Event']['end_date'])) {
            return TRUE;
        }
        return FALSE;
    }
    

    有关 Cake 验证的更多信息,请查看 http://book.cakephp.org/2.0/en/models/data-validation.html

    【讨论】:

      【解决方案2】:

      只需添加表的 2 个属性:“created”和“modified”

      这是 CakePHP 的标准

      if isn't the answer that you search


      //我的桌子

      Project
      [0]--Id
      [1]--Name
      [2]--DateEdit
      [3]--OlderDateEdit
      [4]--modified
      [5]--created
      

      //http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods

      //查看

      <?php 
      echo $this->Form->input('Project.DateEdit',array("label"=>"Date edit"));
      echo $this->Form->hidden('Project.OlderDateEdit');
      

      //控制器

      <?php
      public function edit($id = null) {
              if (empty($this->data)) {
                  $this->Project->id = $id;
                  $this->data = $this->Project->read();
      
                  $this->data['Project']['OlderDateEdit']=$this->data['Project']['DateEdit'];
              } 
              else {
      
                  if ($this->Project->save($this->data['Project'])) {
      
                  }
              }
          }
      

      //型号

      <?php
      class Project extends AppModel {
          public $validate = array(
              'verif_date' => array(
                  'rule'    => array('comparison-Dte','OlderDateEdit'),
                  'message' => 'ur datetime is older'
              )
          );
      

      //AppModel//

      <?php
      public function comparison-Dte($check, $limit) {
      
              $valeur = array_values($check);
              $valeur = $valeur[0];
              $OldDateEdit = $limit;
              ));
              return $NewDateEdit > $OldDateEdit;
          }
      }
      

      【讨论】:

      • 谢谢,但不是关于创建和修改的日期时间,我必须在表中记录事件,所以我有一个开始和结束列,对于某些开发逻辑,是不可能的将结束日期修改为比以前更早的日期。我需要的是检查值,但在模型验证规则中,以避免错误编辑。
      • 你能用比较测试一下吗?我不知道它是否在 date =) 有效。如果不起作用,请在保存前比较控制器中的两个日期。
      • 比较测试?请你能解释一下你的意思吗?这是我正在寻找的想法...我想避免检查控制器,因为有各种可以编辑数据的操作,最好的解决方案是降低级别(模型)
      • 我在“hr”下编辑了我的答案,验证在模型中
      • 比较没有使用其他字段?啊,好吧...这是一种解决方法,所以我必须掩盖真实字段并更新一个不同的字段...但是在这种情况下,您不会覆盖编辑字段,最后,如果您验证将不起作用使用真实的字段...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2021-06-27
      相关资源
      最近更新 更多