Создать триггер и хранимую процедуру, которая обновляет Datetime при аутентификации пользователя - PullRequest
0 голосов
/ 08 января 2019

Я создал систему входа в PHP и MySQL, и у меня есть следующая таблица для пользователей:

CREATE TABLE `users` (
    `ID` int(11) NOT NULL,
    `Authenticated` tinyint(1) NOT NULL DEFAULT 0,
    `Name` varchar(20) NOT NULL,
    `Surname` varchar(20) NOT NULL,
    `Username` varchar(20) NOT NULL,
    `Email` varchar(255) NOT NULL,
    `Password` varchar(70) NOT NULL,
    `Created_At` datetime DEFAULT current_timestamp(),
    `Authenticated_At` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Когда пользователь регистрируется, пользователь вставляется в таблицу пользователей с помощью Authenticated = 0. Я, как администратор, должен аутентифицировать пользователя, используя:

UPDATE users SET Authenticated = 1 WHERE ID = {$id};

Я хотел бы знать, как создать триггер и хранимую процедуру, которая обновляет столбец Authenticated_At до текущих даты и времени после вышеупомянутого запроса UPDATE.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 января 2019

1) Самое простое из возможных решений:

UPDATE users SET Authenticated = 1, Authenticated_At = NOW() WHERE ID = {$id};

2) Другим решением является установка значения DEFAULT для отметки времени. Это реализовано в определении таблицы, например:

CREATE TABLE `users` (
    `ID` int(11) NOT NULL,
    `Authenticated` tinyint(1) NOT NULL DEFAULT 0,
    `Name` varchar(20) NOT NULL,
    `Surname` varchar(20) NOT NULL,
    `Username` varchar(20) NOT NULL,
    `Email` varchar(255) NOT NULL,
    `Password` varchar(70) NOT NULL,
    `Created_At` datetime DEFAULT current_timestamp(),
    `Authenticated_At` datetime DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

С документация :

Автообновляемый столбец автоматически обновляется до текущей отметки времени, когда значение любого другого столбца в строке изменяется от его текущего значения. Автообновляемый столбец остается неизменным, если для всех остальных столбцов установлены текущие значения. Чтобы предотвратить автоматическое обновление столбца при изменении других столбцов, явно установите для него текущее значение. Чтобы обновить автоматически обновляемый столбец, даже если другие столбцы не изменяются, явно установите для него значение, которое должно иметь (например, установите для него CURRENT_TIMESTAMP).

Чтобы метка времени Authenticated_At автоматически обновлялась при каждом обновлении записи (без обновления Created_At), необходимо:

UPDATE users SET Authenticated = 1, Created_At = Created_At WHERE ID = {$id};

3) Как мудро прокомментировал @Raymond Nijland, лучшее решение - определить столбец метки времени, который будет обновляться только при UPDATE операциях, например:

`Authenticated_At` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...