Como fazer um cadastro de usuário simples e formulário de login?
A primeira coisa que você deve considerar ao criar um portal de registro de usuário é onde e como você armazenará as contas de usuário. Para isso, vamos usar o banco de dados MySQL com a seguinte tabela:
CREATE TABLE IF NOT EXISTS `accounts` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`Hash` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`UserType` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Nesta tabela vamos armazenar o nome de usuário e o hash da senha. Também temos uma coluna que nos informará o tipo de conta; seja um usuário normal ou um administrador.
Conexão de banco de dados
Obviamente, precisamos nos conectar ao banco de dados e iniciar uma sessão. Esses tópicos estão fora do escopo desta resposta. Vamos usar o PDO para conectar ao nosso banco de dados que contém nossa nova tabela.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'dbuser', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
Para uma explicação mais detalhada de como o PDO funciona, dê uma olhada neste artigo:https://phpdelusions.net/pdo
Função de registro
Agora podemos criar uma função simples que registrará um usuário no banco de dados. Esta função aceitará 3 parâmetros:a conexão do banco de dados, nome de usuário e senha.
Esta função criará um hash da senha e, em seguida, descartará essa senha. É um exemplo simples, mas em palavras reais você provavelmente gostaria de adicionar mais verificações e tornar isso mais infalível.
function register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
A função de login
Assim como fizemos com a função de registro, criaremos uma função para login. A função aceitará os mesmos parâmetros, mas em vez de
INSERT
ele irá SELECT
do banco de dados com base no nome de usuário correspondente. Se houver um registro correspondente no banco de dados e a senha for verificada em relação ao hash armazenado, armazenamos as informações do usuário em uma sessão. A sessão manterá esta informação no disco rígido e fornecerá ao usuário um cookie para ser usado em futuras solicitações. Usando esse cookie, o PHP abrirá a mesma sessão toda vez que a página for solicitada.
function login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
O código completo
Agora podemos conectar tudo isso e adicionar alguns formulários HTML. A parte HTML está fora do escopo, mas você deve mantê-la separada da sua lógica PHP. Provavelmente em um arquivo separado completamente.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'inet', '5432', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
function register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
function login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
if (isset($_POST['register'])) {
register($pdo, $_POST['username'], $_POST['password']);
}
if (isset($_POST['login'])) {
login($pdo, $_POST['username'], $_POST['password']);
}
if (!isset($_SESSION['loggedUserId'])):
?>
<!-- Register form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="register" value="Register">
</form>
<!-- Login form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="login" value="Log in">
</form>
<?php
else:
echo 'Here be something after login. You are a '.$_SESSION['UserType'];
endif;
Este é um exemplo muito simples de como o registro e o login funcionam no PHP. Eu não recomendaria usá-lo como está em um site ativo, mas para fins de aprendizado, ele deve demonstrar como essa funcionalidade funciona.
Você pode construir em cima dele e fazer algo quando o tipo de usuário for diferente. Mostre mais conteúdo para usuários mais privilegiados.