Mysql 创建触发器和存储过程,当用户通过身份验证时更新Datetime
我用PHP和MySQL创建了一个登录系统,为用户提供了下表: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`
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}谢谢你们的回答。在您的帮助下,我想出了以下解决方案:DELIMITER//CREATE TRIGGER update\u authenticated\u at BEFORE update ON users FOR Every ROW开始,如果是OLD.authenticated NEW.authenticated,则设置NEW.authenticated\u at=CURRENT\u时间戳;如果结束;结束//分隔符;我试着用“在更新当前\u时间戳时,但每次更新列时,它都会将已验证的\u更改为当前日期。我需要它更新只有当授权成为1。哦,你是正确的!!!我会更新触发器的!从技术上讲,它永远不会被设置回0,但如果它被设置回0呢。非常感谢。更简单的方法是在更新当前时间戳时使用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}谢谢你们的回答。在您的帮助下,我想出了以下解决方案:DELIMITER//CREATE TRIGGER update\u authenticated\u at BEFORE update ON users FOR Every ROW开始,如果是OLD.authenticated NEW.authenticated,则设置NEW.authenticated\u at=CURRENT\u时间戳;如果结束;结束//分隔符;我试着用“在更新当前\u时间戳时,但每次更新列时,它都会将已验证的\u更改为当前日期。我需要它更新只有当授权成为1。哦,你是正确的!!!我会更新触发器的!从技术上讲,它永远不会被设置回0,但如果它被设置回0呢。谢谢大家!<代码>更新用户集Authenticated=1,其中ID={$ID}
看起来易于SQL注入。UPDATE users SET Authenticated=1,其中ID={$ID}代码>看起来容易被SQL注入。