MySQL - 如果已经存在,则进行行和更新


MySQL - make row and update if already exists

我有 4 列的表格:Date, John, Frank, Anthony

我想制作一个可以由这 3 个人每天填写的表格,并将这些值存储在数据库中。当 John 今天填写表单时,应该创建一个新行,其中包含今天的日期,以及他在数据库中的值。当 Frank 在 1 小时后(即同一天)填写表格时,他的值也应该插入到数据库中,但在同一行中,因为已经有一行包含今天的日期。但是当安东尼明天填写表格时,我应该创建一个带有明天日期的新行。

简而言之:该程序会检查今天是否有人已经填写了表格。如果是:它只是将值添加到填写它的人的列中的 today 现有行中。如果没有:它会创建一个带有今天日期的新行。

我已经写了这段代码,但问题是每次有人填写表单时它都会创建一个新行,并且只有当$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'"; 

但是你真的应该检查你的语言中的预准备语句(在PHP的情况下是PDO)以防止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。

编辑

我只是重新阅读了这个问题 - 如果用户重新提交表单,OP 想要覆盖数据 - 我第一次阅读它时,我以为他们想保留原始数据

另一种[如果您只想保留原始数据],将使用insert ignore:请参阅此答案以了解insert ignoreon duplicate key update之间的比较:"插入忽略"与"插入...重复键更新时"

尽管您可能应该按照另一个答案中的建议将表格设计更改为"日期","人员","数据"