Проблема в дублировании после многократного нажатия кнопки «Отправить»

0

Моя основная проблема заключается в том коде, в котором, когда я много раз нажимаю на кнопки отправки, он многократно вставляет дубликаты в базу данных, в которой мне нужно избегать этого. Пожалуйста, помогите мне решить эту проблему. Это две таблицы, в которые я пытаюсь вставить. mat_ans_options_choose и mat_answer.

$val                 = $this->input->post(null, true);
$val['id']           = $this->input->post('id');
$val['sub_type']     = $this->input->post('sub_type');
$val['timeout']      = $this->input->post('timeout');
$val['level']        = $this->input->post('level');
$val['mat_category'] = $this->input->post('mat_category');
$option              = $val['option']              = $this->input->post('option');
$type                = $this->input->post('type');
$marks               = [];
$uid                 = $this->session->userdata('id');
if (isset($val['id']) && isset($option)) {
    $query  = $this->db->query("SELECT * FROM mat_ans_options WHERE deleted=0 AND active=1 AND question=" . $val['id']);
    $result = $query->result_array();
    if ($query->num_rows() > 0) {
        $count1 = 1;
        foreach ($result as $res) {
            if ($res['marks'] == 1) {
                break;
            } else {
                $count1++;
            }
        }
    }
    // MAT answers options choose
    $query1  = $this->db->query("SELECT * FROM mat_ans_options_choose WHERE deleted=0 AND active=1 AND uid=$uid AND q=" . $val['id']);
    $result1 = $query1->result_array();
    if ($query1->num_rows() > 0) {} else {
        $data1 = [
            'uid'          => $uid,
            'q'            => $val['id'],
            'option_chose' => $option,
            'createdon'    => $this->general_model->server_time(),
        ];
        $this->db->insert('mat_ans_options_choose', $data1);
    }
    if ($count1 == $option) {
        $marks = 1;
    } else {
        $marks = 0;
    }
    //   if($marks==1 || $marks==0)
    //  {
    // MAT answers
    $query2  = $this->db->query("SELECT * FROM mat_answers WHERE deleted=0 AND active=1 AND uid=$uid AND q=" . $val['id'] . " AND type=" . $type . " AND sub_type=" . $val['sub_type'] . " AND level=" . $val['level']);
    $result2 = $query2->result_array();
    if ($query2->num_rows() > 0) {} else {
        $data = [
            'uid'           => $uid,
            'q'             => $val['id'],
            'type'          => $type,
            'level'         => $val['level'],
            'sub_type'      => $val['sub_type'],
            'mat_category'  => $val['mat_category'],
            'marks'         => $marks,
            'timeoutstatus' => $val['timeout'],
            'createdon'     => $this->general_model->server_time(),
        ];
        $this->db->insert('mat_answers', $data);
    }
    //    }
    return 1;
} else {
    return 0;
}
  • 0
    Вы отправляете форму с Ajax?
Теги:
codeigniter

3 ответа

0

Создайте UNIQUE индекс в базе данных для uid и q. База данных не будет вставлять один и тот же идентификатор вопроса из одного и того же идентификатора пользователя несколько раз.

0

Используйте JS, в котором вы отключаете кнопку после первого нажатия - она будет работать независимо от того, используете вы AJAX или нет.

0

Вы можете использовать JS/jQuery, чтобы ограничить количество запросов, сделанных на стороне клиента. Например, отключив кнопку отправки:

$("#my-button").prop("disabled", true);

Но если данные чувствительны к дубликатам (заказам, регистрации пользователей и т.д.), Вы должны ограничить количество запросов на стороне сервера PHP. Этого можно добиться, добавив в таблицы уникальный индекс либо по идентификатору пользователя, либо по уникальному токену, который передается с помощью HTML-формы.

  • 0
    Код, который я отправил, это модель от codeigniter

Ещё вопросы

Сообщество Overcoder
Наверх
Меню