Php 在重复密钥更新时,将创建新行,而不是更新

Php 在重复密钥更新时,将创建新行,而不是更新,php,mysql,sql,Php,Mysql,Sql,我有一个叫做buildTracker的数据表。php表单发布要提交的数据以创建新的ID/行。这么多很好用。第二个表单会调出现有行进行编辑- 但是,它不更新现有行,而是创建新行和新键(ID) 如何在不创建新行的情况下获取要更新的密钥 $enteredBy = $conn->real_escape_string($_POST['enteredBy']); $query = "INSERT into buildtracker (EnteredBy) VALUES('" .

我有一个叫做buildTracker的数据表。php表单发布要提交的数据以创建新的ID/行。这么多很好用。第二个表单会调出现有行进行编辑-

但是,它不更新现有行,而是创建新行和新键(ID)

如何在不创建新行的情况下获取要更新的密钥

$enteredBy    = $conn->real_escape_string($_POST['enteredBy']);
   $query   = "INSERT into buildtracker (EnteredBy)
    VALUES('" . $enteredBy . "')
    ON DUPLICATE KEY UPDATE EnteredBy='" . $enteredBy . "'";

$success = $conn->query($query);
我的更新哪里出了问题


数据表行包括ID(key)和EnteredBy(text)

我猜您正在寻找一个
更新。更新内容如下所示:

UPDATE buildtracker 
    SET EnteredBy = ?
    WHERE <some column> = ?;
更新buildtracker
SET EnteredBy=?
式中=?;
=?
将标识要更新的此行。如果表中只包含一行,则不会出现这种情况


使用
表示您应该使用参数。您不应该使用输入值来填充查询字符串;您应该使用参数来避免意外的语法错误和sql注入漏洞。

从外观上看,您的表buildTracker上有一个自动递增的键字段。如果你在桌子上做一个描述,我猜这就是它所显示的。事实上,您正在插入一个日期,这意味着自动增量将启动,您将永远不会创建一个副本。如果您将EnteredBy作为主键,它应该始终更新$EnteredBy存在的位置。

您是否为表定义了任何唯一索引?以及任何带有
mysqli\u error($conn)
的错误?您在insert中只指定了一列,我怀疑这是您不想复制的键。您需要在insert语句中指定可能重复的键,以便重复键上的
能够工作。警告:使用
mysqli
时,您应该使用和将用户数据添加到查询中。不要使用手动转义和字符串插值或串联来完成此操作,因为这样会创建严重的错误。意外未扫描的数据是一个严重的风险。使用绑定参数不那么冗长,更容易检查是否正确。自动递增ID是我的主键。我并没有通过我的帖子来传递这些数据。通过插入不是主键的值,可以保证永远不会更新,始终插入。为什么?因为自动递增将在insert语句中触发,而不会触发更新。要完成所需操作,必须基于键更新行,不能为此使用insert on dupe update。