Регистрация с выпадающим списком логинов и электронных адресов, если такие существуют.

D

Пользователь

от dima , в категории: PHP , 3 года назад

Если в поля "логин" или "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>
Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от kenya , 3 года назад

@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.

D

Пользователь

от dima , 3 года назад
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 

Пользователь

от kenya , 3 года назад

@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 {
    // Показать ошибку валидации или попросить ввести уникальное
}