sql >> データベース >  >> RDS >> Mysql

ユーザー名からuser_groupへのユーザーの操作

    簡単なユーザー登録とログインフォームを作成するにはどうすればよいですか?

    ユーザー登録ポータルを作成するときに最初に考慮すべきことは、ユーザーアカウントをどこにどのように保存するかです。この目的のために、次の表で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での登録とログインがどのように機能するかを示す非常に簡単な例です。ライブサイトでそのまま使用することはお勧めしませんが、学習目的で、この機能がどのように機能するかを示す必要があります。

    その上に構築して、ユーザータイプが異なるときに何かを行うことができます。より多くの特権ユーザーに、より多くのコンテンツを表示します。




    1. エラー2003(HY000):ローカルホスト上のMySQLサーバーに接続できません(10061)

    2. ApacheSparkの主キー

    3. OracleSQL-週ごとのデータの合計とグループ化

    4. 電話のSQLvarchar(length)で考慮すべき世界で最も長い電話番号は何ですか