MySQL — сделать строку и обновить, если она уже существует

У меня есть таблица с 4 столбцами: Date, John, Frank, Anthony

Я хочу сделать форму, которая может заполняться этими 3 людьми каждый день, и хранить эти значения в базе данных. Когда Джон заполняет форму сегодня, должна быть создана новая строка с сегодняшней датой и его значением в базе данных. Когда Фрэнк заполняет форму через 1 час (т.е. в тот же день), его значения также должны быть вставлены в базу данных, но в той же строке, потому что уже есть строка с сегодняшней датой. Но когда Энтони заполняет форму завтра, я должен создать новую строку с датой завтрашнего дня.

Итак, вкратце: программа проверяет, заполнил ли кто-нибудь форму сегодня. Если да: он просто добавляет значение к существующей строке сегодня в столбце лица, заполнившего его. Если нет: он создает новую строку с датой сегодняшнего дня.

Я уже написал этот код, но проблема в том, что он создает новую строку каждый раз, когда кто-то заполняет форму, и должна быть создана только строка, если $ person будет первым, кто заполнил форму в тот день.

$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')";

1

Решение

Сначала убедитесь, что Date Поле является первичным или уникальным ключом.
Тогда вы можете использовать НА ДУБЛИКАТЕ

$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')
ON DUPLICATE KEY UPDATE $name='$values'";

Но вы действительно должны проверить подготовленные заявления на вашем языке (PDO в случае PHP) для предотвращения SQL-инъекций.

2

Другие решения

Вы должны изменить свой стол.

Вместо столбца для каждого человека создайте столбец имени, чтобы у вас было:

Дата | Имя | Ценности

Сделайте дату и личность первичным ключом:

ALTER TABLE 'table' ADD PRIMARY KEY (Date,Name)

Затем вставьте так:

INSERT INTO table (Date,Name,Values) VALUES (CURDATE(),'$name','$values') ON DUPLICATE KEY UPDATE Values='$values'
3

Попробуйте использовать REPLACE INTO вместо INSERT INTO.

1

Я просто перечитал вопрос — ОП хочет перезаписать данные, если пользователь повторно отправляет форму — при первом прочтении я подумал, что они хотят сохранить исходные данные

Альтернативой [если вы хотите сохранить только исходные данные], будет использование insert ignore : посмотрите этот ответ для сравнения между insert ignore а также on duplicate key update: "ВСТАВИТЬ ИГНОР" против "ВСТАВИТЬ … НА ДУБЛИКАТЬ КЛЮЧЕВОЕ ОБНОВЛЕНИЕ"

Хотя вам, вероятно, следует изменить дизайн таблицы на «дата», «человек», «данные», как предложено в другом ответе

1
По вопросам рекламы [email protected]