我试图弄清楚如何在以下情况下使用Codeigniter表单验证库中的is_unique
规则。
我尝试提交编辑用户表单并拥有以下规则:
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique[users.user_name]');
如果表单中的其他值被更改但该值保持不变,该怎么办?表单将会看到此值已经存在,因此如果此值未更改,我将如何保护其不被编辑。
答案 0 :(得分:34)
以您的代码为例,is_unique
验证规则的工作原理是在user_name
数据库表中查找名为users
的字段。如果存在具有相同值的字段,则验证为false。
要确保它仅在用户提交新值时运行,您可以根据从数据库中提取的值来检查已发布的值$this->input->post('user_name')
,以填充表单。如果它们相同,请不要验证is_unique;
if($this->input->post('user_name') != $original_value) {
$is_unique = '|is_unique[users.user_name]'
} else {
$is_unique = ''
}
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean'.$is_unique);
答案 1 :(得分:7)
我认为还有更好的解决方法,仍然使用CodeIgniters'验证库...... 使用edit_unique,你传递一个额外的参数,这是你正在编辑的行的ID ..见下文..我使用它并且对我来说工作得很好..希望它有所帮助
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
答案 2 :(得分:1)
$something = $this->input->post('something');
$this->form->validation->set_rules('something','Something','xss_clean|is_unique['tbl'.users]');
if($this->form_validation->run()== FALSE){
}
答案 3 :(得分:0)
这是一个简单的方法,对我有用,并使用记录良好的代码(感谢https://github.com/ivantcholakov分享它!)。我在https://github.com/bcit-ci/CodeIgniter/issues/3109#issuecomment-46346280
找到了它从__construct()中删除这两行:
$这 - > CI->负载>辅助( '复选框'); $这 - > CI->负载>辅助( '电子邮件');
删除除__construct()和唯一()之外的所有函数。
在控制器的__construct()方法结束时添加以下行:
$这 - >负载>库( 'form_validation');
根据unique()方法的文档,更新验证规则以添加这样的“唯一”规则(例如,如果您已经有必需和修剪规则):
... |需要|独特[tablename.fieldname,表名(PrimaryKey的使用的换更新)。] |修剪...
答案 4 :(得分:0)
在应用程序/库文件名MY_Form_validation.php中扩展Form_validation.php库创建类
<?php
class MY_Form_validation extends CI_Form_validation{
protected $ci;
public function __construct($config = array()){
parent::__construct($config);
$this->ci =& get_instance();
}
public function is_unique_update($str, $field){
$explode=explode('@', $field);
$field_name=$explode['0'];
$field_id_key=$explode['1'];
$field_id_value=$explode['2'];
sscanf($field_name, '%[^.].%[^.]', $table, $field_name);
if(isset($this->ci->db)){
if($this->ci->db->limit(1)->get_where($table, array($field_name => $str,$field_id_key=>$field_id_value))->num_rows() === 0){
$this->ci->form_validation->set_message('is_unique_update', 'The {field} field must contain a unique value.');
return false;
}
return true;
}
}
}
现在在您的控制器中
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|is_unique_update[users.user_name@id@'.$id.']');
“@”我用来爆炸字符串
其中id是用户表的主键
和$ id是id的值。
现在,您可以在任何控制器中使用此is_unique_update验证。
答案 5 :(得分:0)
简单方式
只需将system / libraries / form_validation.php中的is_object设置为is_object
public function is_unique($str, $field)
{
sscanf($field, '%[^.].%[^.]', $table, $field);
return is_object($this->CI->db) //default isset
? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
: FALSE;
}
答案 6 :(得分:0)
这个问题很老,但是也许有些新人遇到了这个问题,这就是解决方案。 我敢打赌,您正在使用模块化扩展(HMVC),并且您已经创建了一个新库MY_Form_validation。您为回调设置了id,因此在类上使用以下代码行即可使用回调:
$this->form_validation->CI =& $this;
好吧,解决此问题的方法是,每当您要使用“ is_unique”时,都必须删除此行代码“ $ this-> form_validation-> CI =&$ this;”。从课堂上。我已经遇到了这个问题,并且已经通过这种方式解决了,现在可以正常使用了。
如果您确实要使用回调“ $ this-> form_validation-> CI =&$ this;”,则仅对不需要使用is_unique的必需“方法” /“函数”进行此操作。 / p>
答案 7 :(得分:0)
在控制器中
在创建和更新功能中添加此表单验证代码
Courses c1 = new Courses();
c1.setCourseName("Java");
c1.setCourseId(1);
c1.setInstructor(i1);
在控制器中添加此回调函数
$this->form_validation->set_rules('order_no', 'Order no', 'required|callback_check_order_no');
在模型中
function check_order_no($order_no) {
if($this->input->post('id'))
$id = $this->input->post('id');
else
$id = '';
$result = $this->Data_model->check_unique_order_no($id, $order_no);
if($result == 0)
$response = true;
else {
$this->form_validation->set_message('check_order_no', 'Order no already exist');
$response = false;
}
return $response;
}
答案 8 :(得分:0)
我正在使用 codeigniter3,当我在更新值时检查用户名时显示错误,is_unique 并非设计用于更新场景 所以使用@Anthony Mutisya 的回答,这里是完整的解决方案
在您的控制器中,在使用数据库验证当前用户的用户名时添加此行
$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean|edit_unique[users.user_name.'.$id.']');
您可以从提交的表单中获取 $id
。
现在,将以下函数添加到 /system/libraries/Form_Validation.php
这个文件。 System
文件夹位于 CodeIgniter3 文件夹的根目录中。
/**
* edit_unique // for check on update value
*
* Check if the input value doesn't already exist
* in the specified database field.
*
* @param string $str
* @param string $field
* @return bool
*/
function edit_unique($value, $params) {
$CI =& get_instance();
$CI->load->database();
$CI->form_validation->set_message('edit_unique', "Sorry, that %s is already being used.");
list($table, $field, $current_id) = explode(".", $params);
$query = $CI->db->select()->from($table)->where($field, $value)->limit(1)->get();
if ($query->row() && $query->row()->id != $current_id)
{
return FALSE;
} else {
return TRUE;
}
}
在我的情况下它工作得很好
答案 9 :(得分:-1)
我们必须为 is_unique
添加表名for Exp。
is_unique[users.email]