Как сделать добавление в друзья php

Как сделать добавление в друзья php

Механизм добавления в друзья – один из базовых элементов в социальной функциональности веб-приложений. Его реализация в PHP требует точного понимания работы с базой данных, обработки запросов пользователей и защиты от злоупотреблений.

Для хранения информации о дружбе используется отдельная таблица. Минимальная структура: user_id, friend_id, status. Значение статуса позволяет различать отправленные заявки, принятые и отклонённые. Рекомендуется использовать числовой статус: 0 – отправлена, 1 – принята, 2 – отклонена. Такая схема упрощает выборки и фильтрацию данных.

Отправка заявки оформляется через POST-запрос, проверяется CSRF-токен и наличие пользователя в базе. Повторные заявки блокируются через проверку на существование записи в таблице дружбы в любом направлении (user_id или friend_id), что исключает дублирование.

Для приёма или отклонения заявки создаются отдельные контроллеры или маршруты, которые обновляют статус в таблице. Запросы к базе данных должны использовать подготовленные выражения (prepared statements), чтобы исключить SQL-инъекции.

Отдельное внимание стоит уделить отображению кнопки «Добавить в друзья». Она должна быть недоступна, если уже существует запись с любым статусом, кроме отклонённого. При отклонении не обязательно удалять запись – удобнее просто изменить статус и учитывать его в логике отображения.

Все действия, связанные с добавлением в друзья, должны быть доступны только авторизованным пользователям. Любой доступ по прямым ссылкам без проверки сессии или токена необходимо блокировать.

Создание таблицы дружбы в базе данных MySQL

Создание таблицы дружбы в базе данных MySQL

Для хранения информации о дружбе между пользователями требуется отдельная таблица, в которой каждая запись будет представлять однонаправленную или взаимную связь. Назовем таблицу friends.

Минимальный набор полей:

Поле Тип Назначение
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY Уникальный идентификатор записи
user_id INT UNSIGNED NOT NULL ID пользователя, отправившего запрос
friend_id INT UNSIGNED NOT NULL ID пользователя, которому отправлен запрос
status ENUM(‘pending’, ‘accepted’, ‘rejected’) DEFAULT ‘pending’ Состояние заявки
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP Дата создания заявки

Рекомендуется добавить индекс на пару полей (user_id, friend_id) для ускорения выборки и предотвращения дубликатов. Для обеспечения уникальности запросов между двумя пользователями следует использовать ограничение UNIQUE (user_id, friend_id).

Если требуется взаимная дружба, добавление второй записи с инверсией user_id и friend_id при подтверждении заявки позволит отразить двустороннюю связь без усложнения логики выборки.

Структура запроса на добавление в друзья

Структура запроса на добавление в друзья

Запрос на добавление в друзья должен содержать идентификатор отправителя, идентификатор получателя и отметку времени. Рекомендуется использовать метод POST для отправки данных, чтобы избежать попадания параметров в URL и обеспечить базовую защиту от внешнего вмешательства.

Пример тела запроса:

user_id_from=15

user_id_to=27

timestamp=1714651200

На стороне сервера необходимо проверить, что оба идентификатора существуют в базе данных, отсутствует активная заявка между этими пользователями и они ещё не являются друзьями. Также следует удостовериться, что пользователь не отправляет запрос сам себе. Эти проверки должны выполняться до вставки записи в таблицу заявок.

Хранить такие заявки удобно в таблице с полями: id, user_id_from, user_id_to, status, created_at. Поле status принимает значения: pending, accepted, rejected. Это позволяет отслеживать состояние каждой заявки без дублирования информации.

В случае успешной валидации запрос вставляется в базу с начальным статусом pending. В ответе сервер может вернуть JSON с результатом и ID созданной записи, например: {«success»:true,»request_id»:1021}.

Обработка отправки запроса с помощью PHP и AJAX

Обработка отправки запроса с помощью PHP и AJAX

