Расширить систему регистрации php

0

У меня есть следующая таблица в базе данных MySQL:

CREATE TABLE IF NOT EXISTS 'accounts' (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'username' varchar(50) NOT NULL,
    'password' varchar(255) NOT NULL,
    'email' varchar(100) NOT NULL,
    PRIMARY KEY ('id')
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

и система php для работы с пользователями. Я хочу добавить новое поле в форму регистрации, например, список выбора: начальный, средний, продвинутый, где пользователь может выбрать статус в момент заполнения формы регистрации. Как я могу обработать этот новый список выбора на основе его значений (Beginner, Intermediate, Advanced) в таблице mysql, а также в коде php. Потому что на основе опыта у меня есть страница профиля, которая будет отображать различную информацию (также на основе опыта пользователя). Это оригинальный документ: https://codeshack.io/secure-registration-system-php-mysql/

<form action="register.php" method="post" autocomplete="off">
                        <div class="form-group input-group">
                                <select class="form-control" name="invest">
                                    <option selected="">Investor Experience Level</option>
                                    <option>Beginner</option>
                                    <option>Intermediate</option>
                                    <option>Advanced</option>
                                </select>
                            </div> <!-- form-group end.// -->
                    <label for="username">
                        <i class="fas fa-user"></i>
                    </label>
                    <input type="text" name="username" placeholder="Username" id="username" required>
                    <label for="password">
                        <i class="fas fa-lock"></i>
                    </label>
                    <input type="password" name="password" placeholder="Password" id="password" required>
                    <label for="email">
                        <i class="fas fa-envelope"></i>
                    </label>
                    <input type="email" name="email" placeholder="Email" id="email" required>
                    <p>Already have an account? <a href="login.html">Login here</a>.</p>
                    <input type="submit" value="Register">
                </form>
<?php
// Change this to your connection info.
$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '';
$DATABASE_NAME = 'phplogindb';
// Try and connect using the info above.
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {
    // If there is an error with the connection, stop the script and display the error.
    die ('Failed to connect to MySQL: ' . mysqli_connect_error());
}

// Now we check if the data was submitted, isset() function will check if the data exists.
if (!isset($_POST['username'], $_POST['password'], $_POST['email'])) {
    // Could not get the data that should have been sent.
    die ('Please complete the registration form!');
}
// Make sure the submitted registration values are not empty.
if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['email'])) {
    // One or more values are empty.
    die ('Please complete the registration form');
}

// We need to check if the account with that username exists.
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {

    if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    die ('Email is not valid!');
    }

    if (preg_match('/[A-Za-z0-9]+/', $_POST['username']) == 0) {
    die ('Username is not valid!');
    }

    if (strlen($_POST['password']) > 20 || strlen($_POST['password']) < 5) {
    die ('Password must be between 5 and 20 characters long!');
    }

    // Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.
    $stmt->bind_param('s', $_POST['username']);
    $stmt->execute();
    $stmt->store_result();
    // Store the result so we can check if the account exists in the database.
    if ($stmt->num_rows > 0) {
        // Username already exists
        echo 'Username exists, please choose another!';
    } else {
        // Username doesnt exists, insert new account
    if ($stmt = $con->prepare('INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)')) {
        // We do not want to expose passwords in our database, so hash the password and use password_verify when a user logs in.
        $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
        $stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
        $stmt->execute();
        header('Location: login.html');
        echo 'You have successfully registered, you can now login!';
    } else {
        // Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
        echo 'Could not prepare statement!';
    }
    }
    $stmt->close();
} else {
    // Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
    echo 'Could not prepare statement!';
}
$con->close();
?>
  • 1
    ВНИМАНИЕ : написать свой собственный уровень контроля доступа нелегко, и есть много возможностей сделать его неправильно. Пожалуйста, не пишите свою собственную систему аутентификации, когда любая современная среда разработки, такая как Laravel, оснащена встроенной надежной системой аутентификации . Использование стандартного кода из поста в блоге не лучший план, если есть какие-либо проблемы с безопасностью, о которых вы никогда не узнаете. Основные платформы обеспечивают безопасность стада.
  • 1
    если вы используете данные, предоставленные пользователем, вам действительно следует обновить CHARSET=utf8 до CHARSET=utf8mb4 и убедиться, что все столбцы также обновлены. Почему?
Теги:

2 ответа

0

Чтобы добавить новый столбец в существующую таблицу, вы должны выполнить следующую команду SQL:

ALTER TABLE accounts ADD COLUMN experience ENUM('Beginner','Intermediate','Advanced') NULL DEFAULT 'Beginner' FIRST;

Преимущество столбца enum заключается в том, что сохраняется только перечисление (1-3), а не строки.

Тогда команда вставки будет

INSERT INTO accounts (username, password, email,experience ) VALUES (?, ?, ?, ?)

и значение для столбца опыта может быть одной из строк 'Beginner', 'Intermediate', 'Advanced' или соответствующее числовое значение 1,2,3

  • 0
    Это одно из преимуществ ENUM , но недостатком является то, что добавление новой опции очень раздражает и требует переноса базы данных.
  • 0
    Если он хочет использовать целое число, он может просто установить int и задать значения формы 1, 2 и 3. Это, вероятно, будет оптимальным.
Показать ещё 5 комментариев
0

Во-первых, добавьте столбец в вашу таблицу для хранения вашего значения:

ALTER TABLE 'mytable' ADD 'myselect' TEXT NOT NULL; 

Затем создайте элемент select в вашей форме:

<form action = 'myphppage.php' method='post'>
    <select name='yourselect'>
        <option value='Advanced'>Advanced</option>
        <option value='Intermediate'>Intermediate</option>
        <option value='Beginner'>Intermediate</option>
    </select>
    <button type='submit'>Submit</button>
</form>

Когда пользователь нажимает на кнопку submit, значение вашего элемента select будет отправлено в вашем массиве $ _POST в myphppage.php с именем элемента в качестве индекса.

<?php

   $select = $_POST['yourselect']; 

?>

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

<?php

    if($stmt = $con->prepare('INSERT INTO 'mytable'('myselect') VALUES (?)'){
        $stmt->bind_param('s', $select){
            $stmt->execute();
        }
    }

?>

Очевидно, что вам нужно адаптировать это, чтобы соответствовать специфике вашей ситуации, но это идея.

  • 0
    И в случае показа / скрытия контента, основанного на этом статусе (начальный, средний и продвинутый), правильный ли этот подход с использованием оператора switch? `` `<? php $ rank1 = mysql_query (" SELET FROM account WHERE column = '". mysql_real_escape_string ($ _ SESSION [' experience '])."' "); $ rank = mysql_result ($ rank1, 0, 'rank'); switch ($ rank) {case 3: echo "<div> <a href='#'> Показывать контент для начинающих здесь </a> </ div>"; сломать; }?> `` `
  • 0
    Я не думаю, что это сработает, и если ваш пользователь сможет получить доступ к вашей переменной сеанса, вы будете подвергаться риску внедрения SQL независимо. Если вы собираетесь делать SQL-запросы, вам нужно использовать параметризованные запросы. stackoverflow.com/questions/60174/...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню