У меня есть следующий код:
$result = mysqli_prepare($con, "select pass from signin where domain = ? and username = ? for update");
//Check if record is available
//Do some checking here that pass is correct
//Then I need a new hash for the password so I use (after making the new hash)
$resultnew = mysqli_prepare($con, "update signin set pass = ? where domain = ? and username = ?");
Так что все работает здесь хорошо!
Но что мне не нравится, так это то, что есть время, когда оператор обновления должен снова искать запись с доменом и паролем, поскольку у меня уже есть запись из первого оператора выбора.
Есть ли способ напрямую обновить проход из первого оператора выбора после выполнения проверки? Короче говоря, есть что-то вроде этого или я должен придерживаться того, что я делаю:
password = select pass from signin where domain = ? and username = ?;
//checking and making new hash
set password = $newhash
Вы должны использовать уникальный идентификатор для каждой строки вашей базы данных. Это должен быть индекс, желательно с автоматическим приращением. Пример такой таблицы:
CREATE TABLE IF NOT EXISTS `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
<other columns>
PRIMARY KEY (`ID`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Если вы возвращаете идентификатор вместе с паролем, вы можете использовать этот идентификатор, чтобы напрямую выбрать правильную строку для вашей команды UPDATE.
UPDATE signin
SET pass = ?
WHERE id = ?
Поскольку ID — ваш основной индекс, это будет очень быстро.
Других решений пока нет …