07.08.2018 05:35:17 am
Всем доброй ночи. Есть один очень старый скрипт, работающий без mysql, нашёл его на одном каталоге скриптов. Регистрация пользователя проходит успешно, пользователь вводит имя пользователя и пароль, с этим проблем нет, но когда пользователь авторизуется начинаются проблемы, скрипт постоянно выдаёт предупреждение "Неверно введён пароль.", хотя пароль введён правильно, 100%.
В качестве базы данных, скрипт использует файл с расширением db. Вот так получаем список пользователей из базы:
Всё в один массив. Дальше, при помощи цикла foreach проходим по списку и ищем нужное имя пользователя, как найдет, сравнит пароль. Пароль вводится верно, а выдаёт, что не верно:
База составляется таким образом:
Сам скрипт очень понравился и не хотелось бы выбрасывать его, а хочется исправить.
В качестве базы данных, скрипт использует файл с расширением db. Вот так получаем список пользователей из базы:
$users = file('users.db');
Всё в один массив. Дальше, при помощи цикла foreach проходим по списку и ищем нужное имя пользователя, как найдет, сравнит пароль. Пароль вводится верно, а выдаёт, что не верно:
foreach ($users as $user) {
$data = explode('::', $user);
if ($_POST['name'] == $data[0]) {
if ($_POST['pass'] != $data[1]) {
exit('Неверно введён пароль.');
}
else {
login($data[0], $data[1]);
}
}
}
exit('Пользователь не найден.');
База составляется таким образом:
User1::password1
User2::password2
User3::password3
Сам скрипт очень понравился и не хотелось бы выбрасывать его, а хочется исправить.
- Жалоба
07.08.2018 01:11:31 pm
Пароль верный, а ошибка выходит, скорее всего, из-за того, что в конце пароля присутствует перенос на новую строку. Как сказано на официальном сайте: http://php.net/manual/ru/function.file.php, чтобы не было переносов в элементах массива, используйте флаг: FILE_IGNORE_NEW_LINES - Пропускать новую строку в конце каждого элемента массива:
Может проблема в другом месте, но другого места я не вижу в Вашем коде.
$users = file('users.db', FILE_IGNORE_NEW_LINES);
Может проблема в другом месте, но другого места я не вижу в Вашем коде.
02.02.2020 12:39:16 pm
По коду видно, что функция
Тут она сработает, если пароль неверный. Если все пароли совпадают, то последняя строка кода:
Остановит сценарий. Чтобы этого не произошло, необходимо последнюю строку упаковать в условие, например, так:
И будет правильнее вставить это условие, сразу после получения данных:
exit
в любом случае выполнит свое предназначение. Первый случай: if ($_POST['pass'] != $data[1]) {
exit('Неверно введён пароль.');
}
Тут она сработает, если пароль неверный. Если все пароли совпадают, то последняя строка кода:
exit('Пользователь не найден.');
Остановит сценарий. Чтобы этого не произошло, необходимо последнюю строку упаковать в условие, например, так:
if (empty($users))
{
exit('Пользователь не найден.');
}
И будет правильнее вставить это условие, сразу после получения данных:
$users = file('users.db', FILE_IGNORE_NEW_LINES);