创建一个PHP登录表单

当我们要存储有关我们网站用户的信息时,用户登录和注册系统非常有用。 这适用于从可能存储课程进度和标记的教育网站到将存储有关客户过去购买信息的电子商务网站的所有内容。

创建登录和注册表格

我们的第一步将是创建登录表单和注册表单。 表格实际上将非常简单。 注册表仅要求提供用户名,电子邮件和密码。 用户名和电子邮件对于每个注册的人都是唯一的。 如果有人尝试使用相同的电子邮件地址创建两个帐户,我们将向他们显示一条错误消息,让他们知道该电子邮件已在使用中。

编写注册表

这是用于创建注册表HTML。 您必须将其放入名为register.php的文件中。

<form method="post" action="" name="signup-form">
    <div class="form-element">
        <label>Username</label>
        <input type="text" name="username" pattern="[a-zA-Z0-9]+" required />
    </div>
    <div class="form-element">
        <label>Email</label>
        <input type="email" name="email" required />
    </div>
    <div class="form-element">
        <label>Password</label>
        <input type="password" name="password" required />
    </div>
    <button type="submit" name="register" value="register">Register</button>
</form>

表单是非常基本的,但是我们确实使用HTML5来进行一些非常基本的输入验证。 例如,当用户输入的电子邮件地址格式不正确时,使用type="email"会警告用户。 类似地,在用户名上使用pattern属性将确保用户名仅包含字母数字字符。

编码登录表单

这是登录表单HTML。 您可以将其放在名为login.php的文件中。

<form method="post" action="" name="signin-form">
    <div class="form-element">
        <label>Username</label>
        <input type="text" name="username" pattern="[a-zA-Z0-9]+" required />
    </div>
    <div class="form-element">
        <label>Password</label>
        <input type="password" name="password" required />
    </div>
    <button type="submit" name="login" value="login">Log In</button>
</form>

使用CSS设置表单样式

您可以将以下CSS应用于这些表单:

