Если в поля "логин" или "e-mail" пользователь вводит уже существующие логин и e-mail, то в этих полях должен появляться выпадающий список из 5 сгенерированных логинов и e-mail-ов.
Пусть это будут те же эл.адреса/логины, но инкрементированные, например был: [email protected], а в выпадающем списке появлялись: [email protected], [email protected]..., [email protected].
(Тут еще вопрос, если к логину можно просто добавить 1,2,3, то как добавить цифры в e-mail именно перед "@". Полагаю тут нужно использовать регулярные выражения).
Данные о пользователях находятся в бд phpmyadmin.
Важно, чтобы это работало в linux debian версии: 7.8 и на php версии: 5.6.33
У меня есть версия, где это вроде бы должно работать, но у меня перезагружается страница и вылазит ошибка, которую видимо выдает phpmyadmin. Вот она:
Моя текущая регистрация:
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
<?php function Salt() { $i; $salt = ''; for ($i = 1; $i <= 2; $i++) { $rnd = (int)(rand(75) + 48); if (($rnd > 57) && ($rnd < 65)) { $rnd = 65; } elseif (($rnd > 90) && ($rnd < 97)) { $rnd = 97; } $salt .= chr($rnd); } return $salt; } if (isset($_POST['FirstName'])) { $firstName = $_POST['FirstName']; $mail = $_POST['mail']; $login = $_POST['login']; $pass = $_POST['passwd']; $rePass = $_POST['rePasswd']; if (!(bool)strlen($firstName) || !(bool)strlen($mail) || !(bool)strlen($login) || !(bool)strlen($pass) || !(bool)strlen($rePass)) { echo "<p class='error'>Заполните все поля.</p>"; include 'registration.php'; exit; } if (strcmp($pass, $rePass) !== 0) { echo "<p class='error'>Пароли не совпадают.</p>"; include 'registration.php'; exit; } if (!filter_var($mail, FILTER_VALIDATE_EMAIL)){ echo "<p class='error'>E-mail '$mail' указан неверно!</p>"; include 'registration.php'; exit; } $salt = Salt(); $cryptPasswd = crypt($pass, $salt); $dben = 0; $link_id = mysql_connect('localhost', 'root', 'вуишфт'); if ($link_id) { if (mysql_select_db('computerWorld', $link_id)) { $dben = 1; } else { $dben = -1; echo "<p class='error'>Ошибка выбора БД.</p>"; exit; } } else { echo "<p class='error'>Ошибка подключения.</p>"; exit; } mysql_query("SET NAMES 'utf8';"); mysql_query("SET CHARSET 'utf8';"); mysql_query("SET SESSION collation_connection='utf_general_ci'"); $qs = "INSERT INTO `person` (`userName`, `e-mail`, `login`, `password`) ". "VALUES ('".$firstName."', '".$mail."', '".$login."', '".$cryptPasswd."');"; $qi = mysql_query($qs, $link_id); if (!$qi) { echo "<p class='error'>Ошибка добавления пользователя.</p>"; exit("<p class='error'>".mysql_error()."</p>"); } else { echo "<h2>Пользователь добавлен.</h2>"; echo "<p class='success'>Имя - ".$firstName."</p>"; echo "<p class='success'>Почта - ".$mail."</p>"; echo "<form action='index.html'><button type='submit'>Вернуться на главную</button></form>"; mail($mail, "Регистрация", "Добро пожаловать!\nВаше имя: ".$firstName."\nВаш логин: ".$login."\nВаш пароль: ".$pass); mysql_close(); } } ?> |
А это форма регистрации:
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 56 |
<style> #authorization { display: none; } </style> <form id="myForm" method="POST"> <fieldset> <table class="table" WIDTH="350"> <tr> <td colspan = 2 align = center class = title_table><legend>Форма регистрации</legend></td> </tr> <tr> <td class = cols><label for="FirstName">Имя пользователя</label></td> <td><input type="text" id="FirstName" name="FirstName" required minlength="3" required maxlength="30" placeholder="Введите от 3 символов"></td> </tr> <tr> <td class = cols><label for="mail">Адрес электронной почты</label></td> <td><input type="text" id="mail" name="mail" placeholder="Введите e-mail"></td> </tr> <tr> <td class = cols><label for="login">Логин</label></td> <td><input type="text" id="login" name="login" required minlength="3" required maxlength="30" placeholder="Введите от 3 символов"></td> </tr> <tr> <td class = cols><label for="passwd">Пароль</label></td> <td><input type="password" id="passwd" name="passwd" required minlength="4" required maxlength="30" placeholder="Введите от 4 символов"></td> </tr> <tr> <td class = cols><label for="rePasswd">Подтвердите пароля</label></td> <td><input type="password" id="rePasswd" name="rePasswd" placeholder="Введите пароль повторно"></td> </tr> </fieldset> <div class="buttons"> <tr> <td class="bottom_table" align="center"><input type="submit" name="register" value="Отправить"></td> <td class="bottom_table" align="center"><input type="reset" value="Очистить"></td> </tr> </div> </table> </form> <script> $(document).ready(function () { $("#myForm").submit(function (e) { e.preventDefault(); var form_data = $("#myForm").serialize(); $.ajax({ type: "POST", url: "reg.php", data: form_data, success: function(html) { $("main").html(html); } }); }); }); </script> |
@dima Давайте по порядку:
Как добавить к email инкримент, то не обязательно использовать регулярные выражения и Вы можете разделить по @, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $email = '[email protected]'; // Разделяем по @ $emailExploded = explode('@', $email); for ($i = 0; $i <= 5; ++$i) { echo $emailExploded[0].$i.'@'.$emailExploded[1].PHP_EOL; } // Результат //[email protected] //[email protected] //[email protected] //[email protected] //[email protected] //[email protected] |
Единственное я думаю Вам нужно сделать проверку, а нет уже существующего такой почты в базе, возможно почту [email protected] кто то уже использует?
Да, эта ошибка базы данных и говорит, что такой login_unique значение уже есть в базе.
Вы его я так понимаю даже не передаете в Insert это поле, попробуйте заменить вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $qs = "INSERT INTO `person` (`userName`, `login_unique`, `e-mail`, `login`, `password`) " . "VALUES ('" . $firstName . "', '" . $login . "', '" . $mail . "', '" . $login . "', '" . $cryptPasswd . "');"; $qi = mysql_query($qs, $link_id); if (!$qi) { echo "<p class='error'>Ошибка добавления пользователя.</p>"; exit("<p class='error'>" . mysql_error() . "</p>"); } else { echo "<h2>Пользователь добавлен.</h2>"; echo "<p class='success'>Имя - " . $firstName . "</p>"; echo "<p class='success'>Почта - " . $mail . "</p>"; echo "<form action='index.html'><button type='submit'>Вернуться на главную</button></form>"; mail($mail, "Регистрация", "Добро пожаловать!\nВаше имя: " . $firstName . "\nВаш логин: " . $login . "\nВаш пароль: " . $pass); mysql_close(); } |
Еще рекомендую использовать подготовленные запросы(https://www.php.net/manual/ru/pdo.prepare) или использовать mysqli_real_escape_string функцию https://www.php.net/manual/ru/mysqli.real-escape-string.php.
Также в коде я вижу Вы еще используете mysql вместо mysqli.
kenya: @dima Единственное я думаю Вам нужно сделать проверку, а нет уже существующего такой почты в базе, возможно почту [email protected] кто то уже использует?
Ну пока что эта проверка опять же произойдет на стороне БД. А вот как решить это дальше?
Конечно я не передаю его в insert. У меня в принципе и не было такого столбца в БД. И не должно его там быть.
Еще рекомендую использовать подготовленные запросы(https://www.php.net/manual/ru/pdo.prepare) или использовать mysqli_real_escape_string функцию https://www.php.net/manual/ru/mysqli.real-escape-string.php.Также в коде я вижу Вы еще используете mysql вместо mysqli.
Я использую mysql вместо mysqli в связи с конкретными условиями данной мне среды. И в целом прошу помощи из-за этого.
@kenya
@dima Просто ошибка, которая у Вас повляется говорит, что запись в колонке не уникальна. Скорее всего на какой то колонке добавлен уникальный ключ `login_unique` допускаю что на колонке login.
Тогда вариант перед тем как делать INSERT, вам нужно проверить есть ли такой логин уже в базе данных. То есть перед вот этой строчкой:
1 2 3 4 5 |
<?php $qs = "INSERT INTO `person` (`userName`, `e-mail`, `login`, `password`) ". "VALUES ('".$firstName."', '".$mail."', '".$login."', '".$cryptPasswd."');"; $qi = mysql_query($qs, $link_id); |
Должна быть проверка что $login переменная уникальна, примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $result = mysql_query("SELECT * FROM `person` WHERE `login`='" . $login . "'"); if (mysql_num_rows($result) > 0) { $qs = "INSERT INTO `person` (`userName`, `e-mail`, `login`, `password`) " . "VALUES ('" . $firstName . "', '" . $mail . "', '" . $login . "', '" . $cryptPasswd . "');"; $qi = mysql_query($qs, $link_id); // ... } else { // Показать ошибку валидации или попросить ввести уникальное } |