codeigniter 多次切换点击调用相同 AJAX ,数据库更新不一致

uajslkp6  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(146)

我的页面上有几个开关,都使用了类psettings,它允许触发一个脚本,该脚本执行 AJAX 调用来更新MySQL数据库表中的标志。如果我点击得慢,这个功能就可以正常工作。我可以以正常速度点击所有按钮,数据库会按预期进行更新,但是取消选中,有时候不会清除DB中的标志。如果我点击得慢,在点击之间暂停一下,它工作正常。我不能阻止用户点击切换的速度有多快,但需要一种方法来确保更新的一致性,可能是延迟或刷新等。
第一个

public function maintain_privacy_settings()
{
    helper(['form','url']);

    if ($this->request->isAJAX())
    {   
        $UserModel = new \App\Models\User_model();

        //Determine update column name
        $element_name = $this->request->getPost('element_name');
        $col_name;

        switch ($element_name)
        {
          case 'flag_display_fullname':
            $col_name = 'show_fullname';
            break;
          case 'flag_display_smaccounts':
            $col_name = 'display_sm_accounts';
            break;
          case 'flag_receive_fy_emails':
            $col_name = 'fy_notification_emails';
            break;
        }

        if($UserModel->set_privacy_flag($this->data['userid'],$col_name,$this->request->getPost('checked')))
        {
            return json_encode(['success'=> 'success', 'csrf' => csrf_hash()]);
        }
        else
        {
            return json_encode(['error' => 'error', 'csrf' => csrf_hash(), 'col_name' => $this->request->getPost('element_name') ]);
        }
    }
}
epggiuax

epggiuax1#

当多个请求被发送到服务器,但它们的响应没有按顺序返回时,就会出现问题。因此,存储在服务器上的响应与存储在UI上的响应不同。
要解决这个问题,你可以使用很多技术,但最简单的是,阻止特定的UI元素,直到从服务器收到响应。为此,你可以 AJAX 调用之前禁用该元素,然后在函数成功或失败时启用它。
您还可以为每个请求分配一个序号,然后应用最高的序号并忽略其余的序号。
您还可以为请求实现一个队列,并按顺序处理它们。

编辑:

另外,你的jquery代码也有问题。你没有得到特定输入的选中状态。请尝试以下操作:

if($(`input[name='${ename}']`).is(":checked"))
{
    var evalue = 'X';
}

相关问题