Как сделать, чтобы код подтверждения истек, когда ему исполнилось 1 день - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь сделать так, чтобы срок действия кода подтверждения истек, когда дата выигрыша устарела, а затем 1 день в таблице победителей mysql.Мой php-код работает нормально и устанавливает для параметра translation_status значение «expired», но когда существует более 1 строки с одинаковым идентификатором id_recharge_winner, скрипт переводит все эти строки в «expired».Я хотел бы, чтобы только старые были исключены.

Помогите мне, пожалуйста

Мои победители стола таковы:

|id_recharge_winner |confirmation_code |confirmation_status| date_confirmation |date_win|
-------------------------------------------------------------------------------------------
1                   |8eomdv          | not confirmed       |NULL      |2019-01-20 23:58:41
1                   |ioozpu          | not confirmed       |NULL      |2019-02-02 09:57:10
1                   |cpq2vp          | not confirmed       |NULL      |2019-01-26 01:05:18
2                   |tnymsp          | not confirmed       |NULL      |2019-02-02 01:09:54
2                   |qh8lqq          | not confirmed       |NULL      |2019-02-02 06:14:37
2                   |jgg3xi          | not confirmed       |NULL      |2019-01-26 01:22:40
3                   |cukxc5          | expired             |NULL      |2019-01-26 01:33:11
4                   |3ixoj4          | not confirmed       |NULL      |2019-01-26 01:43:42
5                   |20bqrn          | not confirmed       |NULL      |2019-01-26 11:18:16
6                   |lebx61          | not confirmed       |NULL      |2019-02-02 12:40:27
6                   |7tgoaz          | not confirmed       |NULL      |2019-01-26 12:42:41
6                   |kphs5k          | not confirmed       |NULL      |2019-01-26 12:51:33
6                   |6vxcy9          | not confirmed       |NULL      |2019-01-26 13:07:23
7                   |sttyul          | not confirmed       |NULL      |2019-01-26 13:11:47

Мой php:

for ($i=1;$i<=7;$i++){

    //Verify if confirmation code is expired
    $sql_expired = "SELECT id_recharge_winner, date_win, date_confirmation 
                    FROM winners 
                    WHERE id_recharge_winner ='$i'";
    $result_expired = mysqli_query($conn, $sql_expired);
    if (mysqli_num_rows($result_expired) > 0) {
        while($row = mysqli_fetch_assoc($result_expired)){
            $id_recharge_winner = $row['id_recharge_winner'];
            $date_win = $row['date_win'];
            $date_confirmation = $row['date_confirmation'];
            $expiration_delay = 1; //One day
            if ((time() - $date_win) >= $expiration_delay) {
                $sql_set_expired = "UPDATE `winners` 
                                    SET `confirmation_status` = 'expired' 
                                    WHERE confirmation_status = 'not confirmed' 
                                    AND id_recharge_winner = '$id_recharge_winner'";
                $set_expired_result = mysqli_query($conn, $sql_set_expired);
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Используйте timestampdiff в предложении WHERE, чтобы выбрать только те строки, в которых разница между выигранным и текущим временем больше или равна дню.Вам не нужно обновлять таблицу и, вероятно, не следует.Всякий раз, когда вы хотите выигрыши с истекшим сроком действия, используйте что-то вроде следующего.

SELECT ...
       FROM winners
       WHERE ...
             AND timestampdiff(day, date_win, now()) >= 1
             ...
       ...;

Если вы хотите выигрыши с истекшим сроком действия, отмените условие.

SELECT ...
       FROM winners
       WHERE ...
             AND timestampdiff(day, date_win, now()) < 1
             ...
       ...;
0 голосов
/ 03 февраля 2019

Я подозреваю, что вы могли бы просто выполнить работу с помощью одного запроса, который выбирает / обновляет все соответствующие записи.

Обратите внимание:

UPDATE winners w
SET w.confirmation_status = 'expired' 
WHERE 
    w.id_recharge_winner = ?
    AND w.confirmation_status = 'not confirmed' 
    AND DATEDIFF(CURDATE(), w.date_win) > 1
    AND NOT EXISTS (
        SELECT 1
        FROM winners w1
        WHERE
            w1.id_recharge_winner = w.id_recharge_winner
            AND w1.confirmation_status = w.confirmation_status
            AND w1.date_win < w.date_win
    )

Предложение WHERE применяется к соответствующемуфильтры;если не найдено ни одной записи, UPDATE не происходит.В этом предложении также содержится условие NOT EXITS, в котором используется коррелированное условие, гарантирующее, что обновляемая запись (если таковая имеется) является самой старой (т. Е. Нет более старой записи).

PS: я заменил PHPпеременная $id_recharge_winner с параметром привязки (?);вам следует посмотреть , как использовать параметризованные запросы , чтобы сделать ваш код более безопасным и чистым.

...