停止SQL添加相同信息的多行


Stop SQL adding mutliple rows of the same information

是否有一种方法可以检查我的PHP文件,在使用时将用户添加到我的数据库。即

John使用我的程序,当他遇到错误时,它会获取他的信息并将其发送到我的数据库,数据库中有他的姓名,电子邮件和计算机操作系统。

现在这就是我想要的,但是如果john再次启动程序,它会发送另一个,重复的行副本到我的数据库,这是无用的,并且阻塞了它,充满了无用的信息。

当前正在使用的代码:

$connect = mysql_connect('host','user','pass') or die("Error");
mysql_select_db('DB') or die("Error");
$Name    = $_GET['name'];
$Email   = $_GET['email'];
$OS      = $_GET['os'];
$add     ="INSERT INTO UserDB(Name, Email, OS, ) VALUES ('$Name', '$Email', '$OS')";
mysql_query($add,$connect);
mysql_close($connect);

您希望在数据库中使用唯一约束或适当的主键。然后,当您的代码试图插入重复行时,数据库将引发错误,您可以处理它。如果你想用新行替换旧行,你可能需要一个upsert。

这里有一篇关于选择主键的好文章。

无需创建大量额外的逻辑,就可以在数据库上创建UNIQUE键关联。由于电子邮件地址是唯一的,您可以这样做:

运行此SQL

添加唯一键,并禁止在电子邮件地址上多次插入。

ALTER TABLE `UserDB` ADD UNIQUE(`Email`);

更改PHP代码查询

如果没有插入,使用此查询进行更新。

if(mysql_insert_id() < 1) {
    $add = sprintf(
            "UPDATE `UserDB` SET `Name`='%s', `Email`='%s', `OS`='%s' WHERE `Email`='%s'",
            $Name,
            $Email,
            $OS,
            $Email
    );
}

请切换到mysql或PDO,你很容易受到SQL注入!!

您永远无法获得数据库中某一行的精确副本。必须有唯一的id。这通常是一个为每个新行自动递增的数字。如果在您的表中出现这种情况,您必须简单地询问数据库当前用户是新用户还是现有用户。比如:

$query = "SELECT id FROM UserDB WHERE Name='$name' AND Email = '$email'";
$result = mysql_query($query);
if(mysql_num_rows($result) == 0)
//Add user
else
//Update user? Or something else