Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 创建触发器和存储过程,当用户通过身份验证时更新Datetime_Mysql_Stored Procedures - Fatal编程技术网

Mysql 创建触发器和存储过程,当用户通过身份验证时更新Datetime

Mysql 创建触发器和存储过程,当用户通过身份验证时更新Datetime,mysql,stored-procedures,Mysql,Stored Procedures,我用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`

我用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;
当用户注册时,将在表users中插入一个用户,其
Authenticated=0
。一、 作为管理员,必须使用以下方法对用户进行身份验证:

UPDATE users SET Authenticated = 1 WHERE ID = {$id};
我想知道的是如何创建一个触发器和一个存储过程,在前面提到的
UPDATE
查询之后,将
Authenticated_At
列更新为当前日期和时间

提前感谢。

1)最简单的解决方案:

UPDATE users SET Authenticated = 1, Authenticated_At = NOW() WHERE ID = {$id};
2) 另一种解决方案是为时间戳值设置
默认值。这在表定义中实现,如:

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;
发件人:

当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为其当前值,则自动更新的列将保持不变。要防止自动更新的列在其他列更改时更新,请显式将其设置为当前值。要更新自动更新的列,即使其他列没有更改,也要显式地将其设置为应有的值(例如,将其设置为当前_TIMESTAMP)

为了在每次更新记录(而不是更新在
创建的
时)时自动更新
处的
已验证时间戳,您需要:

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
1) 最简单的解决方案:

UPDATE users SET Authenticated = 1, Authenticated_At = NOW() WHERE ID = {$id};
2) 另一种解决方案是为时间戳值设置
默认值。这在表定义中实现,如:

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;
发件人:

当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为其当前值,则自动更新的列将保持不变。要防止自动更新的列在其他列更改时更新,请显式将其设置为当前值。要更新自动更新的列,即使其他列没有更改,也要显式地将其设置为应有的值(例如,将其设置为当前_TIMESTAMP)

为了在每次更新记录(而不是更新在
创建的
时)时自动更新
处的
已验证时间戳,您需要:

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

更简单的方法是在更新当前时间戳时使用
Authenticated\u-At-datetime DEFAULT CURRENT\u-TIMESTAMP,然后在执行时自动更新Authenticated\u-At-UPDATE users SET Authenticated=1,其中ID={$ID};`(记住这里的SQL注入)@RaymondNijland:是的,你是对的,这要简单得多。。。我更新了我的答案。谢谢你的检查!为了在每次更新记录时自动更新已验证的时间戳(而不是更新已创建的时间戳),您需要:“除了
updateusers SET Authenticated=1,Created_At=Created_At,其中ID={$ID}
应该或多或少类似于
updateusers SET Authenticated=1,Authenticated_At=NOW(),其中ID={$ID}Authenticated\u-At-datetime DEFAULT CURRENT\u-TIMESTAMP,然后在执行时自动更新Authenticated\u-At-UPDATE users SET Authenticated=1,其中ID={$ID};`(记住这里的SQL注入)@RaymondNijland:是的,你是对的,这要简单得多。。。我更新了我的答案。谢谢你的检查!为了在每次更新记录时自动更新已验证的时间戳(而不是更新已创建的时间戳),您需要:“除了
updateusers SET Authenticated=1,Created_At=Created_At,其中ID={$ID}
应该或多或少类似于
updateusers SET Authenticated=1,Authenticated_At=NOW(),其中ID={$ID}更新用户集Authenticated=1,其中ID={$ID}
看起来易于SQL注入。
UPDATE users SET Authenticated=1,其中ID={$ID}看起来容易被SQL注入。