PDO在插入后获得整行

时间:2014-11-07 07:47:44

标签: php mysql pdo

我正在构建请求新密码功能,为此我创建了一个名为users_forgotpasscodes的单独表,其中包含3个字段user_idcoderequested。代码将发送到用户的电子邮件,有效期为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不是主键,它只是一个普通索引,因为一个用户可以发送多个这种性质的请求,我希望能够跟踪它们。

1 个答案:

答案 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;