На моем веб-сайте у меня есть столовые movies
и users
таблицы
Я пытаюсь создать кнопку «Добавить в favs», которую пользователь может щелкнуть, что добавит этот фильм в избранное (ajax / javascript не нужен в данный момент, просто php).
Так что же самый простой способ сделать что-то подобное? Я подумал об этом, но я не могу найти решение (все, что я считаю слишком сложным, и, на мой взгляд, невозможно).
Что вы думаете?
Мне не нужен готовый скрипт, просто идея, которая может заставить меня работать (хотя, если у вас есть пример такого скрипта, я был бы рад посмотреть на него).
Благодаря!
Добавить третью таблицу:
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
(как видите, каждый столбец является внешним ключом). Он также определяет отношения « многие-ко-многим» , потому что одному пользователю может нравиться много фильмов, и один фильм может понравиться многим пользователям.
Когда вы добавляете любимый фильм для пользователя, все, что вам нужно сделать, это вставить строку в эту таблицу с идентификатором пользователя и идентификатором фильма:
INSERT INTO user_favorites(user_id, movie_id) VALUES([user ID], [movie ID])
Чтобы узнать, какие фильмы понравились пользователю:
SELECT movie_id FROM user_favorites WHERE user_id = [user ID]
Это отношения «многие ко многим». Пользователь может любить много фильмов, и многим пользователям может понравиться фильм. В СУБД вы представляете отношения «многие ко многим» с третьей таблицей. Я называю это таблицей пересечений, но она также называется другими именами.
Создайте таблицу с двумя столбцами. Столбцы представляют собой как внешние ключи, так и ссылки на фильмы и пользователей соответственно.
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 = ?
Что касается одного из ваших комментариев:
Вы не должны указывать ссылку «Добавить в избранное». Такие индексы, как Google, будут следовать ссылкам, а затем, прежде чем вы это узнаете, каждый пользователь предпочитает каждый фильм.
Общей практикой является то, что операции только для чтения могут быть запросами GET, а операции, которые записываются в базу данных, могут быть запросами POST. Это означает, что вам нужно использовать элемент <form>
для отправки запросов POST, а не <a href="...">
.
Вам нужно будет создать новую таблицу:
user_favorite_movies -------------------- ID (primary key) userID (foreign key) movieID (foreign key) date
Затем, когда пользователь нажимает кнопку «Добавить избранный», вы просто вставляете новую строку в user_favorite_movies с идентификатором пользователя из таблицы пользователя, идентификатором фильма из таблицы фильмов и датой его добавления (полезно для сортировки позже).
Надеюсь это поможет!
Лучший,
-Эрик
Вы можете создать favourites
таблицы с тремя столбцами, id
, mid
и uid
. Чтобы добавить избранное:
INSERT INTO favourites (mid, uid) VALUES (3, 5)
Для поиска фаворитов одного пользователя:
SELECT * FROM favourites WHERE uid = 7
Поиск людей, которые любили один фильм:
SELECT * FROM favourites WHERE mid = 9
Насколько я вижу, вам все равно придется использовать JavaScript или Ajax для публикации, если вы не хотите обновлять страницу каждый раз, когда отметьте / отмените выбор фаворита, а также добавьте / удалите новый любимый индикатор на месте в то же время.
Или я чего-то не хватает?