LoginSignup
4
6

More than 5 years have passed since last update.

PHPで簡易なログイン機能の実装方法

Last updated at Posted at 2019-02-20

何をするか

PHPでログイン機能を実装する。
(簡易的なもの)
なお、本記事はmysqlを使用している。
また、ローカル環境内で使用するために
$link= mysqli_connect("localhost","root","root","app")
としている。
memberappは今回の作業ファイルの名前である。

注意点

なお、今回はパスワードなどのセキュリティについては考えていないため、本格的な実装をする際には注意が必要である。
あくまでも、「こんなことができる」レベルだと思ってください。

今回使用している環境は、PHP7です。

実行手順

1.Eメールとパスワードの入力フォーム、「登録」ボタンの設置
2.データが入力されているかどうかのチェック
3.メールアドレスがすでに使用されているかのチェック
4.重複がなければユーザー登録をする
5.ユーザー登録に成功しました、というメッセージを表示する

1.登録ボタンの設置

まずはHTMLに以下を記述する。

<form method="post">
  <p>メールアドレスを入力してください</p>
  <input name="email" type="text" placeholder="Eメール">
  <p>パスワードを入力してください</p>
  <input name="password" type="text" placeholder="パスワード">
  <input type="submit" value="登録する!">
</form>

するとこのような画面になる。

2.データが入力されているかどうかのチェック

次は、PHPでの記述となる。

  if(array_key_exists('email', $_POST) OR array_key_exists('password',$_POST)){
    if($_POST['email'] == ''){
      echo "Eメールアドレスを入力してください";
    }elseif($_POST['password'] == ''){
      echo "パスワードを入力してください";
    }
  }

array_key_exists()の部分で、指定したキーまたは文字が配列にあるかどうかを調べている。

今回の場合、
'email'というキーが$_POST すなわち このフォームによって送信されたものに存在するかどうか、を調べていることになる。

※参考資料
http://php.net/manual/ja/function.array-key-exists.php

3.メールアドレスがすでに使用されているかのチェック

else{
      $query = "SELECT `id` FROM `users` WHERE email ='".mysqli_real_escape_string($link,$_POST['email'])."'";
      $result = mysqli_query($link,$query);
    }

mysqli_real_escape_stringは、SQLで使用する特殊文字を回避するために使用している。

*参考資料
http://php.net/manual/ja/mysqli.real-escape-string.php

つまり、先ほどのコードとつなぎ合わせると、以下のようになる。

  if(array_key_exists('email', $_POST) OR array_key_exists('password',$_POST)){
    if($_POST['email'] == ''){
      echo "Eメールアドレスを入力してください";
    }elseif($_POST['password'] == ''){
      echo "パスワードを入力してください";
    }else{
      $query = "SELECT `id` FROM `users` WHERE email ='".mysqli_real_escape_string($link,$_POST['email'])."'";
      $result = mysqli_query($link,$query);
    }
  }

4.重複がなければユーザー登録をする

まずは重複がある場合のエラー文を作る。


if(mysqli_num_rows($result) > 0){
        echo "そのメールアドレスは既に使用されています";
      }

mysqli_num_rows リザルトの結果を返すことになる。

*参考資料
http://php.net/manual/ja/mysqli-result.num-rows.php

この場合、3番でチェックしたもの(つまり$result)が1つでもあれば
「そのメールアドレスは既に使用されています」というエラー文を出している。

次に、重複がなかった場合(つまりユーザー登録ができる場合)の記述をする。

else {
        $query = "INSERT INTO `users` (`email`,`password`) VALUES
        ('".mysqli_real_escape_string($link,$_POST['email'])."','".mysqli_real_escape_string($link,$_POST['password'])."')";

INSERT INTOでユーザーテーブルに追加する旨を記述する。

その際に、VALUEには mysqli_real_escape_string()としたemailとpasswordを追加すると記述する。

5.ユーザー登録に成功しました、というメッセージを表示する

if(mysqli_query($link,$query)){
   echo "おめでとうございます、登録されました";
} else {
   echo "登録に失敗しました";
  }

無事、登録の成否次第で文を表示するようにした。

完成ソースコード

<?php
  $link=
  mysqli_connect("localhost","root","root","app");

  if(array_key_exists('email', $_POST) OR array_key_exists('password',$_POST)){
    if($_POST['email'] == ''){
      echo "Eメールアドレスを入力してください";
    }elseif($_POST['password'] == ''){
      echo "パスワードを入力してください";
    }else{
      $query = "SELECT `id` FROM `users` WHERE email ='".mysqli_real_escape_string($link,$_POST['email'])."'";
      $result = mysqli_query($link,$query);
      $query = "SET GLOBAL sql_mode=NO_ENGINE_SUBSTITUTION";
      mysqli_query($link,$query);
      if(mysqli_num_rows($result) > 0){
        echo "そのメールアドレスは既に使用されています";
      }else {
        $query = "INSERT INTO `users` (`email`,`password`) VALUES
        ('".mysqli_real_escape_string($link,$_POST['email'])."','".mysqli_real_escape_string($link,$_POST['password'])."')";
        if(mysqli_query($link,$query)){
          echo "おめでとうございます、登録されました";
        } else {
          echo "登録に失敗しました";
        }
      }
    }
  }

?>

<form method="post">
  <p>メールアドレスを入力してください</p>
  <input name="email" type="text" placeholder="Eメール">
  <p>パスワードを入力してください</p>
  <input name="password" type="text" placeholder="パスワード">
  <input type="submit" value="登録する!">
</form>

(もし、INSERTがうまくいかず、登録に失敗しました となる場合)
$query = "SET GLOBAL sql_mode=NO_ENGINE_SUBSTITUTION";

mysqli_query($link,$query)
をINSERT文の前に記述してください

4
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6