2014-11-07 2 views
0

Я создаю запрос нового пароля, и для этой цели я создал отдельную таблицу под названием users_forgotpasscodes, которая состоит из 3 полей user_id, code и requested. Коды будут отправляться на электронные письма пользователей и будут действительны 1 день. Я решил пойти с отдельной таблицей вместо создания дополнительного столбца в моей таблице пользователей, потому что я предполагаю, что очень мало пользователей будет использовать эту функцию, поэтому нет смысла, чтобы все пользователи имели атрибут, который они, вероятно, не будут использовать ,PDO получить всю строку после вставки

Во всяком случае, что я наткнулся, когда пользователь переходит к «забыл пароль» страницу и вводит его адрес электронной почты, это то, что происходит

self::$db->prepare("INSERT INTO users_forgotpasscodes (id, code, requested) VALUES ((SELECT id FROM users WHERE email = ?), '{$code}', NOW())")->execute([$data['email']]) 

Проблема заключается в том, что я дальше в этом коде мне нужно идентификатор пользователя, чтобы можно было точно их перемещать из своего почтового ящика на нужную страницу, чтобы создать новый пароль.

Мой вопрос: могу ли я получить всю строку, которую я вставил, не делая другого запроса выбора?

Сложная часть заключается в том, что я не могу использовать lastInsertId(), потому что столбец id в таблице кодов не является первичным ключом, это просто обычный индекс, потому что один пользователь может отправлять несколько запросов такого характера, и я хочу иметь возможность поддерживать отслеживать их.

+1

Что вы имеете в виду 'всей row'? Вы хотите вернуть столбец «ID»? – Rahul

+0

@Rahul да, в основном, если я узнаю, как получить всю строку, я смогу получить идентификатор, я использовал этот заголовок, чтобы избежать путаницы с 'lastInsertId' и было бы легче найти, если кто-то ищет это –

ответ

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; 
+0

Просто если вы можете сэкономить мне некоторое время, так как я не очень хорошо разбираюсь в процедурах - у меня нет идентификатора, поскольку у меня есть электронное письмо, поэтому мне нужно получить идентификатор, соответствующий этому электронному письму, и сохранить его в переменной в процедура, но тогда как я могу назначить параметр out этой переменной? –

+0

Просто добавьте условие 'WHERE', например' select ID в out_parameter from some_table, где email = email_parameter'. О том, как вы называете это в PHP и сохраняете значение параметра OUT - я уверен, что у вас есть много примеров в Интернете. Я не могу помочь, потому что я понятия не имею о PHP. Ответ был вызван только тем, что вопрос связан с SQL. – Rahul

+0

Нет, я не имел в виду код процедуры. Я должен назначить id переменной, потому что мне нужно использовать ее один раз в инструкции insert, а затем вернуть ее, поэтому я предполагаю, что она будет выглядеть примерно так: @id = SELECT id FROM users WHERE email = IN_EMAIL', если это даже синтаксис для определения переменной внутри процедуры. Итак, чтобы вернуть переменную, мне нужно использовать что-то вроде 'SELECT @id INTO ret_ID'? –

Смежные вопросы