PHP 学習メモ 6

概要

 PHP 学習メモ。クラスの学習や簡単なログイン機能の実装。

内容

  1. クラス
  2. ログイン処理
  3. ログインフォーム

 簡単なログイン機能を実装するため、MySQL データベースを用いてユーザー名とパスワードを保存するためのテーブルを作成する。ログインフォームにはユーザー名とパスワードを入力するフォームを用意し、ログイン時には入力されたデータをテーブルに問い合わせる。


1. クラス

 クラスについて:

www.php.net

 次の例では、mysqli というクラスからインスタンスを作成し、コンストラクタの引数としてデータベースのホスト名やユーザー名を渡している。

<? php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

 クラス内で定義した変数(プロパティ)や関数(メソッド)にアクセスするには -> を用いる。次の例では、mysqli クラスの prepare というメソッドを渡して呼び出している。

<? php
$sql = "SELECT id, username, password FROM users WHERE username = ?";
$stmt = $mysqli->prepare($sql);

 mysqli クラスについて:

www.php.net

2. ログイン処理

 ログイン処理を行う PHP ファイル login.phpを次の内容で作成する:

<?php
// データベース接続情報ファイル読み込み
include '../inc/dbinfo.inc';

// データベース接続
$mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

// ログイン処理
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $username = $_POST['username'];
  $password = $_POST['password'];

  $sql = "SELECT id, username, password FROM users WHERE username = ?";
  // プリペアドステートメントを作成
  $stmt = $mysqli->prepare($sql);
  // 変数をバインド
  $stmt->bind_param('s', $username);
  // クエリ実行
  $stmt->execute();
  // クエリ実行結果オブジェクト取得
  $result = $stmt->get_result();
  // クエリ実行結果の最初の行を取得
  $user = $result->fetch_assoc();

  if ($user && password_verify($password, $user['password'])) {
    echo 'ログイン成功';
  } else {
    echo 'ユーザー名またはパスワードが間違っています';
  }
}

// データベース接続切断
$mysqli->close();

?>

 SQLクエリのテンプレートを事前に準備し、後でパラメータをバインドすることができる機能。クエリテンプレート中の ?プレースホルダであり、bind_param 関数によってバインドする。

プレースホルダとバインドについて
 プレースホルダSQLクエリの中で使用される置換可能なパラメータ
 バインド:プレースホルダに具体的な値を代入すること

 mysqli_stmt クラスについて:

www.php.net

  • クエリ実行の流れ
mysqli クラス・・・データベース接続
    ↓
mysqli_stmt クラス・・・クエリ実行
    ↓
mysqli_result クラス・・・クエリ実行結果取得

 mysqli_result クラスについて:

www.php.net

3. ログインフォーム

 ログインフォームを表示する PHP ファイル index.php は次の内容で作成する:

<!DOCTYPE html>
<head>
  <title>ログイン</title>
</head>
<body>
  <h1>ログインフォーム</h1>
  <form method="post">
    <table>
      <tr>
        <td>
          <label for="username">ユーザー名:</label>
          <input type="text" id="username" name="username" required>
        </td>
      </tr>
      <tr>
        <td>
          <label for="password">パスワード:</label>
          <input type="password" id="password" name="password" required>
        </td>
      </tr>
    </table>
  <input type="submit" value="ログイン">
  </form>

</body>
</html>

<!-- ログイン処理 -->
<?php
require 'login.php';
?>