我想在where子句中添加多个值的检查。 Db_RecordExists只检查一个字段。我已经读过你可以扩展zend验证抽象类,你可以拥有自己的验证器。请问我可以举一个小例子。
谢谢...
答案 0 :(得分:4)
你准备做什么?对我来说,你甚至不需要自定义验证器。
如果您仔细阅读Zend_Validate_Db_Abstract
的源代码,您会注意到构造函数上方的phpDoc:
提供与Zend_Validate_Db验证器一起使用的基本配置 设置$ exclude允许从匹配中排除单个记录。 Exclude可以是包含where子句的String,也可以是包含
field
和value
键的数组 定义添加到sql的where子句。 可以选择提供数据库适配器以避免使用已注册的默认适配器。支持以下选项键:
- 'table'=>要验证的数据库表
- 'schema'=>架构键
- 'field'=>用于检查匹配的字段
- 'exclude'=>要从查询中排除的可选where子句或字段/值对
- 'adapter'=>要使用的可选数据库适配器
醇>
这意味着如果要检查记录是否存在使用多个值,只需在将where子句传递给验证器而不是对字段/值:< / p>
$where = 'user_id != 110 AND email != "email@example.com"';
$where = array('users', 'email', $where);
$element->addValidator('db_NoRecordExists', true, $where)
这将基本检查用户表中是否存在记录,并排除用户ID!= 110 或 email@example.com 的行 EM>。当然,我建议您使用quoteIdentifier()
,例如{{1}},以生成完全转义的查询表达式。
您可以根据需要添加任意数量的字段。
您可以找到Zend_Db methods。
答案 1 :(得分:1)
您通常要做的就是覆盖isValid()方法来制作自定义验证器,这是自定义验证器的示例:
<?php
class My_Validator_Usphone extends Zend_Validate_Abstract {
const PHONE = 'phone';
protected $_messageTemplates = array(
self::PHONE => "'%value%' is not a valid U.S. phone number.
Phone number must be entered in (xxx)xxx-xxxx or xxx-xxx-xxxx format."
);
public function isValid($value) {
$this->_setValue($value);
$isValid = TRUE;
$pattern = ('/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/');
if (!preg_match($pattern, $value)) {
$this->_error(self::PHONE);
$isValid = FALSE;
}
return $isValid;
}
}
Db_RecordExists非常简单但扩展Zend_Validate_Db_Abstract
并且应该很容易修改以验证两个字段,但您可能必须覆盖isValid()
和getSelect()
或{{1}接受多个值。
_query()