【发布时间】: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