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

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

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

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

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

#1.登録ボタンの設置

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

```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>
```

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/341761/98c041b3-2125-6479-1764-f94afd1c441e.png" width=50%>



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

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

```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.メールアドレスがすでに使用されているかのチェック

```php
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

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

```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.重複がなければユーザー登録をする

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

```php

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

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

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

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


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

```sql
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.ユーザー登録に成功しました、というメッセージを表示する

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

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


#完成ソースコード

```php
<?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文の前に記述してください