mySQL: сравнить текущий пароль, а затем обновить его до 1 в 1 запросе? - PullRequest
0 голосов
/ 30 ноября 2011

Я пишу скрипт на PHP, чтобы позволить пользователю сменить пароль. Я заставляю их вводить свой старый пароль (даже если они уже вошли в систему), а затем новый пароль. Я пытаюсь сравнить старый пароль, а затем обновить поле до нового пароля без выполнения двух отдельных запросов, но мой код работает не так, как я ожидал. Здесь есть ошибка? Или это по какой-то причине запрещено? Что вы предлагаете?

mysql_query("UPDATE users SET userpass = '$encryptedPW' WHERE userid = '$uid' AND userpass = '$currentPW'");

Я мог видеть, выполнял ли mySQL задачи в том порядке, в котором они написаны, но он должен найти строку, прежде чем он сможет обновить это, верно?

Большое спасибо!

Билли

ETA: Извините! Опечатка!

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Как выглядит фактически сгенерированный запрос?Вы проверили, успешно ли выполнен запрос?

$result = mysql_query("UPDATE ....") or die(mysql_error());
if (mysql_affected_rows() != 1) {
   die("Failed to change password");
}

Часть or die() будет обрабатывать любые синтаксические ошибки sql, тогда как disabled_rows проверит, обновилось ли что-то.Если количество затронутых строк не равно 1 (при условии, что вы не разрешаете дублирование пар имени пользователя и пароля), значит, что-то работает неправильно.0 = нет затронутых строк, без изменений.> 1 = у вас есть дубликаты пар пользователей и паролей.

Также убедитесь, что вы сравниваете яблоки с яблоками.Если вы храните пароли в зашифрованном / хешированном виде, вам придется сравнить хешированные / зашифрованные пароли, чтобы результаты имели смысл.

... WHERE password='letmein'

потерпит неудачу, если пароль действительно будет храниться как зашифрованныйбинарный мусор.

0 голосов
/ 30 ноября 2011

У вас есть правильная идея, но я бы не советовал (из соображений безопасности) использовать mysql_query() с нефильтрованным вводом.Я бы предпочел, чтобы вы использовали подготовленный оператор.

Однако из приведенного выше запроса кажется, что у вас есть два разных столбца, user_pass и userpass.Это может быть источником ваших проблем на данный момент.

0 голосов
/ 30 ноября 2011

из вашего кода я вижу, что вы используете зашифрованные пароли. Убедитесь, что вы зашифровали оба пароля. Кроме того, в вашем запросе есть userpass и user_pass. Это два «разных» столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...