4

在我的网站上,我有一张桌子movies和一张桌子users

我正在尝试有一个用户可以单击的“添加到收藏夹”按钮,它将将该电影添加到他的收藏夹中(目前不需要 ajax / javascript,只需 php)。

那么我可以做这样的事情的最简单方法是什么?我已经考虑过这个问题,但我似乎找不到解决方案(我所想的太复杂了,在我看来不可能)。

你有什么想法?

我不需要现成的脚本,只需要一个可以让我工作的想法(尽管如果您有此类脚本的示例,我很乐意查看)。

谢谢!

4

5 回答 5

12

这是一个多对多的关系。一个用户可以收藏很多部电影,一个电影可以被很多用户收藏。在 RDBMS 中,您表示与第三个表的多对多关系。我称其为交集表,但它也有其他名称。

创建一个包含两列的表。这些列都是外键,分别引用电影和用户。

CREATE TABLE Favorites (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  PRIMARY KEY (user_id, movie_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id),
  FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
); 

当用户选择收藏一部电影时:

INSERT INTO Favorites (user_id, movie_id) VALUES (?, ?)

当用户决定不再喜欢某部电影时,删除相应的行:

DELETE FROM Favorites WHERE (user_id, movie_id) = (?, ?)

要获得给定用户喜欢的电影集:

SELECT movie_id FROM Favorites WHERE user_id = ?

要获得喜欢给定电影的用户集:

SELECT user_id FROM Favorites WHERE movie_id = ?

关于您的评论之一:

您不应该将“添加到收藏夹”作为链接。像谷歌这样的索引器会跟踪链接,然后在你不知不觉中,每个用户都收藏了每部电影。

一般的最佳实践是只读操作可以是 GET 请求,而写入数据库的操作可以是 POST 请求。这意味着您需要使用一个<form>元素来提交 POST 请求,而不是一个<a href="...">元素。

于 2010-09-15T22:19:09.523 回答
6

添加第三个表:

CREATE TABLE user_favorites (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  PRIMARY KEY (user_id, movie_id),
  FOREIGN KEY user_id REFERENCES users (user_id),
  FOREIGN KEY movie_id REFERENCES movies (movie_id)
)

这称为交集表连接表,因为它将users表中的行连接到表中的行movies(如您所见,每一列都是外键)。它也定义了多对多的关系,因为一个用户可以喜欢很多电影,而一部电影可以被很多用户喜欢。

当您为用户添加喜欢的电影时,您所要做的就是在此表中插入一行,其中包含用户 ID 和电影 ID:

INSERT INTO user_favorites(user_id, movie_id) VALUES([user ID], [movie ID])

要查看用户收藏的电影:

SELECT movie_id FROM user_favorites WHERE user_id = [user ID]
于 2010-09-15T22:21:03.640 回答
1

您将需要创建一个新表:

user_favorite_movies
--------------------
ID (primary key)
userID (foreign key)
movieID (foreign key)
date

然后,当用户单击“添加收藏夹”按钮时,您只需在 user_favorite_movies 中插入一个新行,其中包含用户表中的用户 ID、电影表中的电影 ID 以及添加日期(便于稍后排序)。

希望这可以帮助!

最好的,

-埃里克

于 2010-09-15T22:17:28.363 回答
1

您可以创建一个favourites包含三列、idmid的表uid。要添加收藏夹:

INSERT INTO favourites (mid, uid) VALUES (3, 5)

要搜索一位用户的收藏夹:

SELECT * FROM favourites WHERE uid = 7

要搜索收藏了一部电影的人:

SELECT * FROM favourites WHERE mid = 9
于 2010-09-15T22:19:20.130 回答
0

据我所知,您仍然需要使用 JavaScript 或 Ajax 来发布帖子,除非您想在每次标记/取消标记收藏夹时刷新页面,以及添加/删除新的收藏夹指示器同时。

还是我错过了什么?

于 2015-10-02T00:53:43.647 回答