基本ファイル作成

php_sns プロジェクトを作成し、基本フォルダとファイルを作成します。

ファイル構成

php_sns/
├── lib/
│     └── Database.php
├── app.php
└── env.php
項目 内容
lib/ ライブラリフォルダ 汎用的なクラス、ファンクションフィル
app.php アプリ共通設定 すべてのアプリファイルで共通利用
env.php 環境設定ファイル 環境によって変更する設定

アプリ基本ファイル

環境設定ファイル作成

環境設定ファイル「env.php」にDB接続設定を定義します。

env.php
<?php 
// Database
const DB_CONNECTION = 'mysql';
const DB_HOST = '127.0.0.1';
const DB_PORT = 3306;
const DB_DATABASE = 'php_sns';
// XAMP
const DB_USERNAME = 'root';
// MAMP
// const DB_USERNAME = 'root';
const DB_PASSWORD = '';

アプリ基本設定

「env.php」にアプリ基本設定を定義します。

env.php
// アプリキー(セッションキー兼用)
const APP_KEY = "php_sns";
// サイトタイトル
const SITE_TITLE = "PHP SNS";
// サイトベースURL
const BASE_URL = "http://localhost/php_sns/";
  • BASE_URLはアプリのルートURLを任意に設定してください。

アプリ共通設定

「app.php」では環境設定ファイルを読み込み、アプリ共通設定を定義します。

システム用パス設定

アプリで利用するディレクトリパス(「app/」「lib/」など)を定義します。

app.php
// 環境設定ファイル読み込み
require_once "env.php";

// アプリケーションのルートディレクトリパス
const BASE_DIR = __DIR__;
// app/ ディレクトリパス
const APP_DIR = __DIR__ . "/app/";
// lib/ ディレクトリパス
const LIB_DIR = __DIR__ . "/lib/";
  • __DIR__ で「app.php」が配置されたディレクトリパスを取得

DB接続ライブラリ

「lib/Model.php」に、PDOの基本機能をラッパーしたDB接続ライブラリを実装します。

lib/Model.php
<?php
class Model
{
    public $pdo;
    function __construct()
    {
        $db_connection = DB_CONNECTION;
        $db_name = DB_DATABASE;
        $db_host = DB_HOST;
        $db_port = DB_PORT;
        $db_user = DB_USERNAME;
        $db_password = DB_PASSWORD;

        $dsn = "{$db_connection}:dbname={$db_name};host={$db_host};charset=utf8;port={$db_port}";
        try {
            $this->pdo = new PDO($dsn, $db_user, $db_password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } catch (PDOException $e) {
            echo "接続失敗: " . $e->getMessage();
            echo $dsn;
            exit;
        }
    }

}

ユーザ登録画面

ファイル構成

php_sns/
├── lib/
│        └── Model.php
├── regist/
│        └── input.php
├── app.php
└── env.php

アプリ共通ファイル読み込み

ユーザ登録の入力画面「register/input.php」を作成し、アプリ共通ファイル「app.php」を読み込みます。

regist/input.php
<?php
// アプリ共通ファイル読み込み
require_once "../app.php";

?>
  • 「app.php」と「regist/input.php」との相対パスに注意してください

HTML作成

入力画面の基本HTMLを作成します。

  • CSSフレームワークは「TailwindCSS」のCDN版を利用
regist/input.php
<?php
require_once "../app.php";

?>

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= SITE_TITLE ?></title>
    <base href="<?= BASE_URL ?>">
    <!-- TailwindCSS CDN -->
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <main id="register" class="flex justify-center">
        <div class="w-1/2 mt-3 p-5">
            <h2 class="text-2xl mb-3 font-normal text-center">Sign Up</h2>
        </div>
    </main>
</body>

</html>

設定ファイルが読み込まれ「SITE_TITLE」やHTML表示(TailwindCSS反映)されるか確認します。

結果

入力フォーム

ファイル構成

php_sns/
├── lib/
│        └── Model.php
├── regist/
│        ├── confirm.php
│        └── input.php
├── app.php
└── env.php

入力画面修正

入力画面「inpht.php」にユーザ登録フォームを作成します。

