我正在构建请求新密码功能,为此我创建了一个名为users_forgotpasscodes
的单独表,其中包含3个字段user_id
,code
和requested
。代码将发送到用户的电子邮件,有效期为1天。我决定使用单独的表,而不是在我的用户表中创建一个额外的列,因为我认为只有极少量的用户将使用此功能,因此让所有用户都具有他们可能不会使用的属性是没有意义的
无论如何我偶然发现的是当用户进入“忘记我的密码”页面并输入他的电子邮件地址时,会发生这种情况
self::$db->prepare("INSERT INTO users_forgotpasscodes (id, code, requested) VALUES ((SELECT id FROM users WHERE email = ?), '{$code}', NOW())")->execute([$data['email']])
问题在于我在这段代码中需要用户的ID,以便能够准确地将它们从收件箱导航到正确的页面以创建新密码。
我的问题是,我是否可以在不进行其他选择查询的情况下检索已插入的整行?
棘手的部分是我不能使用lastInsertId()
,因为代码表中的列id
不是主键,它只是一个普通索引,因为一个用户可以发送多个这种性质的请求,我希望能够跟踪它们。
答案 0 :(得分:2)
不完全确定,但是根据您的评论,您似乎只想返回上一个插入行的ID
列(不是auto_increment
字段)。
在这种情况下,通过存储过程执行INSERT
操作,并使用OUTPUT
参数来获取插入的ID
值。然后您可以在应用程序代码的任何位置使用相同的内容
DELIMITER $$
CREATE PROCEDURE sp_Insert(
IN col1 VARCHAR(25),
IN col2 VARCHAR(10),
IN email VARCHAR(30),
OUT ret_ID INT)
BEGIN
INSERT INTO your_table(ID,col1,col2) VALUES(ID,col1,col2);
SELECT ID INTO ret_ID FROM your_table where Email = email; <-- assign here
END$$
DELIMITER ;
然后从应用程序代码调用您的过程并获取ret_ID
CALL sp_Insert(1, 'blah', 'blah blah', @ret);
SELECT @ret;