[英]is_unique in codeigniter for edit function
我有要求,我可以在新的添加功能中進行唯一值的驗證
$this->form_validation->set_rules('email','Email','required|valid_email||is_unique[users.Email]');
它的工作,但在編輯功能,它不工作..我有寫回調函數來檢查唯一的電子郵件。 這是我在編輯功能中編寫的代碼
$this->form_validation->set_rules('email','Email','required|valid_email|callback_check_email');
function check_username($email)
{
$return_value = $this->user_model->check_email($email);
if ($return_value)
{
$this->form_validation->set_message('email_check', 'Sorry, This username is already used by another user please select another one');
return FALSE;
}
else
{
return TRUE;
}
}
和user_model
function check_mail($email)
{
$sql = "SELECT users.Email
FROM users
WHERE
$email = users.Email
";
$result = $this->db->query($sql)->result_array();
return $result;
}
我無法驗證唯一的電子郵件
$original_value = $this->db->query("SELECT EMAIL FROM users WHERE id = ".$id)->row()->EMAIL ;
if($this->input->post('username') != $original_value) {
$is_unique = '|is_unique[users.EMAIL]';
} else {
$is_unique = '';
}
$this->form_validation->set_rules('username', 'User Name', 'required|min_length[3]|max_length[30]|trim|xss_clean'.$is_unique);
簡單的解決方案 ,靈感來自CodeIgniter的is_unique代碼。
警告:僅當數據庫中行的標識符是典型的“id”時才有效。 雖然,這段代碼很容易適合。
將is_unique更改為edit_unique,並連接您正在編輯的行的id,如下所示:
$this->form_validation->set_rules('email','Email','required|valid_email|edit_unique[users.Email.'.$id.']');
然后轉到application / libraries文件夾並使用以下代碼創建MY_Form_validation.php:
<?php
class MY_Form_validation extends CI_Form_validation{
public function edit_unique($str, $field)
{
sscanf($field, '%[^.].%[^.].%[^.]', $table, $field, $id);
return isset($this->CI->db)
? ($this->CI->db->limit(1)->get_where($table, array($field => $str, 'id !=' => $id))->num_rows() === 0)
: FALSE;
}
}
然后編輯此文件:application / system / language / english / form_validation_lang.php
並在文件末尾添加此代碼:
$lang['form_validation_edit_unique']= 'The {field} field must contain a unique value.';
:d
<?php
/* Create MY_Form_validation.php in ci_root/application/libraries */
class MY_Form_validation extends CI_Form_validation {
public function is_unique($str, $field) {
if (substr_count($field, '.') == 3) {
list($table, $field, $id_field, $id_val) = explode('.', $field);
$query = $this->CI->db->limit(1)->where($field, $str)->where($id_field . ' != ', $id_val)->get($table);
} else {
list($table, $field) = explode('.', $field);
$query = $this->CI->db->limit(1)->get_where($table, array($field => $str));
}
return $query->num_rows() === 0;
}
}
?>
<?php
/* implementation */
function update() {
$user_id = $this->input->post("user_id");
$rules = array(array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required|valid_email|is_unique[users.Email.id.' . $user_id . ']'));
$this->form_validation->set_rules($rules);
}
假設系統提供您在應用程序中更新您的用戶名,然后: -
文件>> config / form_validation.php
$config = array(
"add_user" => array(
array('field' => 'name','label' => 'name','rules' =>'required','errors' => array(
'required' => '%s is required.'
)),
array('field' => 'username','label' => 'username','rules' =>'required|is_unique[tbl_users.username]','errors' => array(
'required' => '%s is required.',
'is_unique' => 'Sorry, that %s value is already being used.',
)),
array('field' => 'password','label' => 'password','rules' =>'required','errors' => array(
'required' => '%s is required.'
)),
),
"update_user" => array(
array('field' => 'name','label' => 'name','rules' =>'required','errors' => array(
'required' => '%s is required.'
)),
array('field' => 'username','label' => 'username','rules' =>'required|callback_unique_username','errors' => array(
'required' => '%s is required.'
'unique_username' => 'Sorry, that %s value is already being used.'
)),
array('field' => 'password','label' => 'password','rules' =>'required','errors' => array(
'required' => '%s is required.'
)),
)
)
文件>> controller / Users.php
public function unique_username($username){
/*
* At the time of update you will be needing the user_id
* of particular user whose profile you want to update
* we have placed user_id as hidden field in user update view
* form like
* <input type="hidden" value="{user_id here}" name="user_id">
*/
$this->db->where_not_in('user_id',$this->input->post('user_id'));
$this->db->where('username',$username);
if($this->db->count_all_results('tbl_users') > 0){
return false;
}else{
return true;
}
}
$original_value = $this->db->query("select role_name from user_roles where iduser_roles = ".$iduser_roles)->row()->role_name ;
if($this->input->post('role_name') != $original_value) {
$is_unique = '|is_unique[user_roles.role_name]';
} else {
$is_unique = '';
}
$this->form_validation->set_rules('role_name', 'Role Name', 'trim|required|xss_clean'.$is_unique);
改進僅支持“id”作為列名的“DrPollit0”解決方案。 此解決方案允許您清除列名稱,如columnID
在application \\ libraries \\ MY_Form_validation.php中創建自定義驗證類
class MY_Form_validation extends CI_Form_validation
{
public function __construct($rules = array())
{
$this->CI =& get_instance();
parent::__construct($rules);
}
public function edit_unique($str, $field)
{
sscanf($field, '%[^.].%[^.].%[^.].%[^.]', $table, $field, $columnIdName, $id);
return isset($this->CI->db)
? ($this->CI->db->limit(1)->get_where($table, array($field => $str, $columnIdName .'!=' => $id))->num_rows() === 0)
: FALSE;
}
}
將其添加到system \\ language \\ english \\ form_validation_lang.php
$lang['form_validation_edit_unique']= 'The supplied value is already taken.';
在控制器中使用
$id = $this->uri->segment(3);
'rules' => 'trim|required|max_length[50]|edit_unique[mytable.mycolumn.columnID.'.$id.']'
像這樣更靈活:
public function edit_unique($str, $field)
{
sscanf($field, '%[^.].%[^.].%[^.]', $table, $field, $value);
return isset($this->CI->db)
? ($this->CI->db->limit(1)->get_where($table, array(''.$field.' !=' => $value))->num_rows() === 0)
: FALSE;
}
刪除雙|| 並放置單個| 就在is_unique之前,你的函數名check_username應該是你在callback_之后給出的名字,這意味着你的情況應該是check_email 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.