У меня есть таблица с 4 столбцами: Date, John, Frank, Anthony
Я хочу сделать форму, которая может заполняться этими 3 людьми каждый день, и хранить эти значения в базе данных. Когда Джон заполняет форму сегодня, должна быть создана новая строка с сегодняшней датой и его значением в базе данных. Когда Фрэнк заполняет форму через 1 час (т.е. в тот же день), его значения также должны быть вставлены в базу данных, но в той же строке, потому что уже есть строка с сегодняшней датой. Но когда Энтони заполняет форму завтра, я должен создать новую строку с датой завтрашнего дня.
Итак, вкратце: программа проверяет, заполнил ли кто-нибудь форму сегодня. Если да: он просто добавляет значение к существующей строке сегодня в столбце лица, заполнившего его. Если нет: он создает новую строку с датой сегодняшнего дня.
Я уже написал этот код, но проблема в том, что он создает новую строку каждый раз, когда кто-то заполняет форму, и должна быть создана только строка, если $ person будет первым, кто заполнил форму в тот день.
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')";
Сначала убедитесь, что Date
Поле является первичным или уникальным ключом.
Тогда вы можете использовать НА ДУБЛИКАТЕ
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')
ON DUPLICATE KEY UPDATE $name='$values'";
Но вы действительно должны проверить подготовленные заявления на вашем языке (PDO в случае PHP) для предотвращения SQL-инъекций.
Вы должны изменить свой стол.
Вместо столбца для каждого человека создайте столбец имени, чтобы у вас было:
Дата | Имя | Ценности
Сделайте дату и личность первичным ключом:
ALTER TABLE 'table' ADD PRIMARY KEY (Date,Name)
Затем вставьте так:
INSERT INTO table (Date,Name,Values) VALUES (CURDATE(),'$name','$values') ON DUPLICATE KEY UPDATE Values='$values'
Попробуйте использовать REPLACE INTO вместо INSERT INTO.
Я просто перечитал вопрос — ОП хочет перезаписать данные, если пользователь повторно отправляет форму — при первом прочтении я подумал, что они хотят сохранить исходные данные
Альтернативой [если вы хотите сохранить только исходные данные], будет использование insert ignore
: посмотрите этот ответ для сравнения между insert ignore
а также on duplicate key update
: "ВСТАВИТЬ ИГНОР" против "ВСТАВИТЬ … НА ДУБЛИКАТЬ КЛЮЧЕВОЕ ОБНОВЛЕНИЕ"
Хотя вам, вероятно, следует изменить дизайн таблицы на «дата», «человек», «данные», как предложено в другом ответе