Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止mysql数据库中出现重复行,忽略不工作_Php_Mysql - Fatal编程技术网

Php 防止mysql数据库中出现重复行,忽略不工作

Php 防止mysql数据库中出现重复行,忽略不工作,php,mysql,Php,Mysql,我试图防止在mysql数据库中插入重复的行。表名是favorites,我的表中有两列:company_id和user_id,我想防止用户两次尝试将同一家公司作为“favorite”添加到db中 这就是我所尝试的: $query = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ( $item_id, $user_id )"; mysql_query($query,$conn); 但是不起作用 我还尝试“更改表”以添加主

我试图防止在mysql数据库中插入重复的行。表名是favorites,我的表中有两列:company_id和user_id,我想防止用户两次尝试将同一家公司作为“favorite”添加到db中

这就是我所尝试的:

$query  = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ( $item_id, $user_id )";
    mysql_query($query,$conn);
但是不起作用

我还尝试“更改表”以添加主键,但是,我需要将user\u id和item\u id都作为键,因为同一个偏好项可以由多个“user\u id”偏好,并且同一个“user\u id”可以插入许多不同的偏好项,因此,数据可以“复制”,但我试图防止完全相同的“用户id”和“项目id”被插入两次


非常感谢您的帮助。

尝试将复合主键(从
项目id
用户id
)添加到表中


如果表中已有违反此约束的数据,则会出现错误。在这种情况下,您需要创建一个新表并将数据迁移到新表中。

尝试向表中添加一个复合主键(从
项目id
用户id


如果表中已有违反此约束的数据,则会出现错误。在这种情况下,您需要创建一个新表,并将数据迁移到新表中。

INSERT IGNORE
仅适用于键。通常,您唯一拥有的键是表上的主键

因此,首先搜索匹配行,如果它们存在,不要插入新记录

$search_q = "SELECT `id` FROM `favorites` WHERE `item_id` = ";
$search_q .= mysql_real_escape_string($item_id);
$search_q .= " AND `user_id` = ";
$search_q .= mysql_real_escape_string($user_id);


$r = mysql_query($search_q);
if (!mysql_num_rows($r)) {
   # This combination doesn't exist
   $insert_q = "INSERT INTO `favorites` (`item_id`,`user_id`) VALUES (";
   $insert_q .= mysql_real_escape_string($item_id).",";
   $insert_q .= mysql_real_escape_string($user_id).")"
   mysql_query($insert_q);  
}

INSERT IGNORE
仅适用于键。通常,您唯一拥有的键是表上的主键

因此,首先搜索匹配行,如果它们存在,不要插入新记录

$search_q = "SELECT `id` FROM `favorites` WHERE `item_id` = ";
$search_q .= mysql_real_escape_string($item_id);
$search_q .= " AND `user_id` = ";
$search_q .= mysql_real_escape_string($user_id);


$r = mysql_query($search_q);
if (!mysql_num_rows($r)) {
   # This combination doesn't exist
   $insert_q = "INSERT INTO `favorites` (`item_id`,`user_id`) VALUES (";
   $insert_q .= mysql_real_escape_string($item_id).",";
   $insert_q .= mysql_real_escape_string($user_id).")"
   mysql_query($insert_q);  
}

据我所知,最简单的方法是在user\u id-item\u id对上添加唯一约束,这将通过以下查询完成:

ALTER TABLE favorites 
ADD UNIQUE(item_id,user_id)
然后,每当您尝试插入表中已存在的user\u id-item\u id对时,insert查询将返回错误,因此应修改insert查询:

INSERT INTO favorites(item_id,user_id) 
     VALUES ($item_id,$user_id) 
ON DUPLICATE KEY UPDATE item_id=item_id
我不建议使用“INSERT IGNORE”,因为它会忽略所有错误。我的查询只要在检测到重复键时设置item_id=item_id(无更改),数据就不会重复


我还强烈建议您考虑使用而不是mysql_*函数。如果您忘记检查这两个用户输入变量,那么您发布的PHP非常容易受到mysql注入的影响。基于同样的原因,甚至PHP手册也不鼓励使用这些函数。

据我所知,最简单的方法是在user\u id-item\u id对上添加唯一的约束,这将通过以下查询完成:

ALTER TABLE favorites 
ADD UNIQUE(item_id,user_id)
然后,每当您尝试插入表中已存在的user\u id-item\u id对时,insert查询将返回错误,因此应修改insert查询:

INSERT INTO favorites(item_id,user_id) 
     VALUES ($item_id,$user_id) 
ON DUPLICATE KEY UPDATE item_id=item_id
我不建议使用“INSERT IGNORE”,因为它会忽略所有错误。我的查询只要在检测到重复键时设置item_id=item_id(无更改),数据就不会重复


我还强烈建议您考虑使用而不是mysql_*函数。如果您忘记检查这两个用户输入变量,那么您发布的PHP非常容易受到mysql注入的影响。出于同样的原因,甚至PHP手册也不鼓励使用这些函数。

您可以使用以下列的复合主键:

ALTER TABLE table ADD PRIMARY KEY ( 'item_id' , 'user_id' )

这意味着允许使用相同的用户ID和项目ID,并且只有它们的组合才需要唯一。

您可以使用以下列的复合主键:

ALTER TABLE table ADD PRIMARY KEY ( 'item_id' , 'user_id' )

这意味着允许使用相同的用户ID和项目ID,并且只需要它们的组合是唯一的。

您是否尝试了两列的复合主键?否,您可以删除或显示一个示例吗?:)
altertable TABLE ADD主键('item\u id','user\u id')
这是因为现在表不能包含item\u id-user\u id的重复组合。用户id 1在那里两次偏爱某些item id 42。这是因为您的表已经有重复的条目。您是否可以创建一个设置了主键的新主键,然后在此处“复制忽略”旧表中的所有值?您是否尝试了两列的复合主键?否,您可以删除或显示一个示例吗?:)
altertable TABLE ADD主键('item\u id','user\u id')
这是因为现在表不能包含item\u id-user\u id的重复组合。用户id 1在那里两次偏爱某些item id 42。这是因为您的表已经有重复的条目。您可以创建一个设置了主键的新表,然后在这里“复制忽略”旧表中的所有值吗?谢谢您的帮助。对于那些有类似问题的人:请参阅上面的@Esailijas评论以了解更多详细信息。感谢您的帮助。对于那些有类似问题的人:请参阅上面的@Esailijas评论以了解更多详细信息。