更新现有行,而不是在 MySQL 中创建新行


Update existing row instead of creating a new one in MySQL

下面的代码正确地更新了MySQL表,所以当有人在团队中输入一个数字和一个cp2_arrival的时间时,它就会进入表格。但是当我对下一个时间条目执行相同操作时,它会创建一个新行,而不是更新该团队的现有行。

这是我的代码

<?php
$con=mysqli_connect("localhost","","","");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to Database, Contact Control: " . mysqli_connect_error();
}
// escape variables for security
$Team = mysqli_real_escape_string($con, $_POST['Team']);
$cp = mysqli_real_escape_string($con, $_POST['cp']);

$sql="INSERT INTO checkpoints (Team, CP2_Arrival)
VALUES (
 '".$Team."',
 '".$cp."00' 
)";
if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "record added";
mysqli_close($con);
?>

任何帮助将不胜感激。

INSERT 将始终创建一个新行(或错误输出(。根据您的表结构,您可以执行以下操作:

$sql="INSERT INTO checkpoints (Team, CP2_Arrival) 
VALUES (
 '".$Team."',
 '".$cp."00' 
) ON DUPLICATE KEY UPDATE CP2_Arrival='".$cp."00'";

但是,这将要求 Team 列是唯一索引或主键。如果不是这种情况,则需要对表进行某种检查,以确定是要插入还是更新,然后运行您拥有的插入语句或运行如下所示的更新语句:

$sql="UPDATE checkpoints SET CP2_Arrivale='".$cp."00' WHERE Team='".$Team."';

如果要将"团队"列添加为主键,请尝试:

ALTER TABLE checkpoints ADD PRIMARY KEY(Team);

首先,据我了解,您可以将Team列定义为主键(或唯一键(。然后您可以使用以下语句:

$sql="INSERT INTO checkpoints (Team, CP2_Arrival)
VALUES (
 '".$Team."',
 '".$cp."00' 
) ON DUPLICATE KEY UPDATE CP2_Arrival = '".$cp."00';
在这种情况下,如果没有

此类Team,您将插入新行,或者在其他情况下更新CP2_Arrival。您可以在此处阅读有关此内容的更多信息:重复插入

您也可以使用REPLACE(替换语法(代替INSERT(这也需要主/唯一键(:

$sql="REPLACE INTO checkpoints (Team, CP2_Arrival)
VALUES (
 '".$Team."',
 '".$cp."00' 
)";

谢谢大家。我现在让它工作了。首先,我将编码更改为大多数人的建议(见下文(还截断了选项卡,然后将团队作为主键。测试了这个,它现在可以工作了

$sql="INSERT INTO checkpoints (Team, CP2_Arrival) 
VALUES (
 '".$Team."',
'".$cp."00' 
) ON DUPLICATE KEY UPDATE CP2_Arrival='".$cp."00'";