Удаление аккаунтов функционирует корректно?

Правильно ли работает код, представленный ниже, и содержит ли он ошибки? Этот код был создан нейросетью по запросу. <br/> Он предназначен для удаления аккаунтов пользователей, которые не входили в систему в течение 30 дней, а также для отправки уведомлений на email пользователям, если до удаления аккаунта осталось 7 дней. <br/> <br/> <pre><code class="php">&lt;?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-&gt;prepare("SELECT id, email, last_login FROM users WHERE last_login &lt; :thirtyDaysAgo");

$stmt-&gt;execute(['thirtyDaysAgo' =&gt; $thirtyDaysAgo]);

$inactiveUsers = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);

foreach ($inactiveUsers as $user) {

    $daysUntilDeletion = floor((strtotime($thirtyDaysAgo) - strtotime($user['last_login'])) / (60 * 60 * 24));

    // Если до удаления осталось 7 дней или меньше, отправляем уведомление

    if ($daysUntilDeletion &lt;= 7) {

        $subject = "Ваш аккаунт будет удален через $daysUntilDeletion дней";

        $message = "Пожалуйста, войдите в систему, чтобы сохранить аккаунт.";

        mail($user['email'], $subject, $message);

    }

    // Удаляем аккаунт, если прошло 30 дней

    if ($daysUntilDeletion &gt;= 30) {

        $stmt = $pdo-&gt;prepare("DELETE FROM users WHERE id = :userId");

        $stmt-&gt;execute(['userId' =&gt; $user['id']]);

    }

}

?&gt;</code></pre>
  • 25 января 2025 г. 16:24
Ответы на вопрос 1
Ваш код содержит несколько ошибок и недостатков, которые необходимо исправить. Проанализируем его по частям:

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 дней.
- Убедитесь, что ваша система настроена для отправки электронной почты.
Похожие вопросы