Для отправки запроса на добавление в друзья без перезагрузки страницы используется связка JavaScript (AJAX) и серверной обработки на PHP. На клиенте необходимо установить обработчик события, например, при клике на кнопку «Добавить».

Пример AJAX-запроса на стороне клиента:

fetch('add_friend.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'friend_id=123'
})
.then(response => response.json())
.then(data => {
if (data.status === 'ok') {
// Обновление интерфейса
}
});

На стороне сервера файл add_friend.php должен обрабатывать POST-запрос и возвращать JSON-ответ. Важно проверить авторизацию пользователя и валидность ID друга.

session_start();
if (!isset($_SESSION['user_id']) || !isset($_POST['friend_id'])) {
echo json_encode(['status' => 'error']);
exit;
}
$userId = intval($_SESSION['user_id']);
$friendId = intval($_POST['friend_id']);
if ($userId === $friendId) {
echo json_encode(['status' => 'invalid']);
exit;
}
// Подключение к базе
$pdo = new PDO('mysql:host=localhost;dbname=social', 'user', 'pass');
$stmt = $pdo->prepare('INSERT IGNORE INTO friends_requests (sender_id, receiver_id) VALUES (?, ?)');
$stmt->execute([$userId, $friendId]);
echo json_encode(['status' => 'ok']);

Следует использовать INSERT IGNORE для предотвращения дублирования. Возвращаемое значение в формате JSON позволяет обработать результат на клиенте. Все данные нужно фильтровать и проверять на стороне сервера. Хранение сессии позволяет отследить инициатора запроса.

Проверка наличия существующего запроса или дружбы

Перед отправкой нового запроса в друзья необходимо убедиться, что между пользователями уже не существует активной связи. Это исключает дублирование данных и избыточные действия.

Проверка выполняется запросом к базе данных, где хранятся заявки и отношения. Пример SQL-запроса:

SELECT * FROM friends
WHERE
(sender_id = :current_user AND receiver_id = :target_user)
OR
(sender_id = :target_user AND receiver_id = :current_user)
LIMIT 1;

Если результат не пустой, значит либо уже существует заявка, либо пользователи уже друзья. Дополнительно можно проверять статус, если в таблице предусмотрено поле status, например: pending, accepted, rejected.

Для повышения читаемости и надёжности стоит использовать подготовленные выражения (prepared statements) через PDO или MySQLi. Это защитит от SQL-инъекций.

Проверку целесообразно вынести в отдельную функцию. Например:

