[英]CodeIgniter's is_unique always saying value already exists
我正在使用 CodeIgniter 的表單驗證,我花了很多時間試圖解決這個問題,但沒有運氣。 我有這個領域:
<input type="text" name="user" id="user" length="20" placeholder="Username">
我用它來驗證:
$this->form_validation->set_rules('user', 'Username', 'trim|required|min_length[3]|max_length[20]|alpha_dash|is_unique[users.user]');
我的數據庫有一個表users
並且user
是其中的一個字段,所以我不知道我做錯了什么,或者問題是什么。 該表是空的(但我也試過它有記錄)並且在 phpmyadmin 中選擇了“ unique
”圖標。 我知道 db 連接工作正常,因為如果我刪除該規則並輸入其他有效數據並提交表單,那么用戶將被添加到數據庫中。
除非 is_unique 使用另一個我沒有配置的數據庫配置文件? 我真的不知道。 這有點令人沮喪,我想我也可以放棄使用框架......
你的幫助會很棒! 謝謝。
這可能/可能無濟於事:您似乎在運行表單驗證后加載數據庫。 還有一個拼寫錯誤uses.user
。
在 Transact-SQL 中,“USER”一詞是一個特殊詞。 嘗試使用像這樣的反引號包圍 uses.user:
`users.user`
...看看是否有幫助。
嘗試這個 :-
$this->form_validation->set_rules('user', 'Username', 'trim|required|min_length[3]|max_length[20]|alpha_dash|unique[users.user]');
它需要加載數據庫。
$this->load->database();
我知道您的問題很老,但我最近在自定義表單驗證中遇到了類似的問題,經過一些認真的調試后,我找到了原因和解決方法。
顯然,CI 核心有一個小錯誤:在調用is_unique
表單驗證方法時,數據庫庫沒有實例化(至少在最新版本的 CI 中),從而阻止實際執行檢查並始終返回false
作為驗證結果。
這是表單驗證庫( system/libraries/Form_validation.php
)的解決方法
public function is_unique($str, $field)
{
sscanf($field, '%[^.].%[^.]', $table, $field);
// add the following line
$this->CI->load->database();
return isset($this->CI->db)
? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
: FALSE;
}
通過在注釋后添加該行,您將確保為is_unique
方法正確實例化了數據庫庫,並且您將使其工作。 如果沒有該行, isset($this->CI->db)
檢查將始終返回 false
您也可以將該行放在庫的構造函數中,但隨后您將在所有不必要的表單驗證規則中實例化數據庫庫(只有is_unique
需要它)。
以您的代碼為例, is_unique
驗證規則通過在用戶數據庫表中查找名為user_name
的字段來工作。 如果存在具有相同值的字段,則驗證為 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.