Механизм работы с БД: Как реализовать добавление и удаление записи о «лайке» сервера с использованием подготовленных выражений в 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-приложении.
