如何在我的注册表单中添加新字段

时间:2014-02-23 15:59:10

标签: php html

我想在我的注册表格中添加额外的字段,如出生日期,城市,国家和婚姻状况。我是PHP和PDO的新手。

这是我的代码:

PHP

<?php
require 'core/init.php';
$general->logged_in_protect();

if (isset($_POST['submit'])) {
    if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['email'])) {
        $errors[] = 'All fields are required.';
    } else {
        if ($users->user_exists($_POST['username']) === true) {
            $errors[] = 'That username already exists';
        }
        if (!ctype_alnum($_POST['username'])) {
            $errors[] = 'Please enter a username with only alphabets and numbers';
        }

        if (strlen($_POST['password']) <6) {
            $errors[] = 'Your password must be atleast 6 characters';
        } else if (strlen($_POST['password']) >18) {
            $errors[] = 'Your password cannot be more than 18 characters long';
        }

        if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
            $errors[] = 'Please enter a valid email address';
        } else if ($users->email_exists($_POST['email']) === true) {
            $errors[] = 'That email already exists.';
        }
    }

    if (empty($errors) === true) {
        $username = htmlentities($_POST['username']);
        $password = $_POST['password'];
        $email = htmlentities($_POST['email']);
        $users->register($username, $password, $email);
        header('Location: register.php?success');
        exit();
    }
}

HTML

<!doctype html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <title>Register</title>
    </head>

    <body>
        <div class="nav-bar" style="box-shadow:0 0 5px 0 rgba(0, 0, 0, 0.4);">
            <?php include 'includes/menu.php'; ?>
        </div>
        <!-- NAV BAR DIV closes here -->
        <div id="main-wrap" style="box-shadow:0 0 5px 0 rgba(0, 0, 0, 0.4);">
            <div id="container">
                <h1>Register</h1>

                <?php if (isset($_GET['success']) && empty($_GET['success'])) { echo 'Thank you for registering. Please check your email.'; } ?>
                <form method="post" action="">
                    <h4>Username:</h4>
                    <input type="text" name="username" value="<?php if (isset($_POST['username'])) echo htmlentities($_POST['username']); ?>">

                    <h4>Password:</h4>
                    <input type="password" name="password" />
                    <h4>Email:</h4>

                    <input type="text" name="email" value="<?php if (isset($_POST['email'])) echo htmlentities($_POST['email']); ?>" />

                    <br>
                    <input type="submit" name="submit" value="Register" />
                </form>
                <?php if (empty($errors) === false){ echo '<p>' . implode('</p><p>', $errors) . '</p>'; } ?>
            </div>
            <!-- Container DIV closes here -->
        </div>
        <!-- Main Wrap DIV closes here -->
    </body>

</html>

如何添加额外字段?

1 个答案:

答案 0 :(得分:1)

这是一个非常开放的问题。您需要使用代码来处理将输入添加到数据库,但这需要一个单独的问题。

对于PHP,您需要决定如何验证每个字段,然后为每个问题添加另一个if块。对于HTML,您需要为每个字段添加另一个输入。

示例代码

对于出生日期,您应该确保它是有效日期。然后你可能也想验证年龄。

您可以在出生日期使用这样的PHP代码:

//test date
try {
    $max_date = new DateTime('13 years ago');
    $birth_date = new DateTime($_POST['birth_date']);
    if ($birth_date > $max_date) { {
        $errors[] = 'You must be at least 13 years old.';
    }
} catch (Exception $e) {
    $errors[] = 'Birth date is not a valid date.';
}

然后,您可以使用以下内容格式化MySQL的日期:

$birth_date->format('Y-m-d');

相关的PHP手册页:

您可以在出生日期使用这样的HTML代码:

<h4>Birth Date:</h4>
<input type="text" name="birth_date" value="<?php if (isset($_POST['birth_date'])) echo htmlentities($_POST['birth_date']); ?>" />

您还可以将输入格式化为日期的每个部分的单独字段,并使用下拉菜单。我发现这是必要的,因为DateTime类可以处理各种格式。但是,我通常添加jQuery Datepicker以使其更加用户友好。


其他字段

以上应该给你一个很好的起点。你可以为每个领域做类似的事情。如果您希望此处的人员提供帮助,您需要显示更多个人努力

如果您对如何验证其他输入有特定问题,您应该发布一个单独的问题(首先搜索答案后)。展示你尝试过的东西。描述结果并解释它与预期结果的不同之处。


代码改进建议

  1. 我将两个if块组合成用户名。如果用户名已存在,则无需验证格式。

    if ($users->user_exists($_POST['username']) === true) {
        $errors[] = 'That username already exists';
    } else if (!ctype_alnum($_POST['username'])) {
        $errors[] = 'Please enter a username with only alphabets and numbers';
    }
    
  2. empty($errors)的返回值与true或false进行比较是多余的。返回值始终是布尔值。您只需if (empty($errors))if (!empty($errors))

  3. 您应该在HTML中使用label元素而不是h4元素,以使HTML更加语义化。然后,您可以根据需要使用CSS来设置它们的样式。

    <label for="fld-password">Password:</label>
    <input type="password" id="fld-password" name="password" />