【问题标题】:ZF2 Zend\Validator\DateStep Fatal error: Maximum execution time of 30 secondsZF2 Zend\Validator\DateStep 致命错误:最长执行时间为 30 秒
【发布时间】:2023-04-01 13:58:01
【问题描述】:

所以这是我的情况,我正在设置一个包含日期时间字段的表单

$this->form->add(array(
    'type'       => 'Zend\Form\Element\DateTime',
    'name'       => 'date',
    'options'    => array(
        'label'  => 'published_from',
        'format' => 'Y-m-d H:i:s'
    ),
    'attributes' => array(
        'class'     => 'datePicker form-control',
        'readonly'  => 'readonly',
        'data-type' => 'date'         
    ),
));

没有最小/最大值或步长,应用默认值,然后我以这样的形式显示它

<?php echo $this->formDateTime($form->get('date')); ?>

现在,只要我提交此表单,内置验证过滤器就会启动,在通过所有初始验证后,它会到达 Zend\Validator\DateStep 类第 347-362 行

   if ($baseDate < $valueDate) {
        while ($baseDate < $valueDate) {
            $baseDate->add($step);

            if ($baseDate == $valueDate) {
                return true;
            }
        }
    } else {
        while ($baseDate > $valueDate) {
            $baseDate->sub($step);
            if ($baseDate == $valueDate) {
                return true;
            }
        }
    }

它陷入明显的无限循环并超时。 $baseDate 和 $valueDate 的值,如果是 $baseDate =

object(DateTime)#345 (3) { 
   ["date"]=> string(19) "1970-01-01 01:00:00" 
   ["timezone_type"]=> int(3) 
   ["timezone"]=> string(13) "Europe/London" 
} 

和 $valueDate =

object(DateTime)#442 (3) { 
    ["date"]=> string(19) "2014-05-07 16:57:54" 
    ["timezone_type"]=> int(3) 
    ["timezone"]=> string(13) "Europe/London" 
}

我做错了什么???

【问题讨论】:

  • $step 设置为什么?
  • 默认是 1sec 我刚刚意识到这一点,所以如果它必须进行数十亿次迭代,那么出错是有意义的,我想问题是为什么如果没有 min- 这部分验证会运行最大值(这意味着如果他不输入这些值,他不关心日期范围),如果一个人只是想确保它是一个有效的日期怎么办?我想我会使用常规文本字段并向表单添加日期验证器...

标签: php validation datetime zend-framework2


【解决方案1】:

虽然您没有最小/最大值或步长,但该错误表明您在某处设置了 DateStep InputFilter:

    $inputFilter->add( array(
        'name'     => 'deadline',
        'required' => false,
        'validators' => array(
            array(
                'name'    => 'DateStep',
                'options' => array(
                    'step' => new \DateInterval("P2D"),
                    'baseValue' => new \DateTime(),
                    'format'    => 'd/m/Y H:i:s',
                    'messages' => array( \Zend\Validator\DateStep::NOT_STEP => 'Must be at least two days in the future'),
                ),
            ),
        ),
    ));

如果您将日期验证器设置为使用 DateTime,您将收到此执行时间错误:

'type'       => 'Zend\Form\Element\DateTime',

设置为:

'type'       => 'Zend\Form\Element\Date',

改为。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2011-07-07
    • 2015-03-31
    • 1970-01-01
    • 2014-06-26
    • 2015-11-12
    相关资源
    最近更新 更多