为什么我的Zend验证数字无法识别?

mar*_*nke 3 zend-framework zend-validate

我正在使用Zend Framework创建一个表单来捕获用户的人口统计信息.我正在努力验证两个文本字段的数字.

我在../application/forms/UserDemographics.php中构建我的表单,如下所示:

class Application_Form_UserDemographics extends Zend_Form
    {
        public function init()
        {
            $this->form = new Zend_Form;            
            $dbAdapter = Zend_Registry::get("db");  

                        ...

                        $this->fax_number = new Zend_Form_Element_Text('fax_number');
            $this->fax_number->setLabel('Fax Number')
                ->addFilter('Int')
                ->addFilter('StripTags')
                ->addValidator('Digits');   

                        $this->mobile_number = new Zend_Form_Element_Text('mobile_number');
            $this->mobile_number->setLabel('Mobile Number')
                ->addFilter('Int')
                ->addFilter('StripTags')
                ->addValidator('Digits');

                        ...

                }
         }
Run Code Online (Sandbox Code Playgroud)

我的数据库当前配置如下关于fax_number和mobile_number字段,以便我可以测试是否接受数字:

+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
...
| fax_number      | varchar(32) | NO   |     | NULL    |              
| mobile_number   | int(15)     | YES  |     | NULL    |              
...
Run Code Online (Sandbox Code Playgroud)

当我在zend表单中的任何一个字段中输入任何数字而不是数字时 - 即使我有一个数字验证器添加到两个元素中,也不会显示错误消息.

输入到手机号码文本字段的文本将替换为数据库中的0(零):

mysql> select fax_number, mobile_number from user_demographics;
+--------------------+---------------+
| fax_number         | mobile_number |
+--------------------+---------------+
| var char no digits |             0 |
+--------------------+---------------+
Run Code Online (Sandbox Code Playgroud)

至少mobile_number字段应该显示一条错误消息,说明只能在文本字段中输入数字,对吧?

为什么看起来数字验证器不被识别?

这基本上表明Digits验证器几乎被忽略了.在呈现表单时,文本字段中包含0(零),但是当我在文本字段中输入文本时,不会显示错误消息 - 即使对于在数据库中设置为int的mobile_number字段也是如此.

请指教?

Mic*_*Osl 7

这是因为过滤器在验证器之前处理.

那么你的代码的作用如下:

  1. 拿输入
  2. 将其转换为int,如果包含任何不可转换的文本,则为0
  3. 剥去标签
  4. 检查输入是否仅包含数字,由于int过滤器,因此总是如此.

因此,要解决此问题,只需删除int-filter:

class Application_Form_UserDemographics extends Zend_Form
{
    public function init()
    {
        $this->form = new Zend_Form;            
        $dbAdapter = Zend_Registry::get("db");  

                    ...

                    $this->fax_number = new Zend_Form_Element_Text('fax_number');
        $this->fax_number->setLabel('Fax Number')
            ->addFilter('StripTags')
            ->addValidator('Digits');   

                    $this->mobile_number = new Zend_Form_Element_Text('mobile_number');
        $this->mobile_number->setLabel('Mobile Number')
            ->addFilter('StripTags')
            ->addValidator('Digits');

                    ...

            }
     }
Run Code Online (Sandbox Code Playgroud)