Регистрация с проверкой логина на уникальность
Привет. Я совсем пень, знаю. Ну, не могу я решить поставленную передо мной задачу. Всякое пробовал уже. Очень надеюсь на вашу помощь, добрые люди.
Есть убогая форма регистрации, а данные с нее сохраняются в текстовый файл. Кусок кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
html> head> meta charset="utf-8" /> title>. title> $d = $_POST['surname'].' '.$_POST['name'].' '.$_POST['patr'].' '.$_POST['sex'].' '.$_POST['number'].'.'.$_POST['month'].'.'.$_POST['year'].' '.$_POST['educat'].' '.$_POST['series'].'.'.$_POST['numb'].'.'.$_POST['info'].' '.$_POST['address'].' '. $_POST['tel'].' '.$_POST['email'].' '.$_POST['pass'] .' '.$_POST['reg'].PHP_EOL; $file = "users.txt"; $Saved_File = fopen($file, 'a+'); fwrite($Saved_File, $d); fclose($Saved_File); ?> style> body { background-color: #bbdbf5; background-repeat: no-repeat center top/cover; text-align: center } .colortext { color: blue; } style> head> body> br>b>Зарегистрируйся в библиотеке!b> br> br> hr> form action="" method="post"> b>Личная информацияb> br> Фамилия: input type="text" name="surname" class="colortext"> br> Имя: input type="text" name="name" class="colortext"> br> Отчество: input type="text" name="patr" class="colortext"> br> br> br>b>Данные для входаb>br> b>Логин:b> input type="text" name="login" class="colortext"> br> b>Пароль:b> input type="password" name="pass" class="colortext"> br>br> b>С правилами ознакомленb>input type=checkbox name="reg" value="yes"> br>br> input type=submit value="Регистрация"> form> body> html>
Теперь нужно чтобы при регистрации логин проверялся на уникальность (из того текстового файла, куда заносятся предыдущие юзеры). Если все ок, то регистрация проходит успешно, нет — вылетает ошибка, что такой логин существует.
Знаю, что проверку на уникальность нужно делать через sql. То есть из формы передать логин и искать эти данные в базе. если такого там нет, значит он уникальный.
Но я не могу этого сделать. Не выходит. Буду ОЧЕНЬ благодарен если покажете и тыкните пальцем что как куда. Спасибо!
Как сделать проверку на Уникальность логина и почты?
Здравствуйте, вот учусь PHP, попеременно используя MySQLI, проблема состоит в том, что я создал форму для регистрации, заносит он её в бд, но мне нужно сделать проверку на уникальность и, следовательно, нужно для авторизации пользователя. Вот уже 3-й день не могу разобраться
else < echo('Пароли не совпадают');>$sql ="INSERT INTO log (login,password,email) VALUES ('$login','$password','$email')"; if ($connect->query($sql) === TRUE) < echo 'Вы успешноЗарегестрированны'; >else < die('Ой, что-то пошло не так!'); >> ?>
" placeholder="Ваш Логин" required> "placeholder="Ваша Почта" required> "placeholder="Ваш Пароль" required> "placeholder="Повторите Пароль" required> Регистрация
- Вопрос задан более трёх лет назад
- 2367 просмотров
1 комментарий
Простой 1 комментарий
Проверять надо на уник емайла, логин-то зачем проверять. обожимой. и на каждый емайл по одному логину разрешить. вот и все, все гениальное просто.
а вообще вам конечно же что-то одно для начала плотненько изучить, а то получать тут бан вам думаю будет не очень приятно.
Решения вопроса 0
Ответы на вопрос 1
Во первых, разберитесь с форматированием кода. С таким форматированием вообще никогда не разберетесь.
Традиционная ссылка для начинающих в PHP https://www.phptherightway.com/
$password = md5($password);
Традиционная ссылка по хешированию паролей php.net/manual/ru/faq.passwords.php
Так же гуглим готовые решения по аутентификации/авторизации. Пример https://cartalyst.com/manual/sentinel/2.0
Традиционная ссылка на документацию по PDO php.net/manual/ru/book.pdo.php
Не подставляйте переменные в запрос, гуглим «SQL-иньекции».
Никогда не используйте подавление ошибок («@»). Никогда не включайте необработанный пользовательский ввод в HTML и вообще в любой ответ сервера. Гуглим «XSS-иньекции».
Не ставьте ?> в конце PHP файла так как:
Если файл содержит только код PHP, предпочтительно опустить закрывающий тег в конце файла. Это помогает избежать добавления случайных символов пробела или перевода строки после закрывающего тега PHP, которые могут послужить причиной нежелательных эффектов, так как PHP начинает выводить данные в буфер при отсутствии намерения у программиста выводить какие-либо данные в этой точке скрипта.
Проверку на уникальность делается обычным SQL запросом на получение пользователя с введенным логином. Уникальность пользователя с определенным логином гарантируется уникальным индексом на уровне БД.
Основной принцип такой: сперва изучаем, узнаем как правильно, потом уже пытаемся реализовать, а не мучаемся 3 дня с двумя строчками кода.
А прежде чем задать вопрос указываем что конкретно не получилось и какая ошибка.
php регистрация пользователей, проверка уникальности значений
Делаю регистрацию пользователя для своего сайта, php учу не так давно. Данные получаю с формы -> далее проверяю их корректность, если все хорошо отправляю в БД. Это функция у меня в отельном файле я ей передаю только значения.
function regUser($v1,$v2,$v3,$v4)< $mysqli = @new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if($mysqli->connect_errno)exit('Ошибка соединения с БД'); $mysqli->set_charset('utf8'); $result = $mysqli->query("INSERT INTO `users`(`login`, `password`, `mail`, `date_reg`) VALUES ('$v1','$v2','$v3','$v4')"); $mysqli->close(); return $result; >
В БД поля логин и mail уникальные, и на сайте я хочу оповещать пользователя о том что если он ввел не уникальное значение, то что именно ему надо исправить логин или mail, подскажите как это можно сделать, у меня был вариант с разбитием запроса на части и потом смотреть что вернет query для каких данных. Если у кого есть примеры из практики и код, как лучше сегодня делать регистрацию пользователей буду очень благодарен.
Отслеживать
20.4k 3 3 золотых знака 27 27 серебряных знаков 49 49 бронзовых знаков
задан 11 апр 2020 в 9:59
Сергей Кузнецов Сергей Кузнецов
173 1 1 серебряный знак 14 14 бронзовых знаков
Неужели ни одного вопроса не возникло? 🙂 Пишите вопросы, если будут, я дополню ответ
11 апр 2020 в 13:43
В данный момент действительно нет вопросов, практически разобрался. У вас отличный подробный ответ, google дальше помогает, но спасибо, если что обязательно напишу.
11 апр 2020 в 18:23
@Ипатьев Огромное вам спасибо еще раз, все сделал. Пример кода выложил ниже, если вам не трудно возможно вы подскажите все или нет я сделал так как надо?
13 апр 2020 в 17:55
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Чтобы проверить существование пользователя, надо выполнить обычный SELECT запрос. Поэтому сначала научимся как выполнять SELECT запрос правильно.
Чтобы выполнить SELECT запрос с использованием переменных, надо сделать следующее:
- Написать запрос, в котором все переменные заменить на знаки вопроса
- Подготовить запрос к выполнению
- Привязать переменные к запросу
- Выполнить
В итоге получится такой код:
// создаем запрос SQL в котором все переменные заменены на знак вопроса $sql = "SELECT * FROM users WHERE login=?"; // подготоваливаем запрос $stmt = $conn->prepare($sql); // привязываем переменные к запросу // указывая тип для каждой переменной. для простоты всегда можно использовать тип "s" $stmt->bind_param("s", $login); // выполняем запроc $stmt->execute(); // получаем результат $result = $stmt->get_result(); // из результата получаем строку $user = $result->fetch_assoc(); // и дальше уже можем проверить, вернула БД данные или нет if ($user) < echo "OK"; >else
при таком способе у нас никогда не будет ошибок синтаксиса, не говоря уже об sql инъекциях.
что такое sql инъекция? в данном случае это дыра в заборе рядом с железными воротами. Какой бы надежной авторизация не была, если переменные пишутся прямо в запрос, а не передаются отдельно, то кто угодно сможет авторизоваться под кем угодно, даже не зная пароля — просто дописав в логин кусок SQL запроса. Или даже угнать к себе всю базу данных пользователей с логинами и паролями целиком.
То же самое касается и регистрации пользователя, или выполнения запроса INSERT:
// создаем запрос SQL в котором все переменные заменены на знак вопроса $sql = "INSERT INTO `users` (`login`, `password`, `mail`, `date_reg`) VALUES(. NOW())"; // подготоваливаем запрос $stmt = $mysqli->prepare($sql); // привязываем переменные к запросу // указывая тип для каждой переменной. для простоты всегда можно использовать тип "s" $stmt->bind_param("sss", $login, $password, $mail); // выполняем запроc $stmt->execute();
Кроме того, пароль никогда не пишется в БД в открытом виде. Пароль надо хэшировать. Чтобы даже если у нас и угонят БД, то пароли все равно остались неизвестными.
Кроме того, соединяться с БД надо только один раз, и в дальнейшем везде использовать одну и ту же переменную с созданным соединением. Сначала смотрим как правильно подключаться к mysqli
В итоге твой код может выглядеть так:
function checkUserExists($mysqli, $login, $email) < $stmt = $conn->prepare("SELECT * FROM users WHERE login=? or email=?"); $stmt->bind_param("s", $login, $email); $stmt->execute(); $result = $stmt->get_result(); return $result->fetch_assoc(); > function regUser($mysqli, $login, $password, $email) < $password = password_hash($password, PASSWORD_DEFAULT); $sql = "INSERT INTO `users` (`login`, `password`, `mail`, `date_reg`) VALUES(. NOW())"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("sss", $login, $password, $mail); $stmt->execute(); >
И дальше же используем эти функции.
> if (!$errors)
Здесь мы запрашиваем из бд пользователя, у которого либо логин, либо емейл уже есть в БД. Если пользователь находится то сравниваем значения из БД с в введенными данными и выводим сообщение. Если свопадений нет — регистрируем.
Проверка на уникальность логина и почты
Здравствуйте, вот учусь PHP, используя MySQLI, проблема состоит в том, что я создал форму для регистрации, заносит он её в бд, но мне нужно сделать проверку на уникальность и, следовательно, нужно для авторизации пользователя. Вот уже 3-й день не могу разобраться. Думал, может лучше использовать PDO, а там вообще мрак)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
require 'db.php'; $data = $_POST; if ( isset($data['do_signup']) ) { $login=($data['login']); $email=($data['email']); $password=($data['password']); $r_password=($data['r_password']); if ($password==$r_password) { $password=md5($password);} else{ echo('Пароли не совпадают');} $sql ="INSERT INTO log (login,password,email) VALUES ('$login','$password','$email')"; if ($connect->query($sql) === TRUE) { echo 'Вы успешноЗарегестрированны'; } else { die('Ой, что-то пошло не так!'); } } ?>
1 2 3 4 5 6 7 8
input type="text" name="login" value=" " placeholder="Ваш Логин" required> input type="email" name="email" value=" "placeholder="Ваша Почта" required> input type="password" name="password" value=" "placeholder="Ваш Пароль" required> input type="password" name="r_password" value=" "placeholder="Повторите Пароль" required> Регистрация
