【问题标题】:is_unique in codeigniter for edit function用于编辑功能的 codeigniter 中的 is_unique
【发布时间】:2014-12-23 13:21:06
【问题描述】:

我有要求,我可以在新的添加功能中验证唯一值,例如

$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;
        }
    }

和用户模型

function check_mail($email)
    { 
        $sql = "SELECT users.Email
                FROM users
                WHERE 
                $email = users.Email
                ";

        $result = $this->db->query($sql)->result_array();
        return $result;

    }

我无法验证唯一的电子邮件

【问题讨论】:

  • user_model 中的函数名称与控制器中调用的函数名称不同。如果这不是错字,那么我认为这就是问题所在。否则,我认为 Arun 的答案会起作用,但在控制器 (IMO) 中进行数据库操作并不是很干净
  • 使用回调函数,更新规则

标签: php sql codeigniter


【解决方案1】:

在您的控制器中尝试此代码(编辑视图)

    $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);

【讨论】:

  • 尝试更改您的帖子值和表格字段
  • 这是一个解决方案,但如果 is_unique 将在许多情况下使用,则不是一个好主意
  • 我投了反对票,因为解决方案只涵盖了真正的问题。这意味着在编辑字段时,您可以使用任何其他现有电子邮件,只要在创建时使用了唯一的电子邮件。
【解决方案2】:

简单的解决方案,灵感来自 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

【讨论】:

    【解决方案3】:

    假设系统让您在应用程序中更新您的用户名,那么:-

    文件 >> 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.' 
            )),
        )
    )
    

    文件 >> 控制器/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;
            }
        }
    

    【讨论】:

      【解决方案4】:

      改进仅支持“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.']'
      

      【讨论】:

        【解决方案5】:
        <?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);
        }
        

        【讨论】:

          【解决方案6】:
           $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);
          

          【讨论】:

          • 好一个。但是自定义消息呢?
          【解决方案7】:

          这样更灵活:

          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;
              }
          

          【讨论】:

            【解决方案8】:

            删除双 || 并将单 | 放在 is_unique 和您的函数名称之前 check_username 应该是您在 callback_ 之后给出的名称,这意味着在您的情况下它应该是 check_email

            【讨论】:

            猜你喜欢
            • 2012-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-10
            • 2016-10-06
            • 1970-01-01
            相关资源
            最近更新 更多