【问题标题】:System for keeping track of user favorites跟踪用户收藏的系统
【发布时间】:2011-04-12 22:37:22
【问题描述】:

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

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

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

你有什么想法?

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

谢谢!

【问题讨论】:

  • 收藏夹是指用户的书签吗?如果是这样,您可能必须使用 Javascript。
  • 不,他是指 MySQL 服务器上用户帐户上的用户到电影书签列表。

标签: php system favorites


【解决方案1】:

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

或者我错过了什么?

【讨论】:

    【解决方案2】:

    这是一个多对多的关系。一个用户可以收藏很多部电影,一个电影可以被很多用户收藏。在 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 = ?
    

    关于你的一个 cmets:

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

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

    【讨论】:

    • 好的,完美的答案,很详细,我马上试试!
    【解决方案3】:

    添加第三个表:

    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]
    

    【讨论】:

    • 谢谢丹尼尔,就像我上面所说的,基本上是一样的,但我正在考虑,所以谢谢!
    • 现在只是一个小问题,我将如何继续将其发布到数据库中,我不知道为什么,通常我可以这样做,但现在我的“添加到收藏夹”会是链接而不是表单按钮,那么调用 SQL 语句的最佳方式是什么?
    • @Alex 我不确定为什么它是链接或按钮会很重要。在目标页面上,只需准备您的 INSERT 查询并执行它。我错过了你的要求吗?
    【解决方案4】:

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

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

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

    SELECT * FROM favourites WHERE uid = 7
    

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

    SELECT * FROM favourites WHERE mid = 9
    

    【讨论】:

    • 感谢德兰,非常感谢上述答案!虽然也是同一个答案。
    【解决方案5】:

    您需要创建一个新表:

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

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

    希望这会有所帮助!

    最好的,

    -埃里克

    【讨论】:

    • 非常感谢 Eric 的回答,看起来像上面那个,但仍然很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多