簡體   English   中英

jquery校驗庫和codeigniter 4 當csrf設置為auto時如何檢查現有數據?

[英]How to check existing data with jquery validation library with codeigniter 4 when csrf is set to auto?

我有一個表單,我正在嘗試使用 jquery 驗證插件和 codeigniter 4 進行驗證,我啟用了 csrf 設置為為每個請求自動生成。 我能夠在第一次請求時獲得驗證狀態,但是當我嘗試另一個請求時,我得到錯誤 403,當我將第二個參數設置為 json_encode() 時,我得到錯誤 500。我希望能夠在 ajax 調用的每個請求后更新 csrf .

//我的路由器

  $routes->post('check-category', 'Admin\Category::check_category');

//我的controller

//check if category name exist
    public function check_category()
    {
        $name = $this->request->getPost('name');
        $query = $this->db->table('categories')
                          ->where(['cat_name' => $name])
                          ->get()
                          ->getResult();
        
        $status = true;
        if(count($query) > 1){
            $status = false;
        }else{
            $status = true;
        }
        $data['csrf'] = csrf_hash();
        echo json_encode($status, $data);
    }

// javascript

    $('#create_category').validate({
        onkeyup: false,
        rules: {
            name: {
                remote: {
                    url: 'check-category',
                    type: "post",
                    data:{
                        csrf_hash_name: function(){
                           return $('input[name="csrf_hash_name"]').val();
                        }
                    },
                    complete: function(data){
                       $('input[name="csrf_hash_name"]').val(data.csrf);
                    }
                }
            }
        },
        messages: {
            name: {remote: "This category exists."}
        },
        submitHandler: function(form) { return false; }
    });

提前致謝。

php function json_encode()的結構如下所示:

json_encode ( mixed $value , int $flags = 0 , int $depth = 512 ) : string|false

並返回:

包含所提供值的 JSON 表示形式的字符串。

在您的 controller function check_category()中,您正在發送$status ,而$data設置了無效標志:

echo json_encode($status, $data);  // wrong

改變$status = true; 進入$data['status'] = true ;

並回顯狀態和 csrf hash

echo json_encode($data);  // correct

經過如此多的努力,我終於找到了解決問題的方法。 現在我可以使用 dataFilter object 更新 csrf 令牌,並在 ajax 調用期間擺脫錯誤 403。 這是我對我的 controller 所做的,即使我通過從數據庫直接獲取數據到 controller 來破壞 Mvc 原則。我知道這不是我所做的最好的方法,如果有任何建議,請糾正我,我將不勝感激。 謝謝!

//我的controller方法

    public function check_category()
    {
        $name = $this->request->getPost('name');
        $query = $this->db->table('categories')->where(['cat_name' => $name])->countAllResults();
        
        $valid = true;
        if($query > 0){
            $valid = false;
        }else{
            $valid = true;
        }
        $csrf = csrf_hash();
        return $this->response->setJSON(['valid'=>$valid, 'csrf'=>$csrf]);
    }

// 我的 javascript

    $('#create_category').validate({
          onkeyup: false,
          rules: {
              name: {
                  required: true,
                  remote: {
                      url: 'check-category',
                      type: 'post',
                      dataType:'json',
                      dataFilter: function(data){
                          let obj = eval('('+data+')');
                          $('input[name="csrf_hash_name"]').val(obj.csrf);
                          return obj.valid;
                      },
                      data:{ csrf_hash_name: function(){ return $('input[name="csrf_hash_name"]').val(); } }
                  }
              }
          },
          messages: {
              name: {
                  required: "Enter a Category.",
                  remote: "{0} This category exists."
              }
          },
          submitHandler: function(form) {
              return false;
        }
      });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM