Работа с сессиями PHP: Как подготовить SQL-запрос для обновления времени последнего входа пользователя в систему через $_SESSION[‘id’]?

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

## Подготовка окружения

Прежде всего убедитесь, что сессия запущена и идентификатор пользователя сохранён:

php
session_start();
// После успешной аутентификации:
$_SESSION[‘id’] = $user[‘id’];

## Обновление времени входа через PDO (рекомендуемый способ)

PDO — предпочтительный способ работы с базой данных в PHP, так как поддерживает подготовленные запросы, защищающие от SQL-инъекций:

php
session_start();

if (isset($_SESSION[‘id’])) {
try {
$pdo = new PDO(‘mysql:host=localhost;dbname=mydb;charset=utf8’, ‘user’, ‘password’);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare(
«UPDATE users SET last_login = NOW() WHERE id = :user_id»
);
$stmt->bindParam(‘:user_id’, $_SESSION[‘id’], PDO::PARAM_INT);
$stmt->execute();

} catch (PDOException $e) {
error_log(‘DB Error: ‘ . $e->getMessage());
}
}

## Обновление через MySQLi с подготовленными запросами

php
session_start();

if (isset($_SESSION[‘id’])) {
$mysqli = new mysqli(‘localhost’, ‘user’, ‘password’, ‘mydb’);

if (!$mysqli->connect_error) {
$stmt = $mysqli->prepare(
«UPDATE users SET last_login = NOW() WHERE id = ?»
);
$stmt->bind_param(‘i’, $_SESSION[‘id’]);
$stmt->execute();
$stmt->close();
}
$mysqli->close();
}

## Важные рекомендации

1. **Никогда не подставляйте $_SESSION[‘id’] напрямую в строку запроса** — даже данные из сессии могут быть скомпрометированы при определённых уязвимостях. Всегда используйте подготовленные запросы.

2. **Приводите тип данных**: если ID — целое число, используйте `PDO::PARAM_INT` или тип `’i’` в MySQLi. Это дополнительная защита.

3. **Структура таблицы**: убедитесь, что в таблице `users` есть колонка `last_login` типа `DATETIME` или `TIMESTAMP`:

sql
ALTER TABLE users ADD COLUMN last_login DATETIME NULL DEFAULT NULL;

4. **Логируйте ошибки**, но не выводите их пользователю — используйте `error_log()`.

5. **Проверяйте наличие сессии** через `isset($_SESSION[‘id’])` перед выполнением запроса.

## Когда вызывать обновление?

Оптимальное место — сразу после успешной проверки логина и пароля, до редиректа на защищённую страницу. Это гарантирует, что время фиксируется только при реальном входе, а не при каждом запросе.


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

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