Как в PHP с использованием PDO реализовать проверку существования пользователя и получение количества его лайков к серверам в одном блоке кода?
При разработке веб-приложений на PHP часто возникает задача: одновременно проверить, существует ли пользователь в базе данных, и получить количество его лайков к серверам. Делать это двумя отдельными запросами неэффективно — лучше объединить логику в одном блоке с использованием PDO.
## Подход через LEFT JOIN и COUNT
Оптимальный способ — использовать SQL-запрос с `LEFT JOIN`, который возвращает данные пользователя и одновременно считает лайки:
php
prepare($sql);
$stmt->execute([‘:user_id’ => $userId]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$result) {
return null; // Пользователь не найден
}
return $result;
}
// Использование:
$userId = 42;
$userData = getUserWithLikesCount($pdo, $userId);
if ($userData === null) {
echo «Пользователь не существует.»;
} else {
echo «Пользователь: » . $userData[‘username’];
echo «Количество лайков к серверам: » . $userData[‘likes_count’];
}
## Почему это работает правильно
— `LEFT JOIN` гарантирует, что если у пользователя нет лайков, `COUNT(l.id)` вернёт `0`, а не `NULL`.
— Проверка существования пользователя происходит неявно: если `fetch()` возвращает `false`, значит запись не найдена.
— Один запрос вместо двух снижает нагрузку на базу данных.
## Альтернатива: подзапрос
Если структура таблиц сложная, можно использовать подзапрос:
php
$sql = »
SELECT
u.id,
u.username,
(SELECT COUNT(*) FROM server_likes WHERE user_id = u.id) AS likes_count
FROM users u
WHERE u.id = :user_id
«;
## Обработка исключений PDO
Важно настроить PDO на выброс исключений при ошибках:
php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Также рекомендуется оборачивать вызов в `try-catch`:
php
try {
$userData = getUserWithLikesCount($pdo, $userId);
} catch (PDOException $e) {
error_log($e->getMessage());
echo «Ошибка при обращении к базе данных.»;
}
## Итог
Объединение проверки существования пользователя и подсчёта лайков в одном SQL-запросе через PDO — это производительный, безопасный и читаемый подход. Используйте `LEFT JOIN` для корректного подсчёта нулевых значений и `prepare/execute` для защиты от SQL-инъекций.
