Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.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不允许与另一行具有2个相同列值的行_Php_Mysql - Fatal编程技术网

Php MySQL不允许与另一行具有2个相同列值的行

Php MySQL不允许与另一行具有2个相同列值的行,php,mysql,Php,Mysql,这是我的MySQL表: 左列自动递增 中间一列是用户的id 右栏是他们喜欢的帖子的id 我正在将数据插入表中,如下所示: $stmt = $db->prepare("INSERT INTO likes (user_id,post_id) VALUES (?,?)"); $stmt->execute(array($_SESSION['user'],$_POST['id'])); 这很好,但是正如您所看到的,MySQL表有两个相同的行(id为3和4),这两个行的用户id都是5,p

这是我的MySQL表:

  • 左列自动递增
  • 中间一列是用户的id
  • 右栏是他们喜欢的帖子的id
我正在将数据插入表中,如下所示:

$stmt = $db->prepare("INSERT INTO likes (user_id,post_id) VALUES (?,?)");
$stmt->execute(array($_SESSION['user'],$_POST['id']));
这很好,但是正如您所看到的,MySQL表有两个相同的行(id为3和4),这两个行的用户id都是5,post id都是196。换句话说,我的MySQL表记录了id=5的用户两次喜欢id=196的帖子。我如何禁止两行具有相同的用户id相同的帖子id

您需要在用户id和帖子id列上设置a

您需要在用户id上设置a和post_id列

CREATE UNIQUE INDEX user_post on likes (user_id, post_id)
这将防止多次使用相同的(用户id、发布id)值

这将防止多次使用相同的(用户id、发布id)值…

Update 在某些情况下,下面的答案可能会导致数据库条目重复

感谢@Martin发现以下系统中的主要缺陷:


这是您在业务逻辑中应该做的事情。我实现几乎相同系统的方式如下(在psuedo代码中):

显示任一按钮的代码都在服务器上,因此用户无法截取该按钮并手动选择要执行的操作

唯一的缺陷是,必须有一种方法来识别用户单击的按钮,这意味着用户可能会花费大量时间挖掘和篡改,并可能更改页面上的按钮/链接/任何内容

我通过在服务器上测试用户是否已经喜欢,然后仅在他们不喜欢时插入来克服这一问题。

Update 在某些情况下,下面的答案可能会导致数据库条目重复

感谢@Martin发现以下系统中的主要缺陷:


这是您在业务逻辑中应该做的事情。我实现几乎相同系统的方式如下(在psuedo代码中):

显示任一按钮的代码都在服务器上,因此用户无法截取该按钮并手动选择要执行的操作

唯一的缺陷是,必须有一种方法来识别用户单击的按钮,这意味着用户可能会花费大量时间挖掘和篡改,并可能更改页面上的按钮/链接/任何内容



我通过在服务器上测试用户是否已经喜欢,然后仅在他们不喜欢时插入来克服这一问题。

是否需要自动递增
id
列?我会在
user\u id,post\u id
@Martin@inquisitive上有一个复合PK,很少有不需要id列的情况,这肯定不是那种情况@rockerest-您似乎把
PK
Id
列混淆了。它们不是一回事。我建议OP在两列上有一个复合主键。@martin,很明显,
id
是他的
PK
@rockerest,但还不清楚
id
列是否有任何有用的用途(我怀疑它没有)。我建议放弃它,在超过2列上创建一个复合主键。您需要自动递增的
id
列吗?我会在
user\u id,post\u id
@Martin@inquisitive上有一个复合PK,很少有不需要id列的情况,这肯定不是那种情况@rockerest-您似乎把
PK
Id
列混淆了。它们不是一回事。我建议OP在两列上有一个复合主键。@martin,很明显,
id
是他的
PK
@rockerest,但还不清楚
id
列是否有任何有用的用途(我怀疑它没有)。我建议放弃它,在超过2列上创建一个复合主键。这是错误的。唯一约束只允许用户“喜欢”一件事。曾经不要这样做。@rockerest-一点也不正确。唯一的约束。我的意思是跨越两列。事实上,你可能需要一个索引-见优秀,谢谢。我刚开始工作。。。我有点慢,这是错误的。唯一约束只允许用户“喜欢”一件事。曾经不要这样做。@rockerest-一点也不正确。唯一的约束。我的意思是跨越两列。事实上,你可能需要一个索引-见优秀,谢谢。我刚开始工作。。。我有点慢。强制执行唯一约束应该在数据库中完成。“在其他任何地方你都可以得到比赛条件和副本。”马丁,你能解释一下吗?我不清楚在这种情况下,您如何获得竞争条件或重复项。如果我向您的服务器提交多个请求,那么两个并发事务都可以检查行的存在,找到不存在的行并继续执行插入。在数据库中具有唯一约束也是一件好事,因为查询优化人员可以利用这些知识制定更有效的查询计划。应在数据库中执行唯一约束。“在其他任何地方你都可以得到比赛条件和副本。”马丁,你能解释一下吗?我不清楚在这种情况下,您如何获得竞争条件或重复项。如果我向您的服务器提交多个请求,那么两个并发事务都可以检查行的存在,找到不存在的行并继续执行插入。在数据库中具有唯一的约束也是一件好事,因为查询优化人员可以使用这些知识来制定更有效的查询计划。
Show Blog/Video/Post/Etc.

Has user "liked" this?
    Yes = show "unlike" button (on server, not JS)
    No  = show "like" button (on server, not JS)

Add or delete "like" as necessary