Php Zend_Validate_Db_NoRecordExists-查询已中断,不确定原因

Php Zend_Validate_Db_NoRecordExists-查询已中断,不确定原因,php,zend-framework,zend-form,zend-db,Php,Zend Framework,Zend Form,Zend Db,我写了以下内容: $email->addValidator('emailAddress', false) ->setRequired(true) ... ->addValidator(new Zend_Validate_Db_NoRecordExists( array( 'table' => 'site_users', 'fiel

我写了以下内容:

  $email->addValidator('emailAddress', false)
        ->setRequired(true)
        ...
        ->addValidator(new Zend_Validate_Db_NoRecordExists(
            array(
                'table'   => 'site_users',
                'field'   => 'email',
            )
        ));
这不起作用,相反,我收到以下错误消息:

消息:SQLSTATE[42000]:语法错误或访问冲突:1064 您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解要在第1行的“FROM
site\u users
WHERE(``='testdata4')LIMIT 1'附近使用的正确语法


有什么想法吗?

刚刚看了一下代码,在
Zend\u Validate\u Db\u Abstract
的构造函数中找到了它(Zend\u Validate\u Db\u NoRecordExists的父级):


因此,它希望选项的顺序正确,而忽略您指定的键!奇怪的但看起来您的代码应该仍然有效-您运行的是什么版本的ZF?

不确定它会有多大区别,但在“email”之后有一个不必要的逗号。我猜site_users中的字段肯定是“email”?看起来where子句显然没有正确获取字段名。@Chris:你可以在PHP中这样做!在这样的数组末尾可以有一个逗号。如果在向数组中添加项后经常忘记使用逗号,那么养成一个好习惯。但是,修复了该问题!奇怪的一个,注意。我通过交换字段来修复它。也就是说,我把“email”放在“table”中,把“site\u users”放在“field”下。这是错误的做法:email肯定是字段名,表肯定是“site\u users”,所以它一定是某种bug。奇怪的一个!正如我所说的——我不认为这会有什么不同——但知道它是好的很有用。另外,刚刚查看了构造器的源代码-下面的答案中有完整的详细信息(不适合在评论中)。仅供参考:
site\u users
位于正确的位置,并且缺少表名!因此,字段/电子邮件对肯定有问题。switcharoo可能会工作,但可能是因为其他一些奇怪的原因。我们在这里使用的是1.9.4,令人烦恼的是,它无法控制。感谢您查看代码-这很奇怪。如果有一天晚上我有空的话,我可能会坐下来做些贡献:)+1有趣的-这是一个非常糟糕的错误,如果它还没有被修复,它需要被修复!请向问题跟踪器提交一个错误。@Muu@Chris FYI
func\u get\u args
如果您将参数作为单个字符串而不是数组传递,则可以使用。实际上有一个if子句first
if(func\u num\u args()>1)
,在本例中为false!啊,是的-我怎么会错过这个。。。当我看到它时,它似乎是一个如此明显的问题。。。看,构造函数是非常不同的。它似乎不接受
字段
作为数组的一部分。看起来你应该使用
new Zend\u Validate\u Db\u NoRecordExists('site\u users','email')
。我在两个单独的教程中发现了类似的代码(与我所写的代码相似),不知道它们是从哪里得到的。谢谢
        $options       = func_get_args();
        $temp['table'] = array_shift($options);
        $temp['field'] = array_shift($options);
        if (!empty($options)) {
            $temp['exclude'] = array_shift($options);
        }

        if (!empty($options)) {
            $temp['adapter'] = array_shift($options);
        }

        $options = $temp;