Дублируется запись при добавлении ее в БД
Добавляю запись в БД посредством XMLHttpRequest. Иногда записи дублируются (происходит это не часто), т.е. два раза записываются данные в таблицу при одном нажатии на кнопку «Добавить».
Подскажите, пожалуйста, как можно этого избежать или исправить?
Ниже пример моего кода:
разметка и JS
Содержимое файла add-questions.php
Подскажите, пожалуйста, как можно этого избежать или исправить?
Ниже пример моего кода:
<div class="card card-info add-card">
<div class="d-flex card-header justify-content-end align-items-center">
<button id="btnSubmit" type="button" class="action-btn">Добавить</button>
</div>
<div class="card-body">
<div class="div-item-info">
<div class="item-title">Параметры</div>
<input id="param" class="form-control form-control-course" type="number" style="width: 170px;">
</div>
<div class="div-item-info">
<div class="item-title">Текст</div>
<textarea id="paramText" class="form-control form-control-course" rows="3" style="resize: none;"></textarea>
</div>
</div>
</div>
<div id="insertContent"></div>
const btnSubmit = document.querySelector('#btnSubmit');
let getParam = document.querySelector('#param');
let getParamText = document.querySelector('#paramText');
let insertContent = document.querySelector('#insertContent');
btnSubmit.addEventListener('click', function(e) {
e.preventDefault();
btnSubmit.setAttribute('disabled', '');
function addQuestion() {
const formDataQuestion = 'param=' + getParam + '¶mText=' + getParamText;
const xhr = new XMLHttpRequest();
xhr.open('POST', '/assets/components/add-questions.php');
xhr.responseType = 'json';
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = () => {
if (xhr.status !== 200) {
return;
};
const response = xhr.response;
let message = '';
if (response > 0) {
message = 'Успешно';
btnSubmit.removeAttribute('disabled');
} else {
message = 'Что-то пошло не так :(';
btnSubmit.removeAttribute('disabled');
};
insertContent.innerHTML = '<div class="alert alert-light small mt-5" role="alert">' + message + '</span></div>';
};
xhr.send(formDataQuestion);
};
addQuestion();
});
Содержимое файла add-questions.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
define('MODX_API_MODE', true);
require_once $_SERVER['DOCUMENT_ROOT'] . '/index.php';
$modx->getService('error','error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;
$param = (int) $_POST['param'];
$paramText = $modx->sanitizeString($_POST['paramText']);
$countidsection = $modx->getCount('DeQuestions', array('tabl_param' => $param));
$output = '';
if ($countidsection == 0) {
$dequestions = $modx->newObject('DeQuestions');
$dequestions->set('tabl_param', $param);
$dequestions->set('table_text', $paramText);
if ($dequestions->save() === false) {
$output = 0;
};
$output = 1;
};
@session_write_close();
exit(json_encode($output));
};
Комментарии: 6
Наверное надо добавить проверку на наличие аналогичного объекта перед созданием.
Проверка на наличие аналогичного объекта организована с помощью метода getCount:
$countidsection = $modx->getCount('DeQuestions', array('tabl_param' => $param));
Я обычно делаю
Нейросеть советует транзакции или
if(!$obj = $modx->getObject($class,$search)){
$obj = $modx->newObject( ...
}
И дублирование у меня нет. Но может потому, что у меня $search по индексированным полям ^-^.Нейросеть советует транзакции или
Также, желательно добавить уникальный индекс в базе данных на поле tabl_param, что обеспечит дополнительную защиту от дублирования на уровне СУБД.
Я делаю так:
Попробую предложенный вами вариант.
Или вообще думаю сделать так:
$countidsection = $modx->getCount('DeQuestions', array('tabl_param' => $param));
if ($countidsection == 0) {
$dequestions = $modx->newObject('DeQuestions');
...
...
...
};
И бывают дубли (Попробую предложенный вами вариант.
Или вообще думаю сделать так:
if ($countidsection == 0) {
// если объекта нет - создать
...
...
...
} else {
// если есть совпадение - перезаписать значения
...
...
...
};
Для перезаписи делаю так
if(!$obj = $modx->getObject($class,$search)){
$obj = $modx->newObject($class);
}
if($obj){
$obj->fromArray([
'key1'=>'param1',
'key2'=>'param2',
]);
$obj->save();
}
Спасибо. Будем пробовать.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.