* {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

body {
    margin: 50px auto;
    text-align: center;
    width: 800px;
}

h1 {
    font-family: 'Passion One';
    font-size: 2rem;
    text-transform: uppercase;
}

label {
    width: 150px;
    display: inline-block;
    text-align: left;
    font-size: 1.5rem;
    font-family: 'Lato';
}

input {
    border: 2px solid #ccc;
    font-size: 1.5rem;
    font-weight: 100;
    font-family: 'Lato';
    padding: 10px;
}

form {
    margin: 25px auto;
    padding: 20px;
    border: 5px solid #ccc;
    width: 500px;
    background: #eee;
}

div.form-element {
    margin: 20px 0;
}

button {
    padding: 10px;
    font-size: 1.5rem;
    font-family: 'Lato';
    font-weight: 100;
    background: yellowgreen;
    color: white;
    border: none;
}

p.success,
p.error {
    color: white;
    font-family: lato;
    background: yellowgreen;
    display: inline-block;
    padding: 2px 10px;
}

p.error {
    background: orangered;
}

它包含有关错误消息和标题的一些其他样式规则。 当您创建自己的表单(可能需要不同的样式和输入字段)时,可以将本节中HTML和CSS用作项目的基础。

和连接到数据库

下一步是创建一个用户表,该表将存储有关已注册用户的所有信息。 在我们的例子中,该表仅由四列组成:自动递增的ID,唯一的用户名,电子邮件和密码。

您可以使用以下SQL快速创建表。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(25) NOT NULL,
  `password` varchar(255) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

现在,创建一个名为config.php的文件,并在其中编写以下代码以连接到数据库。

<?php
define('USER', 'root');
define('PASSWORD', '');
define('HOST', 'localhost');
define('DATABASE', 'test');

try {
    $connection = new PDO("mysql:host=".HOST.";dbname=".DATABASE, USER, PASSWORD);
} catch (PDOException $e) {
    exit("Error: " . $e->getMessage());
}
?>

将数据库名称更改为您的数据库名称。 该文件将用于建立与数据库的连接。

编码用户注册

终于到了实现注册功能的时候了。 该代码的主要功能是检查提供的电子邮件是否已经注册。 如果不是,我们在数据库中输入用户名,电子邮件和密码。

将以下代码放在registration.php的顶部。

<?php

include('config.php');
session_start();

if (isset($_POST['register'])) {

    $username = $_POST['username'];
    $email = $_POST['email'];
    $password = $_POST['password'];
    $password_hash = password_hash($password, PASSWORD_BCRYPT);

    $query = $connection->prepare("SELECT * FROM users WHERE EMAIL=:email");
    $query->bindParam("email", $email, PDO::PARAM_STR);
    $query->execute();

    if ($query->rowCount() > 0) {
        echo '<p class="error">The email address is already registered!</p>';
    }

    if ($query->rowCount() == 0) {
        $query = $connection->prepare("INSERT INTO users(USERNAME,PASSWORD,EMAIL) VALUES (:username,:password_hash,:email)");
        $query->bindParam("username", $username, PDO::PARAM_STR);
        $query->bindParam("password_hash", $password_hash, PDO::PARAM_STR);
        $query->bindParam("email", $email, PDO::PARAM_STR);
        $result = $query->execute();

        if ($result) {
            echo '<p class="success">Your registration was successful!</p>';
        } else {
            echo '<p class="error">Something went wrong!</p>';
        }
    }
}

?>

第一步是包括config.php并启动会话。 这有助于我们在页面上存储要保留的所有信息。

接下来,我们通过检查$ _POST ['register']是否已设置来检查用户是否单击了Register按钮来提交表单。 始终记住,将密码存储为纯文本不是一个好主意。 因此,我们使用password_hash()函数,然后将该哈希存储在我们的数据库中。 此特定函数使用随机生成的盐创建60个字符的哈希。

最后,我们执行查询并检查给定电子邮件地址是否存在非零行号。 如果是这样,则用户将收到一条消息,指出该电子邮件地址已被注册。

如果给定的电子邮件地址不存在任何行,我们将提供的信息输入数据库,并让用户知道注册成功。

实施登录功能

在最后一步中,我们编写了用于登录用户的代码。这一次,我们仅检查数据库中的信息,以查看输入到表单中的用户名和密码组合是否正确。

这是位于login.php顶部的代码。

<?php

include('config.php');
session_start();

if (isset($_POST['login'])) {

    $username = $_POST['username'];
    $password = $_POST['password'];

    $query = $connection->prepare("SELECT * FROM users WHERE USERNAME=:username");
    $query->bindParam("username", $username, PDO::PARAM_STR);
    $query->execute();

    $result = $query->fetch(PDO::FETCH_ASSOC);

    if (!$result) {
        echo '<p class="error">Username password combination is wrong!</p>';
    } else {
        if (password_verify($password, $result['PASSWORD'])) {
            $_SESSION['user_id'] = $result['ID'];
            echo '<p class="success">Congratulations, you are logged in!</p>';
        } else {
            echo '<p class="error">Username password combination is wrong!</p>';
        }
    }
}

?>

这里要注意的重要一件事是,我们不会一步一步比较用户名和密码。 由于密码实际上是以散列形式存储的,因此我们首先需要借助提供的用户名来获取散列。 一旦有了哈希,就可以使用password_verify()函数比较密码和哈希。

成功确认密码后,我们将$_SESSION['user_id']变量设置为数据库中该用户的ID。 您还可以在此处设置其他变量的值。

限制页面访问

要求用户注册的大多数网站都有一些其他页面,用户可以在其中访问和存储私人数据。 您可以使用会话变量来保护这些页面。 如果未设置会话变量,只需将用户重定向到登录页面。 否则,请向他们显示页面的内容。

<?php
session_start();

if(!isset($_SESSION['user_id'])){
    header('Location: login.php');
    exit;
} else {
    // Show users the page!
}
?>

您唯一要做的就是确保脚本在开始时包含session_start()

最后的想法

在本教程中,我们学习了如何使用PHP创建基本的用户注册和登录系统。 一旦掌握了登录和注册系统的基础知识,就可以创建更复杂的逻辑,从而允许用户重置密码,验证电子邮件地址等。

或者查看我们的免费PHP教程 ,将您的PHP编程技能提高到一个新的水平。 如果您对此帖子有任何疑问,请在评论中让我知道。

翻译自: https://code.tutsplus.com/tutorials/create-a-php-login-form--cms-33261