Ваш код содержит несколько ошибок и недостатков, которые необходимо исправить. Проанализируем его по частям:
1. **Работа с датами и разницей в днях**: Переменная `$daysUntilDeletion` неправильно вычисляет, сколько дней осталось до удаления. Она использует `last_login`, что приводит к неправильным результатам. Для корректного определения оставшихся дней до удаления нужно использовать разницу между текущей датой и датой, когда аккаунт будет удалён (т.е. текущая дата по сравнению с датой 30 дней назад).
2. **Использование оператора `<` и `>`**: В коде вы используете неполные условия для проверки, что может привести к логическим ошибкам. Например, в вашем цикле `if ($daysUntilDeletion >= 30)` не будет работать так, как вы ожидаете, поскольку условие будет всегда истинным для пользователей, у которых последний вход был более 30 дней назад. Я рекомендую использовать время удаления вместо разницы дней.
3. **Отправка почты**: Функция `mail()` в PHP требует дополнительной настройки сервера. Убедитесь, что ваша среда может отправлять почту, прежде чем полагаться на этот функционал.
Вот исправленная версия кода:
```php
<?php
// Подключение к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
// Получаем текущую дату и дату 30 дней назад
$currentDate = date('Y-m-d H:i:s');
$thirtyDaysAgo = date('Y-m-d H:i:s', strtotime('-30 days'));
// Выбираем пользователей, которые не заходили более 30 дней
$stmt = $pdo->prepare("SELECT id, email, last_login FROM users WHERE last_login < :thirtyDaysAgo");
$stmt->execute(['thirtyDaysAgo' => $thirtyDaysAgo]);
$inactiveUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($inactiveUsers as $user) {
// Вычисляем разницу между текущей датой и последним входом
$daysSinceLastLogin = floor((strtotime($currentDate) - strtotime($user['last_login'])) / (60 * 60 * 24));
// Если до удаления осталось 7 дней или меньше, отправляем уведомление
if ($daysSinceLastLogin >= 23 && $daysSinceLastLogin < 30) {
$daysUntilDeletion = 30 - $daysSinceLastLogin;
$subject = "Ваш аккаунт будет удален через $daysUntilDeletion дней";
$message = "Пожалуйста, войдите в систему, чтобы сохранить аккаунт.";
mail($user['email'], $subject, $message);
}
// Удаляем аккаунт, если прошло 30 дней
if ($daysSinceLastLogin >= 30) {
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :userId");
$stmt->execute(['userId' => $user['id']]);
}
}
?>
```
### Краткие изменения и рекомендации:
- Изменён расчет количества дней с момента последнего входа.
- Логика отправки уведомлений теперь проверяет, сколько дней осталось до удаления с момента последнего входа.
- Код сейчас контролирует уведомления правильным образом, когда до удаления остается от 23 до 30 дней.
- Убедитесь, что ваша система настроена для отправки электронной почты.