CodeIgniter - 检查数据库中是不是已存在值
Posted
技术标签:
【中文标题】CodeIgniter - 检查数据库中是不是已存在值【英文标题】:CodeIgniter - Checking to see if a value already exists in the databaseCodeIgniter - 检查数据库中是否已存在值 【发布时间】:2011-05-16 20:45:51 【问题描述】:我正在为我的一个项目运行 CodeIgniter ...我对此相当陌生,我对我的表单进行了标准表单验证检查,除了我不确定如何检查数据库中是否已经存在该值。
到目前为止,这就是我的表单验证规则
$this->form_validation->set_rules('rolename', 'Role Name', 'trim|required|xss_clean');
$this->form_validation->set_rules('rolekey', 'Role Key', 'trim|required|xss_clean');
'rolekey' 是我需要检查数据库中的 'rolekey' 列以查看它是否存在,如果存在我需要回击错误。
任何帮助都会很重要。
干杯,
【问题讨论】:
【参考方案1】:对于值是否在数据库中没有内置的表单验证检查,但您可以创建自己的验证检查。
在你的控制器中,创建一个类似这样的方法:
function rolekey_exists($key)
$this->roles_model->role_exists($key);
在处理角色的模型中,添加如下内容:
function role_exists($key)
$this->db->where('rolekey',$key);
$query = $this->db->get('roles');
if ($query->num_rows() > 0)
return true;
else
return false;
然后你可以像这样编写一个表单验证检查:
$this->form_validation->set_rules('username', 'Username', 'callback_rolekey_exists');
查看此页面了解更多信息:
https://www.codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods
【讨论】:
感谢您的评论...太好了...您能给我一个我应该用于该功能的代码示例吗? ...我仍然试图掌握在函数中编写所有内容的窍门。谢谢 太完美了......非常感谢......再问一个问题,它如何返回错误消息'rolekey已存在于数据库中' 在你的 role_exists 函数中,添加这个:$this->validation->set_message('role_exists', 'The %s already exists');
- 把它放在返回 true 之前。我也认为您的回报可能会感到困惑-(可能无关紧要,但请查看 CI 文档)。如果验证失败返回 FALSE,如果验证成功返回 TRUE。我相信如果有重复的角色,上面的代码将返回 true。 (意味着当值不存在时它将失败。更多 codeigniter.com/user_guide/libraries/validation.html
谢谢你......我在我的模型中遇到关于 set_message 的错误调用非对象上的成员函数 set_message()
这很好,但我认为理想情况下你会将 if 语句移至控制器,并且模型中没有任何逻辑。【参考方案2】:
如果您想让您的验证功能在多个控制器中可用,您应该在 MY_Form_validation 库中包含该规则。
我在 MY_Form_validation 中这样做:
function exist($str, $value)
list($table, $column) = explode('.', $value, 2);
$query = $this->CI->db->query("SELECT COUNT(*) AS count FROM $table WHERE $column = $str'");
$row = $query->row();
return ($row->count > 0) ? FALSE : TRUE;
然后在你的模型(或控制器)中设置你的规则:
$this->form_validation->set_rules('username','username','exist[users.user_name]');
规则调用exist函数。
exist 函数在点处展开字符串 users.user_name,然后查询数据库以查看是否返回记录。如果是,则返回 false,否则返回 true。如果返回错误,该规则将失败。
【讨论】:
在你的查询中你错过了一个'【参考方案3】:您只需编辑您的验证规则
$this->form_validation->set_rules('rolename', 'Role Name', 'trim|required|xss_clean|is_unique[table_name.rolename]');
【讨论】:
我同意,这将是现在最简单的方法。然而,在最初提出这个问题时,is_unique 验证规则还不存在(它是在 2011 年 11 月 14 日发布的 CodeIgniter 版本 2.1 中添加的)。【参考方案4】:你总是可以添加
$this->form_validation->set_rules('username','Username','is_unique[users.username]');
其中 user.username 是 table.column
【讨论】:
【参考方案5】:这对我有用,可能对某人有用
在你的控制器中,创建一个类似这样的方法:
function rolekey_exists('table','field','value')
$this->roles_model->role_exists($key);
在处理角色的模型中,添加如下内容:
function role_exists($table,$field,$value)
$this->db->where($field,$value);
$query = $this->db->get($table);
if (!empty($query->result_array()))
return 1;
else
return 0;
【讨论】:
【参考方案6】:将 is_unique 规则添加到您的表单验证中,如下所示
$this->form_validation->set_rules('rolename', 'Role Name', 'trim|required|xss_clean|is_unique[your_database_table_name.rolename]');
$this->form_validation->set_rules('rolekey', 'Role Key', 'trim|required|xss_clean|is_unique[your_database_table_name.rolekey]');
【讨论】:
【参考方案7】:如果您使用的是新的 Codeigniter4,您实际上可以实现这一点,而无需在控制器中添加任何方法:使用 is_not_unique 规则,您可以检查是否在数据库中找到了一个值,如果没有则返回错误。 ..基本上与is_unique相反!
【讨论】:
【参考方案8】:是的,如果你想检查一个值是否已经存在于数据库中,在验证端添加 is_unique 是正确的。因此,您无需在控制器中创建函数即可。
$this->form_validation->set_rules('rolename', 'Role Name', 'trim|required|xss_clean|is_unique[table_name.table_field]');
$this->form_validation->set_rules('rolekey', 'Role Key', 'trim|required|xss_clean|is_unique[table_name.table_field]');
然后,您将在输入区域看到一条错误消息。例如:用户名字段必须包含唯一值。
我已经在 Codeigniter 3.0.0 中测试过了。
【讨论】:
【参考方案9】:Codeigniter4 的小更新
在 CI4 中,您可以使用验证规则“is_not_unique[table.field]”,这样就可以了
$validation->setRule('email', 'Email', 'trim|required|valid_email|is_not_unique[users.email]');
【讨论】:
以上是关于CodeIgniter - 检查数据库中是不是已存在值的主要内容,如果未能解决你的问题,请参考以下文章
检查 codeigniter 查询错误,而不是向用户显示它们