亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Codeigniter 自定義表單驗證規則返回誤報

Codeigniter 自定義表單驗證規則返回誤報

PHP
慕碼人2483693 2022-07-16 18:38:49
我有幾個基于 Codeigniter 的項目,我在這些項目上做了完全相同的事情,但由于某種原因,在最近的項目中我無法讓它工作。我直接在 CI 核心上進行了一些自定義(是的,我知道我應該擴展核心而不是修改它,但它到目前為止一直有效,并且它可以更容易地啟動一個所有修改都已經到位的新項目)。其中一個修改是調用Form_validation庫(需要,因為我從事的許多項目都需要使用多個單獨的模式)system/libraries/Form_validationis_unique_scis_uniqueschema.table.fieldtable.field這是自定義方法public function is_unique_sc($str, $field){    sscanf($field, '%[^.].%[^.].%[^.]', $schema, $table, $field);    return isset($this->CI->db)            ? ($this->CI->db->limit(1)->get_where($schema.'.'.$table, array($field => $str))->num_rows() === 0)            : FALSE;}為了比較,這是原始is_unique方法:public function is_unique($str, $field){    sscanf($field, '%[^.].%[^.]', $table, $field);    return isset($this->CI->db)        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)        : FALSE;}form_validation_lang如果驗證返回,這將伴隨對語言文件的必要修改false:$lang['form_validation_is_unique_sc']       = 'The {field} field must contain a unique value.';就像我說的,我在許多迄今為止沒有問題的項目上使用它。但是,在我最近的項目中,由于以下規則,新用戶創建失?。?this->form_validation->set_rules('new_email', 'Mail', 'required|trim|htmlspecialchars|strtolower|valid_email|is_unique_sc[accv_users.controllers.controller_email]');即使用戶輸入的電子郵件實際上是唯一的,該is_unique_sc規則也會始終返回(并因此顯示其驗證錯誤消息)。false刪除is_unique_sc規則允許語句的其余部分正確驗證,從而消除整個set_rules語句具有不正確字段名稱的可能性。我有雙重和三重檢查架構名稱是accv_users,表名稱是controllers,字段名稱是controller_email。查詢生成器按方法要求啟用,并且數據庫連接已正確配置且可用。檢查sscanf()函數的輸出是否正確地將模式名稱分配給$schema,表名稱分配給 ,$table字段名稱分配給$field為了完整起見,這是表單視圖中的字段:<div class="col-12 col-lg-3">   <input class="form-control" type="email" id="new_email" name="new_email" placeholder="Mail" required></div>預期的結果當然是,當使用表中不存在的電子郵件提交表單時,驗證通過。只有當電子郵件已經在桌面上時,驗證才會失敗。我在 SO 中搜索了很多類似的案例,但到目前為止沒有任何解決方案有幫助。如果有人可以幫助我查明問題,我將非常感激。
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

經過幾個月的遺忘(我通過其他方式解決了這個失敗的驗證),我再次嘗試并破解了它!


似乎在最新版本的 CI3 中,有一個錯誤會阻止is_unique表單驗證規則正確運行。


我做了一些深入的挖掘,最終發現了這個功能:


public function is_unique($str, $field)

{

    sscanf($field, '%[^.].%[^.]', $table, $field);

    return isset($this->CI->db)

        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)

        : FALSE;

}

總是會返回false(因此,使表單驗證失?。?,因為isset($this->CI->db)總是返回一個 boolean FALSE,無論所有與數據庫相關的東西都被自動加載并且查詢生成器處于活動狀態。


修復很簡單。函數本身只有一行代碼:


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;

}

添加該單行后,表單驗證再次開始正常工作。如果$this->CI->load->database()失敗,它仍然會失敗,考慮到is_unique規則(以及我自己的自定義規則)取決于能夠運行查詢,這是可以預料的。但只要數據庫連接可用,規則就有效!


查看完整回答
反對 回復 2022-07-16
  • 1 回答
  • 0 關注
  • 178 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號