在我的网站上,我有一张表movies
和一张表users
我正在尝试用户可以点击的“添加到收藏夹”按钮,这会将该电影添加到他的收藏夹中(目前不需要ajax / javascript,只需php)。
那么我能做出类似事情的最简单方法是什么?我已经考虑过了,但我似乎无法找到解决方案(我想到的一切都太复杂了,而且我认为不可能)。
你的想法是什么?
我不需要一个现成的脚本,只是一个可以让我工作的想法(虽然如果你有一个这样的脚本的例子,我很乐意看看它。)
谢谢!
答案 0 :(得分:11)
这是一种多对多的关系。用户可以喜欢许多电影,并且许多用户可以喜欢电影。在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="...">
元素。
答案 1 :(得分: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]
答案 2 :(得分:1)
您需要创建一个新表:
user_favorite_movies
--------------------
ID (primary key)
userID (foreign key)
movieID (foreign key)
date
然后当用户点击“添加收藏夹”按钮时,您只需在user_favorite_movies中插入一个新行,其中包含用户表中的用户ID,电影表中的电影ID以及添加的日期(适合排序)更高版本)。
希望这有帮助!
最佳,
-Eric
答案 3 :(得分:1)
您可以创建一个包含三列favourites
,id
和mid
的表uid
。添加收藏夹:
INSERT INTO favourites (mid, uid) VALUES (3, 5)
搜索一个用户的收藏夹:
SELECT * FROM favourites WHERE uid = 7
搜索喜欢一部电影的人:
SELECT * FROM favourites WHERE mid = 9
答案 4 :(得分:0)
据我所知,您仍然需要使用JavaScript或Ajax来发布帖子,除非您想在每次标记/取消标记收藏时刷新页面,还要添加/删除新收藏指标同时到位。
或者我错过了什么?