#php #mysql #mysqli #passwords
#php #mysql #mysqli #пароли
Вопрос:
Я пытаюсь запустить password_hash
текущие password
значения в моей базе данных…
$mysqli->query("UPDATE users SET password = '" . password_hash('password', PASSWORD_DEFAULT) . "');
Я не получаю ошибки, но пароль не работает после обновления, как ожидалось. Единственное, о чем я могу думать, это то, что приведенный выше запрос не получает текущее значение пароля из таблицы.
Нет необходимости в подготовленных операторах, поскольку я просто копаюсь локально для этого.
Комментарии:
1. запрос не получает текущее значение пароля из таблицы Нет, как бы он получил пароль из таблицы, запустил его через функцию PHP, а затем вставил его в БД?
2. Вероятно, запустите SELECT для идентификатора и пароля, затем выполните цикл, хэш и ОБНОВИТЕ пароль по идентификатору.
3. Вы не можете смешивать PHP и SQL подобным образом.
password_hash
это функция PHP. Вам нужно извлечь данные в PHP, обработать их, а затем снова сохранить в MySQL. Прямо сейчас вы меняете все пароли на строкуpassword
Ответ №1:
Вы не можете смешивать PHP и SQL подобным образом. password_hash
это функция PHP. Вам нужно извлечь пользовательские данные в PHP, выполнить итерацию по ним и сохранить каждую запись в базе данных. При этом используйте транзакции SQL.
// Remember to always enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
$users = $mysqli->query('SELECT Id, password FROM users');
// start transaction and prepare a statement
$mysqli->begin_transaction();
$stmt = $mysqli->prepare('UPDATE users SET `password`=? WHERE Id=?');
foreach ($users as $user) {
// make a hash out of the password
$hash = password_hash($user['password'], PASSWORD_DEFAULT);
$stmt->bind_param('ss', $hash, $user['Id']);
$stmt->execute();
}
// commit the data to DB and end transaction
$mysqli->commit();
Всегда используйте подготовленные инструкции. Нет абсолютно никаких оправданий, чтобы не использовать привязку параметров! Если бы вы использовали привязку параметров с самого начала, вы бы гораздо быстрее заметили, что ваш подход ошибочен. Теперь вы изменили все пароли на строку password
; у каждой учетной записи один и тот же пароль.