У меня есть PHP-скрипт, который содержит много элементов <select>
, чтобы обновить расписание. Каждый пользователь (6-значный идентификатор) может выбрать одно из мест (4-значный идентификатор) в день. Вот что это выглядит:
$_REQUEST
[
'2018-01-01'=>1234,
'2018-01-02'=>3456,
'2018-01-03'=>2345,
...
]
//The user ID ('sid') is missing from the request because a user
//can only update their own schedule; Their ID is stored in $_SESSION
Мне бы хотелось, чтобы мой SQL-запрос мог выполнять всю обработку таблиц в одном запросе. Одно из предостережений заключается в том, что в таблице не может быть дубликатов. Чтобы быть ясным, в двух экземплярах я имею в виду, что для одного дня для каждого пользователя должна быть только одна запись. Поэтому я использовал следующий запрос:
PHP + MySQL
$params = array();
$days = 0; //Count the number of days to update
foreach ($_REQUEST as $date => $id) {
array_push($params,
$_SESSION['sid'],
$date,
$id
);
$days ++;
}
$value_string = str_repeat("(?,?,?),", $days - 1). "(?,?,?)";
$sql = "INSERT INTO schedule_s (sid, date, plan) VALUES $value_string
ON DUPLICATE KEY UPDATE date = VALUES(date), sid = VALUES(sid)";
Проблема, с которой я сталкиваюсь, заключается в том, что я все еще получаю дубликаты в своей таблице. Я нахожу это немного сложно придумать решение, так как, безусловно, будут дублирующий МОРС и журналы в каждом столбце.
Вот раскладка таблицы.
sid | date | log
---------------------------
123456 | 2018-01-01 | 1234
123456 | 2018-01-02 | 3456
123456 | 2018-01-03 | 2345
...
567890 | 2018-01-01 | 5678
567890 | 2018-01-02 | 5678
567890 | 2018-01-03 | 2345
...
Любая помощь в получении этого обновления для работы будет принята с благодарностью!
Непосредственное исправление вашей проблемы состоит в том, чтобы добавить уникальный индекс в комбинацию столбцов sid
и date
:
ALTER TABLE schedule_s ADD CONSTRAINT cnstr UNIQUE (sid, date);
Затем, если пользователь пытается отправить дату, у которой уже есть запись, запрос завершится неудачно на уровне базы данных. Затем вы можете справиться с ошибкой в своем PHP-коде.
Но, с точки зрения удобства пользователей, было бы хорошо загрузить страницу и представить пользователю только даты, которые в настоящее время доступны. Здесь может пригодиться таблица календаря, к которой вы можете присоединиться к schedule_s
для создания доступных дат.
INSERT
- просто выполнить обновление в одном запросе. Есть ли лучший способ сделать это?