  • 個人情報を含むため、データはPOST送信します。
regist/input.php
<?php
require_once "../app.php";

?>

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= SITE_TITLE ?></title>
    <base href="<?= BASE_URL ?>">
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <main id="regist" class="flex justify-center">
        <div class="w-1/2 mt-3 p-5">
            <h2 class="text-2xl mb-3 font-normal text-center">Sign Up</h2>
            <form action="regist/confirm.php" method="post">
                <div class="relative mb-4">
                    <input 
                        id="account_name" 
                        type="text"
                        name="account_name" 
                        class="block px-2.5 pb-2.5 pt-6 mb-3
                        w-full rounded-lg
                        text-sm 
                        text-gray-900 
                        ring-1 ring-gray-300 
                        focus:outline-none 
                        focus:ring-1 
                        focus:ring-blue-600 
                        peer" 
                        placeholder=" " required>
                    <label for="account_name" class="absolute 
                        text-sm text-gray-400 
                        duration-300 
                        transform -translate-y-4 scale-75 
                        top-4 
                        origin-[0] start-2.5 
                        peer-focus:px-0
                        peer-focus:text-blue-600 
                        peer-focus:dark:text-blue-500 
                        peer-placeholder-shown:scale-100 
                        peer-placeholder-shown:translate-y-0 
                        peer-focus:scale-75 
                        peer-focus:-translate-y-4">
                        アカウント名
                    </label>
                </div>
                <div class="relative mb-4">
                    <input 
                        id="email" 
                        type="email"
                        name="email" 
                        class="block px-2.5 pb-2.5 pt-6 mb-3
                        w-full rounded-lg
                        text-sm 
                        text-gray-900 
                        ring-1 ring-gray-300 
                        focus:outline-none 
                        focus:ring-1 
                        focus:ring-blue-600 
                        peer"
                        placeholder=" " required>
                    <label for="email" class="absolute 
                        text-sm text-gray-400 
                        duration-300 
                        transform -translate-y-4 scale-75 
                        top-4 
                        origin-[0] start-2.5 
                        peer-focus:px-0
                        peer-focus:text-blue-600 
                        peer-focus:dark:text-blue-500 
                        peer-placeholder-shown:scale-100 
                        peer-placeholder-shown:translate-y-0 
                        peer-focus:scale-75 
                        peer-focus:-translate-y-4">
                        Email
                    </label>
                </div>
                <div class="relative mb-4">
                    <input 
                        id="password" 
                        type="password"
                        name="password" 
                        class="block px-2.5 pb-2.5 pt-6 mb-3 
                        w-full rounded-lg
                        text-sm 
                        text-gray-900 
                        ring-1 ring-gray-300 
                        focus:outline-none 
                        focus:ring-1 
                        focus:ring-blue-600 
                        peer"
                        placeholder=" " required>
                    <label for="password" class="absolute 
                        text-sm text-gray-400 
                        duration-300 
                        transform -translate-y-4 scale-75 
                        top-4 
                        origin-[0] start-2.5 
                        peer-focus:px-0
                        peer-focus:text-blue-600 
                        peer-focus:dark:text-blue-500 
                        peer-placeholder-shown:scale-100 
                        peer-placeholder-shown:translate-y-0 
                        peer-focus:scale-75 
                        peer-focus:-translate-y-4">
                        パスワード
                    </label>
                </div>

                <div class="relative mb-4">
                    <input 
                        id="name" 
                        type="text"
                        name="name" 
                        class="block px-2.5 pb-2.5 pt-6 mb-3
                        w-full rounded-lg
                        text-sm 
                        text-gray-900 
                        ring-1 ring-gray-300 
                        focus:outline-none 
                        focus:ring-1 
                        focus:ring-blue-600 
                        peer"
                        placeholder=" " required>
                    <label for="name" class="absolute 
                        text-sm text-gray-400 
                        duration-300 
                        transform -translate-y-4 scale-75 
                        top-4 
                        origin-[0] start-2.5 
                        peer-focus:px-0
                        peer-focus:text-blue-600 
                        peer-focus:dark:text-blue-500 
                        peer-placeholder-shown:scale-100 
                        peer-placeholder-shown:translate-y-0 
                        peer-focus:scale-75 
                        peer-focus:-translate-y-4">
                        名前
                    </label>
                </div>

                <div>
                    <button id="submit_button" class="w-full
                        mb-2 py-2 px-4 bg-sky-500 
                        hover:bg-sky-700 
                        text-white 
                        rounded-lg
                        disabled:bg-blue-300">
                        次へ
                    </button>
                </div>
            </form>
        </div>
    </main>
</body>

</html>

確認画面作成

データデバッグ

確認画面「confirm.php」を作成し、入力画面から送信されたPOSTデータをデバッグします。

regist/confirm.php
<?php
require_once "../app.php";

// POSTメソッド以外は強制終了
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    exit;
}

// POSTデータ取得
$regist = $_POST;
var_dump($regist);

POSTデータ送信

入力画面からデータ送信して、POSTデータが取得できるか確認します。

データ確認

「confirm.php」で、POSTデータがデバッグ表示されました。

結果
デバッグの削除

データ確認できたら、デバッグ部分は削除しておきましょう。

regist/confirm.php
<?php
require_once "../app.php";

if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    exit;
}

$regist = $_POST;
// デバッグ処理は削除
?>
  • 実際のアプリケーションで、デバッグ処理を出力しないように注意

PHP + MySQL Webサーバプログラミング