在Codeigniter框架中,我可以使用“表单验证类”验证MYSQL数据库中的唯一字段。例如:
$this->form_validation->set_rules('form_field', 'form_label', 'is_unique[table.field]');
完美地工作,但是,我需要从具有2个索引的表中验证字段。例:
UNIQUE INDEX `id_aluno` (`id_aluno`, `ano`),
Codeigniter框架可以原生地完成吗?
答案 0 :(得分:4)
我不认为CI
内置了合并PK
的情况,但我会像这样使用回调_ :但请注意,你必须将第二个PK
作为额外内容发送,并且该规则应该应用于第一个$ PK,请参阅callbacks以获取有关该内容的更多信息
$this->form_validation->set_rules('form_field', 'form_label', 'callback_combpk[$pk2]');
public function combpk($pk1, $pk2)
{
$this->db->where('field1', $pk1);
$this->db->where('field2', $pk2);
$result = $this->db->get('table');
if($result->num_rows() > 0)
{
$this->form_validation->set_message('combpk','something'); // set your message
return false;
}
else{ return true;}
}
答案 1 :(得分:1)
未在CodeIgniter中找到此功能的本机支持说明。 INSERT查询数据库错误号后可以检查。例如:
$last_id = $this->model->set();
if ($last_id === FALSE)
if ($this->db->_error_number() == 1062)
$this->data['message_error'] = 'Not unique.';
else
$this->data['message_error'] = 'Database error.';
这种方法有缺点,但肯定有一个优点 - 不要使用额外的SELECT查询。
P.S。如果有几个不同的复合唯一索引,那么您当然可以使用preg_match(<pattern_with_index_name>, $this->db->_error_message());
。
答案 2 :(得分:1)
$this->form_validation->set_rules(
'form_field',
'form_label',
'trima|is_unique[table1.field1],trim|required|is_unique[table.field2]');
使用
'trima|is_unique[table1.field1],trim|required|is_unique[table.field2]'
单个代码中的
答案 3 :(得分:1)
也许您对我的自定义is_unique函数感兴趣。 在这里。
您可以通过两种方式使用它:
1. is_unique[table_name.field_to_check.id_field_name.id_field_value] //<-- unique 1 field only
2. is_unique[table_name.field_to_check.id_field_name != 'id_field_value' and anotherIdName='theValue'] //<-- custom where
只需将此代码保存在文件中,将其命名为MY_Form_Validation.php,并将其放在libraries目录下。然后你可以把那些is_unique
public function is_unique($str, $field)
{
$result = true;
try {
if ($str) {//validate only if there's a value submitted
$is_query = 0;
$x = substr_count($field, '.'); //count of dots
//ex: is_unique[is_unique[$table_name.$field_name.$field_id!='$id' and 1=1]]
//ex: is_unique[$table_name.$field_name.id!='2' and name!='simson']
if($x == 2) {
list($table, $field, $where) = explode('.', $field);
$is_unique = 0;
if ($where) {
$logos = "select * from $table where $field =? and $where ";
} else {
$logos = "select * from $table where $field =? ";
}
$data = array($str);
$qq = $this->CI->db->query($logos, $data);
$is_query = 1;
$row = $qq->row();
$is_unique = !(bool)$row; //is_unique = (row == empty)
$result = (bool)$is_unique;
}
else {
if ($x >= 3) {
list($table, $field, $id_field, $id_val) = explode('.', $field);
$is_unique = 0;
if ($id_field && $id_val) {
$logos = "select * from $table where $field =? and $id_field != '$id_val' ";
} else {
$logos = "select * from $table where $field =? ";
}
$data = array($str);
$qq = $this->CI->db->query($logos, $data);
$is_query = 1;
$row = $qq->row();
if ($row) {
if ($row->id) {
if ($row->$id_field == $id_val) {
$is_unique = 1; //means editing it self, allow it
} else {
//already exists with different id
}
} else {
//used for left join table
}
} else {
$is_unique = 1; //does not exists
}
$result = (bool)$is_unique;
}
else if ($x == 1) {
list($table, $field) = explode('.', $field);
$query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
$is_query = 1;
$result = $query->num_rows() === 0;
}
}
if (is_log_query() && $is_query) {
$logos = "logos is_unique x==$x: " . $this->CI->db->last_query();
log_to_file($logos);
} else {
$logos = "logos is_unique x==$x: NOT EXECUTED";
log_to_file($logos);
}
}
}catch (Exception $e) {
die($e->getTraceAsString());
}
return $result;
}