Всем доброго времени суток, у меня появилась проблема с которой я не могу справится. С добавлениям от одного пользователя к другому я разобрался в базу записалось что user1 кинул заявку user2. Теперь нужно подтвердить дружбу, да и оповестить пользователя что ему пришла заявка в друзья, но у меня не получается почему то. Делаю так, один скрипт показываю он и за добавления отвечает и за подтверждения. PHP: <?php //Делаем запрос на добавления в друзья! $users_id = isset($_GET['idfriend']) ? (int)$_GET['idfriend'] : 0; $sql = 'INSERT INTO `friends` (`friend_one`,`friend_two`,`status`) VALUES (:friend_one, :friend_two, :status)'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':friend_one',$_SESSION['id'], PDO::PARAM_STR); $stmt->bindValue(':friend_two', $users_id, PDO::PARAM_STR); $stmt->bindValue(':status', 0); if($stmt->execute()) $_SESSION['friend'] = '<div id="sendmess">Вы отправили заявку в друзья</div>'; else $_SESSION['friend'] = '<div id="sendmess1">Ошибка отправки заявки<div>'; header('Location:'. HOST .'?mode=message&allmess'); exit; //Делаю запрос на подтверждения что данный пользователь ему друг или нет if (!empty($_SESSION['friend'])) { echo $_SESSION['friend']; unset($_SESSION['friend']); } $id = isset($_GET['accept']) ? (int)$_GET['accept'] : 0; $sql = 'UPDATE `friends` SET `status`= 1 WHERE (`friend_one`= :friend_one OR `friend_two`= :friend_one) AND (`friend_one`= :friend_two OR `friend_two`= :friend_two)'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':friend_one',$_SESSION['id'],PDO::PARAM_INT); $stmt->bindValue(':friend_two', $id,PDO::PARAM_INT); $stmt->execute(); //Проверяем дружат ли пользователи или нет $sql = ' SELECT `friend_one`,`friend_two`,`status` FROM `friends` WHERE (`friend_one`=:friend_one OR `friend_two`=:friend_one) AND (`friend_one`=:friend_two OR `friend_two`=:friend_two)'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':friend_one',$_SESSION['id'],PDO::PARAM_INT); $stmt->bindValue(':friend_two', $id,PDO::PARAM_INT); //$stmt->bindValue(':status', $id,PDO::PARAM_INT); $stmt->execute(); ?> Но почему то я подтвердить не могу. Может у кого есть предположения, кто либо предложит помощь, буду очень благодарен. Всем спасибо за внимание.
Так у тебя нет даже проверки (Дружат ли пользователи)... То что ты сделал запрос это конечно хорошо, нуи что дальше то? Может сделаешь проверку (Как с отправкой предложения дружбы)?
Я бы сделал отдельную таблицу для заявок, отдельную таблицу для друзей. В таблице для друзей все записи дублированы (если я твой друг, то и ты мой друг)
Как нету проверки? Есть третий запрос как раз проверяет дружат или нет. Или я не правильно сделал? --- Добавлено --- А если по подробней? Как примерно таблицы должны выглядеть? И какая с кем связь должна быть то-есть через какие ключи foregin key, primary key. Просто у меня получается так: таблица пользователей. users(id, login, email и т.д.) Таблица друзей friends(friend_id, friend_one, friend_two, status) И имеют связь они через foregin key(friend_one, friend_two) с таблицей users(с полем id) Это не правильное построение таблицы для друзей? Покажите свой пример как бы вы сделали? Может у вас будет правильней.
Таблица для друзей нормальная, только я бы добавлял обе пары. А таблица запросов: просто user_id, user_who_requested_id
А если по подробней? Как примерно таблицы должны выглядеть? И какая с чем связана то-есть через какие ключи foregin key, primary key. Просто у меня получается так: таблица пользователей. users(id, login, email и т.д.) Таблица друзей friends(friend_id, friend_one, friend_two, status) И имеют связь они через foregin key(friend_one, friend_two) с таблицей users(с полем id) Это не правильное построение таблице Не понял тебя, по подробней, просто расписал как то по другому)))
Я вообще никогда на уровне базы ключи не ставлю - только программно. А то потом база всякие припоны создаёт
О да сейчас база мне эти припоны и дает, какие то ошибки одним слово((. я так понимаю лучше программно делать ключи? чем в базе это делать? --- Добавлено --- Покажи мне пример, полный объясни что к чему в таблице у тебя) спасибо.
таблица друзей - точно как у тебя, только туда всегда добавляются пары значений Код (Text): |user_id|friend_id | 12 | 14 | 14 | 12 А по поводу таблицы запросов - элементарный один-к-одному Код (Text): |user_id|user_who_requested_id | 12 | 27 Здесь пользователи 12 и 14 уже друдат, а пользователь 27 только подал заявку пользователю 12.
А вот тут еще объясни смысле таблицы запросов? У меня есть таблица friends и в ней поля описаны выше. А таблицы запросов у меня нет.
Для меня смысл в том, что в таблицу друзей должно быть по две пары записей, а в таблице запросов только одна. Ну и не мешать разные понятия в одной таблице.
Я что-то не пойму зачем дублировать строки? Почему нельзя делать одну строку? Заодно и понятно кто кого пригласил
А если написать "friend_one" => "Тот кто пригласил", "friend_two" => "кого пригласили" - не понятно кто кому друг что-ли?
Друзья обычно взаимные. Чтобы при выборке друзей, в моём примере, пользователя 12, отдавался пользователь 14, и наоборот, при максимально простом запросе. Иначе придётся какие-то извращённые запросы писать с or.
Это конечно кто как привык, и кому как удобно, но, как по мне, лучше сделать "извращённый запрос", чем забивать базу одинаковыми записями --- Добавлено --- (Запрос будет потреблять столько же ресурсов как и простой, а память базы хоть и достаточно большая и ограниченная, и если при 10-ти пользователях будет 20 записей, то при 1 000 - 2 000, что совсем не прикольно)
@SamyRed, база на то чтобы ее забивать)). @_ne_scaju_, вот в этой книжке в качестве примера используется создание сайта соц сети, там насколько я помню, рассматривается вопрос добавления в друзья и подтверждения(если конечно память мне не изменяет).
Одна запись такой таблицы занимает отсилы пару десятков байт, и будет в ней 20 Кбайт или 40Кбайт (для 1000) и даже 20 Мбайт или 40 Мбайт (для миллиона) большой погоды делать не будет на современных серверах.
Спасибо посмотреть надо будет в книгу, хотя у меня уже получилось, с чужой помощью подтвердить что пользователи являются друзьями. --- Добавлено --- Народ с добавлениям и подтверждение справился, а как теперь удалить пользователя из друзей?