# GET / POST 解説
## 対象：社内Web開発初心者向け（PHP / HTML）

---

## 1. 結論：フォームの `name` 属性が「橋」になる

HTMLのフォームで送信された値は、`name` 属性をキーとして PHP の `$_GET` / `$_POST` に自動的に格納されます。

```
HTML側                             PHP側
─────────────────────────          ──────────────────────────────
<input name="tokui_manage">   →    $_GET['tokui_manage']   （GETのとき）
<input name="tokui_manage">   →    $_POST['tokui_manage']  （POSTのとき）
<select name="view_kbn">      →    $_GET['view_kbn']
<input type="hidden"
       name="action">         →    $_POST['action']
```

**`name` 属性の値 ＝ `$_GET` / `$_POST` のキー**、これだけ覚えれば読み解けます。

---

## 2. GET の仕組み

### HTML側（送信）

```html
<form method="get" action="">
    <input type="text" name="tokui_manage" value="T001">
    <input type="text" name="tokui_name"   value="山田商店">
    <button type="submit">検索</button>
</form>
```

### 送信されるURL（ブラウザのアドレスバーで見える）

```
tokui_list.php?tokui_manage=T001&tokui_name=山田商店
               ↑キー       ↑値  ↑キー     ↑値
              （name属性）       （name属性）
```

- `?` 以降の部分を **クエリ文字列** と呼ぶ
- `キー=値` の形式で、`&` で複数つなぐ
- `name` 属性の文字列がそのままキーになる

### PHP側（受け取る）

```php
$_GET['tokui_manage']  // → "T001"
$_GET['tokui_name']    // → "山田商店"
```

`$_GET` はPHPが自動で用意する連想配列（Dictionary）。サーバーに届いた瞬間に中身が入っている。

---

## 3. POST の仕組み

### HTML側（送信）

```html
<form method="post" action="">
    <input type="hidden" name="target_tokui_manage" value="T001">
    <input type="hidden" name="action"              value="delete">
    <button type="submit">削除</button>
</form>
```

### 送信されるURL（アドレスバー）

```
tokui_list.php   ← URLはこれだけ。値はURLに出ない。
```

値はHTTPリクエストの **ボディ（通信の中身）** に隠れて送られる。

```
【HTTP リクエストボディ（ユーザーには見えない）】
target_tokui_manage=T001&action=delete
```

### PHP側（受け取る）

```php
$_POST['target_tokui_manage']  // → "T001"
$_POST['action']               // → "delete"
```

`$_POST` も `$_GET` と同様にPHPが自動で用意する連想配列。

---

## 4. GETとPOSTの使い分け

```
┌────────────────────────────────────────────────────┐
│  副作用なし（データを読むだけ）  →  GET           │
│    例）検索、一覧表示、詳細表示                    │
│                                                    │
│  副作用あり（データを変える）   →  POST           │
│    例）新規登録、更新、削除、ログイン              │
└────────────────────────────────────────────────────┘
```

### GET を検索フォームに使う理由

- URLに検索条件が含まれるため、**ブラウザの「戻る」「F5」「ブックマーク」と相性が良い**
- 検索条件のURLをコピーして共有できる

### POST を更新系処理に使う理由

- URLに値が出ないため、**パスワードや機密情報の送信に適している**
- F5（リロード）での二重送信を防ぐ設計（後述のPRGパターン）と組み合わせやすい

---

## 5. GETとPOSTの判定：`$_SERVER['REQUEST_METHOD']`

ブラウザからのリクエストがGETかPOSTかは、PHPで次のように判定します。

```php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // フォームのsubmitボタンが押された（POST送信）
    // → 削除・登録・更新などの処理を行う
    $action = $_POST['action'];

} else {
    // ページを普通に開いた（GET）
    // → 画面の初期表示や検索処理を行う
    $tokuiManage = $_GET['tokui_manage'] ?? '';
}
```

`$_SERVER` はサーバー環境情報を格納するPHP組み込みの連想配列。
`REQUEST_METHOD` には `'GET'` または `'POST'` が入っている。

---

## 6. type="hidden"（非表示フィールド）とは

```html
<input type="hidden" name="action" value="delete">
```

- **画面上には表示されない**が、フォーム送信時に **値はちゃんと送られる**
- ユーザーに入力させる必要はないが、サーバー側に「このボタンはどの処理か」を伝えるために使う
- 今回のコードでは **削除か復活か** を `action` という名前で区別している

```html
<!-- 削除ボタンの行 -->
<input type="hidden" name="action" value="delete">
<button type="submit">削除</button>

<!-- 復活ボタンの行 -->
<input type="hidden" name="action" value="restore">
<button type="submit">復活</button>
```

