Механизм работы с БД: Как реализовать добавление и удаление записи о «лайке» сервера с использованием подготовленных выражений в PHP?

Реализация механизма лайков для сервера с использованием подготовленных выражений в PHP — это стандартная задача, которая требует грамотной работы с базой данных. Рассмотрим полный цикл: структуру таблицы, добавление и удаление лайков.

## Структура таблицы

Сначала создадим таблицу для хранения лайков:

sql
CREATE TABLE server_likes (
id INT AUTO_INCREMENT PRIMARY KEY,
server_id INT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_like (server_id, user_id)
);

Уникальный ключ `(server_id, user_id)` гарантирует, что один пользователь не сможет поставить лайк одному серверу дважды.

## Подключение через PDO

php
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
} catch (PDOException $e) {
die(‘Ошибка подключения: ‘ . $e->getMessage());
}

## Добавление лайка

php
function addLike(PDO $pdo, int $serverId, int $userId): bool {
try {
$stmt = $pdo->prepare(
‘INSERT INTO server_likes (server_id, user_id) VALUES (:server_id, :user_id)’
);
$stmt->bindParam(‘:server_id’, $serverId, PDO::PARAM_INT);
$stmt->bindParam(‘:user_id’, $userId, PDO::PARAM_INT);
$stmt->execute();
return $stmt->rowCount() > 0;
} catch (PDOException $e) {
// Если лайк уже существует (нарушение UNIQUE), возвращаем false
if ($e->getCode() === ‘23000’) {
return false;
}
throw $e;
}
}

## Удаление лайка

php
function removeLike(PDO $pdo, int $serverId, int $userId): bool {
$stmt = $pdo->prepare(
‘DELETE FROM server_likes WHERE server_id = :server_id AND user_id = :user_id’
);
$stmt->bindParam(‘:server_id’, $serverId, PDO::PARAM_INT);
$stmt->bindParam(‘:user_id’, $userId, PDO::PARAM_INT);
$stmt->execute();
return $stmt->rowCount() > 0;
}

## Переключение лайка (toggle)

Часто удобнее реализовать единую функцию-переключатель:

php
function toggleLike(PDO $pdo, int $serverId, int $userId): string {
// Проверяем, существует ли лайк
$stmt = $pdo->prepare(
‘SELECT id FROM server_likes WHERE server_id = :server_id AND user_id = :user_id’
);
$stmt->execute([‘:server_id’ => $serverId, ‘:user_id’ => $userId]);

if ($stmt->fetch()) {
removeLike($pdo, $serverId, $userId);
return ‘removed’;
} else {
addLike($pdo, $serverId, $userId);
return ‘added’;
}
}

## Получение количества лайков

php
function getLikesCount(PDO $pdo, int $serverId): int {
$stmt = $pdo->prepare(
‘SELECT COUNT(*) FROM server_likes WHERE server_id = :server_id’
);
$stmt->execute([‘:server_id’ => $serverId]);
return (int) $stmt->fetchColumn();
}

## Ключевые преимущества подготовленных выражений

— **Защита от SQL-инъекций**: параметры передаются отдельно от запроса.
— **Производительность**: при многократном выполнении запрос компилируется один раз.
— **Читаемость кода**: именованные параметры (`:server_id`) делают код понятным.
— **Типизация**: `PDO::PARAM_INT` гарантирует корректный тип данных.

Такой подход обеспечивает безопасную, надёжную и масштабируемую реализацию механизма лайков в любом PHP-приложении.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.