function checkFriendshipExists($pdo, $userId, $targetId) {
$stmt = $pdo->prepare("SELECT 1 FROM friends
WHERE (sender_id = ? AND receiver_id = ?)
OR (sender_id = ? AND receiver_id = ?)
LIMIT 1");
$stmt->execute([$userId, $targetId, $targetId, $userId]);
return $stmt->fetchColumn() !== false;
}

Функция возвращает булево значение, позволяя быстро принять решение – отправлять запрос или нет.

Подтверждение и отклонение заявок в друзья

Подтверждение и отклонение заявок в друзья

После отправки заявки в друзья она сохраняется в базе данных со статусом, например, pending. Для обработки входящих заявок необходимо реализовать интерфейс, доступный авторизованному пользователю. Каждая заявка должна содержать ID отправителя, дату подачи и две кнопки: Принять и Отклонить.

При подтверждении заявки обновляется статус в таблице заявок на accepted, а также создаётся или активируется запись в таблице дружбы. Пример SQL-запроса:

UPDATE friend_requests SET status = 'accepted' WHERE sender_id = :sender AND receiver_id = :receiver;
INSERT INTO friends (user1_id, user2_id) VALUES (:sender, :receiver);

При отклонении достаточно изменить статус на rejected, либо удалить запись:

DELETE FROM friend_requests WHERE sender_id = :sender AND receiver_id = :receiver;

Для безопасности все действия должны проверяться на авторство: пользователь не должен иметь возможность подтвердить или отклонить чужую заявку. Использование токенов в форме и проверка сессии обязательны.

При отклике желательно обновлять список без перезагрузки, с использованием AJAX. Это требует серверного обработчика, возвращающего JSON с результатом действия. Пример ответа:

{ "status": "success", "action": "accepted", "user_id": 42 }

В интерфейсе также стоит отображать только актуальные заявки. Запрос может включать фильтрацию по статусу:

SELECT * FROM friend_requests WHERE receiver_id = :current_user AND status = 'pending';

Систему отказов и подтверждений стоит дополнять логированием действий для аудита и разрешения спорных ситуаций.

Таблица `friend_requests` может содержать следующие поля:

  • requester_id – ID пользователя, который отправил запрос;
  • receiver_id – ID пользователя, которому отправлен запрос;
  • status – статус запроса (например, «ожидает», «принят», «отклонен»).

Для получения исходящих запросов нужно выбрать записи, где поле `requester_id` совпадает с ID текущего пользователя. Входящие запросы можно получить, выбрав записи с совпадением по полю `receiver_id` для того же пользователя. Запросы можно фильтровать по статусу, чтобы вывести только активные запросы.

Пример SQL-запросов:

  • Исходящие запросы:
  • SELECT * FROM friend_requests WHERE requester_id = ? AND status = 'ожидает';
    
  • Входящие запросы:
  • SELECT * FROM friend_requests WHERE receiver_id = ? AND status = 'ожидает';
    

После выполнения запросов, результаты можно вывести в виде списка. Каждый запрос должен содержать информацию о пользователе, которому отправлен запрос (или который отправил запрос), а также дату и статус запроса.

$sql = "SELECT * FROM friend_requests WHERE requester_id = ? AND status = 'ожидает'";
$stmt = $pdo->prepare($sql);
$stmt->execute([$user_id]);
while ($row = $stmt->fetch()) {
echo "Запрос отправлен пользователю с ID: " . $row['receiver_id'];
}

Формирование списка друзей пользователя

Формирование списка друзей пользователя

Основной принцип формирования списка – использование базы данных для хранения информации о пользователях и их связях. Обычно для этого создается таблица, которая хранит пары пользователей, состоящих в дружбе. Например, можно использовать следующую структуру таблицы:

  • user_id – идентификатор пользователя;
  • friend_id – идентификатор друга;
  • status – статус дружбы (например, ожидает подтверждения или подтверждена);
  • created_at – дата и время установления дружбы.

Когда пользователь хочет увидеть список своих друзей, необходимо выполнить SQL-запрос, который будет извлекать все уникальные связи, связанные с этим пользователем. Для поиска друзей можно использовать следующий запрос:

SELECT u.id, u.name
FROM users u
JOIN friends f ON (u.id = f.friend_id)
WHERE f.user_id = :user_id AND f.status = 'confirmed';

Запрос выше извлекает список пользователей, которые являются друзьями текущего пользователя (по статусу «confirmed»).

Важно учитывать, что для оптимизации работы сайта, при большом количестве пользователей и их связей, необходимо использовать индексы на колонках user_id и friend_id для ускорения выполнения запросов.

После получения списка друзей, данные можно отображать в формате, удобном для пользователя. Например, в виде списка с изображениями, именами и возможностью отправки сообщений. Для этого также потребуется создать соответствующий интерфейс и логику взаимодействия с пользователем.

Кроме того, следует добавить механизмы для управления списком друзей, такие как:

  • Отправка запросов на добавление в друзья;
  • Подтверждение или отклонение запросов;
  • Удаление друзей.

Для реализации этих функций можно добавить дополнительные поля в таблицу friends, например, requested_at для даты отправки запроса, или deleted_at для хранения информации о времени удаления дружбы.

Обратите внимание на безопасность запросов. Всегда используйте подготовленные выражения (prepared statements), чтобы предотвратить SQL-инъекции.

Удаление друга и очистка записей в базе данных

Когда пользователь решает удалить друга на сайте, важно не только обновить список друзей, но и грамотно очистить связанные записи в базе данных, чтобы избежать утечек данных и лишней нагрузки на сервер.

Процесс удаления друга можно разделить на несколько этапов:

  1. Проверка наличия записи о дружбе.
  2. Удаление данных о дружбе в таблицах базы данных.
  3. Очистка кэшированных данных (если используется кеширование).

Для начала необходимо убедиться, что пользователь, которого хотят удалить, действительно является другом. Для этого можно проверить наличие записи в таблице, которая хранит информацию о связях между пользователями, например, таблица friends, где будут храниться пары идентификаторов пользователей.

Пример запроса для проверки наличия записи:

SELECT * FROM friends WHERE (user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?);

Если запись найдена, нужно удалить её из базы данных. Это можно сделать с помощью SQL-запроса:

DELETE FROM friends WHERE (user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?);

После удаления записи в таблице friends важно также очистить все связанные данные. Например, если в системе хранятся сообщения, фото или комментарии, связанные с этой дружбой, необходимо удалить их или пометить как неактивные, чтобы они не продолжали занимать место в базе данных.

Пример удаления связанных сообщений:

DELETE FROM messages WHERE sender_id = ? AND receiver_id = ?;

Если используется кэширование для ускорения работы сайта, важно очистить все кэшированные данные, связанные с удалённым другом. Это можно сделать с помощью механизмов кэширования, таких как Redis или Memcached. Пример очистки данных из кеша:

Cache::forget('friendship_' . user_id . '_' . friend_id);

Таким образом, удаление друга должно включать проверку наличия записи, её удаление и очистку всех связанных данных. Этот подход позволяет сохранить целостность базы данных и улучшить производительность системы.

Вопрос-ответ:

Как реализовать добавление пользователя в друзья на сайте с использованием PHP?

Для реализации функции добавления в друзья в PHP нужно создать таблицу в базе данных, где будут храниться связи между пользователями. Например, таблица «friends» с полями «user_id» и «friend_id». Когда один пользователь добавляет другого в друзья, создается запись в этой таблице. Также нужно обеспечить проверку на наличие уже существующей связи и запретить повторные добавления. Порядок действий: при запросе на добавление в друзья, проверяем, есть ли уже такая запись в базе данных. Если нет, добавляем её, если да — возвращаем ошибку.

Как предотвратить добавление в друзья самого себя на сайте?

Чтобы избежать добавления самого себя в друзья, нужно при отправке запроса на добавление проверить, совпадают ли ID пользователя, который отправляет запрос, и ID пользователя, которого он пытается добавить. Если эти значения совпадают, то запрос не выполняется. Пример кода для такой проверки: `if ($user_id == $friend_id) { echo ‘Нельзя добавить самого себя’; }`.

Можно ли сделать систему подтверждения добавления в друзья?

Да, можно добавить систему подтверждения. Например, в таблице «friends» можно добавить поле «status», которое будет хранить состояние запроса: «pending» (ожидает подтверждения), «accepted» (друзья) или «declined» (отклонено). Когда один пользователь отправляет запрос на добавление, его статус будет «pending». Получатель запроса может принять или отклонить его. После принятия статус изменится на «accepted», и они станут друзьями.

Как отображать список друзей пользователя на сайте?

Для отображения списка друзей можно использовать SQL-запрос, который будет вытаскивать все записи из таблицы «friends», где пользователь является либо «user_id», либо «friend_id», в зависимости от того, с какой стороны смотрим. Затем нужно извлечь информацию о самих друзьях из таблицы пользователей. Пример запроса: `SELECT * FROM users WHERE user_id IN (SELECT friend_id FROM friends WHERE user_id = ?)` для получения списка друзей. Выводим эти данные на сайте в нужном формате.

Ссылка на основную публикацию