Как в 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-инъекций.


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

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