PHP側で受け取る：

```php
$action = $_POST['action'];  // "delete" または "restore"

if ($action === 'delete') {
    // 削除処理（DELETEFLG = 1）
}
if ($action === 'restore') {
    // 復活処理（DELETEFLG = 0）
}
```

---

## 7. PRGパターン（Post → Redirect → Get）

POST処理の後に **そのまま画面を表示してはいけない** 理由があります。

### 問題：POST後にF5（リロード）すると何が起きるか

```
【悪いパターン】
ユーザーが「削除」ボタンを押す
  → POST送信 → DB削除処理 → 削除完了画面を表示（POST状態のまま）
  → F5を押す
  → 「フォームを再送信しますか？」ダイアログが出る
  → OKを押すと → 削除が2回実行される！
```

### 解決：PRGパターン（処理後に必ず redirect する）

```
【正しいパターン：PRGパターン】
ユーザーが「削除」ボタンを押す
  → POST送信 → DB削除処理 → redirect（一覧画面へ）← ここがポイント
  → ブラウザが GET で一覧画面を開く
  → F5を押しても → GET のリロードなので安全
```

コードでの実装：

```php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 削除処理
    $stmt->execute();

    // ← そのまま表示せず、必ずリダイレクト
    redirect('/master/tokui_list.php?message=' . urlencode('削除しました。'));
    //        ↑ここからは GET リクエストになる → F5しても安全
}
```

---

## 8. サーバー側にデータが届くまでの流れ（全体像）

```
【GET の場合：検索】
ブラウザ                         サーバー（PHP）
  |                                 |
  | ① 検索ボタンを押す              |
  | ② URLにクエリ文字列を付けて送信 |
  |   ?tokui_manage=T001&...        |
  |─────────────────────────────→  |
  |                                 | ③ $_GET に自動格納
  |                                 |   $_GET['tokui_manage'] = "T001"
  |                                 | ④ DB検索実行
  |                                 | ⑤ HTMLを生成して返す
  | ⑥ 一覧ページが表示される        |
  |←─────────────────────────────  |


【POST の場合：削除】
ブラウザ                         サーバー（PHP）
  |                                 |
  | ① 削除ボタンを押す              |
  | ② HTTPボディにデータを入れて送信|
  |   （URLは変わらない）           |
  |─────────────────────────────→  |
  |                                 | ③ $_POST に自動格納
  |                                 |   $_POST['action'] = "delete"
  |                                 | ④ DB更新実行（DELETEFLG=1）
  |                                 | ⑤ redirect レスポンスを返す
  | ⑥ ブラウザが自動で一覧ページへGET|
  |←─────────────────────────────  |
  | ⑦ 一覧ページが表示される（GET）  |
```

---

## 9. よく使う関連構文まとめ

| 構文 | 意味 | 使用場面 |
|------|------|---------|
| `$_GET['key']` | GETパラメータ取得 | 検索条件、ID指定 |
| `$_POST['key']` | POSTデータ取得 | 登録・更新・削除データ |
| `$_GET['key'] ?? ''` | 存在しない場合は空文字 | パラメータが省略可能な場合 |
| `$_SERVER['REQUEST_METHOD']` | HTTPメソッド判定 | GET/POST の振り分け |
| `urlencode($str)` | URL用エンコード | 日本語をURLに含める場合 |
| `urldecode($str)` | URLデコード | エンコードされた値を戻す場合 |

---

## 10. 注意点：セキュリティ

`$_GET` / `$_POST` の値は **ユーザーが自由に改ざんできる** ため、そのまま使うのは危険です。

```php
// 危険な例：$_GET の値をそのままSQLに埋め込む（SQLインジェクション）
$sql = "SELECT * FROM M_TOKUI WHERE TOKUI_MANAGE = '" . $_GET['tokui_manage'] . "'";
// ↑ tokui_manage に「' OR '1'='1」などを入れられると全件取得される

// 安全な例：プレースホルダー（bindValue）を使う
$sql = "SELECT * FROM M_TOKUI WHERE TOKUI_MANAGE = :tokui_manage";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':tokui_manage', $_GET['tokui_manage'], PDO::PARAM_STR);
$stmt->execute();
```

また、HTMLに出力する際は必ず `htmlspecialchars()`（または `h()` 関数）でエスケープします。

```php
// 危険な例：XSS（クロスサイトスクリプティング）
echo $_GET['tokui_name'];
// ↑ <script>alert('hack')</script> などを入れられると実行される

// 安全な例
echo htmlspecialchars($_GET['tokui_name'], ENT_QUOTES, 'UTF-8');
// または独自ラッパー
echo h($_GET['tokui_name']);
```
