簡単なユーザー登録とログインフォームを作成するにはどうすればよいですか?
ユーザー登録ポータルを作成するときに最初に考慮すべきことは、ユーザーアカウントをどこにどのように保存するかです。この目的のために、次の表でMySQLデータベースを使用します。
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;
このテーブルには、ユーザー名とパスワードのハッシュを格納します。アカウントの種類を示す列もあります。通常のユーザーか管理者か。
データベース接続
明らかに、データベースに接続してセッションを開始する必要があります。これらのトピックは、この回答の範囲外です。 PDOを使用して、新しいテーブルを保持するデータベースに接続します。
<?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
]);
PDOの動作の詳細については、次の記事を参照してください。 https://phpdelusions.net/pdo
登録機能
これで、データベースにユーザーを登録する簡単な関数を作成できます。この関数は、DB接続、ユーザー名、パスワードの3つのパラメーターを受け入れます。
この関数は、パスワードのハッシュを作成してから、このパスワードを破棄します。これは単純な例ですが、実際には、チェックを追加して、これをより確実なものにしたいと思うでしょう。
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
]);
}
ログイン機能
登録関数で行ったのと同じように、ログイン用の関数を1つ作成します。この関数は同じパラメーターを受け入れますが、INSERT
の代わりに使用します。 SELECT
一致するユーザー名に基づいてデータベースから。
データベースに一致するレコードがあり、パスワードが保存されたハッシュに対して検証された場合、ユーザー情報をセッションに保存します。セッションはこの情報をハードドライブに保持し、今後のリクエスト時に使用されるCookieをユーザーに提供します。そのCookieを使用すると、PHPはページが要求されるたびに同じセッションを開きます。
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'];
}
完全なコード
これで、これらすべてを接続して、いくつかのHTMLフォームを追加できます。 HTML部分は範囲外ですが、PHPロジックから分離しておく必要があります。おそらく完全に別のファイルにあります。
<?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;
これは、PHPでの登録とログインがどのように機能するかを示す非常に簡単な例です。ライブサイトでそのまま使用することはお勧めしませんが、学習目的で、この機能がどのように機能するかを示す必要があります。
その上に構築して、ユーザータイプが異なるときに何かを行うことができます。より多くの特権ユーザーに、より多くのコンテンツを表示します。