PHP 入力フォーム値をDBに保存

# `form.php`に入力した値をDBに保存するための準備

__●__ 以前に作成した、[form.php](https://qiita.com/takadayo/items/8bd1dac086e1d29da797) の `$pageFlag === 2`セクションにDB接続及びDB保存処理を実装するための準備をする

※ フォーム入力なのでDB保存には `prepare`, `bind`, `execute` を使う  
しかし、 `form.php`の入力項目は全て文字列なので `execute(配列(全て文字列))`　というように処理ができるので、`bind` は不要になる。

__●__ DB接続には以前に作成した [db_connection.php](https://qiita.com/takadayo/items/3c1c5f7e4cdd08071a52) を読み込ませるようにする


## `insert.php`ファイルを作成及び編集

- まずはテストしてみる

```php:insert.php
<?php

// DB接続 PDO
require 'db_connection.php';

// 入力 DB保存 prepare, execute(配列(全て文字列))
$params = [
    'id' => null,
    'name' => 'test',
    'email' => 'test@test.com',
    'gender' => '1',
    'age' => '3',
    'contact' => 'testです',
    'created_at' => null,
];

$count = 0;
$columns = '';
$values = '';

foreach (array_keys($params) as $key) {
    if ($count++ > 0) {
        $columns .= ',';
        $values .= ',';
    }
    $columns .= $key;
    $values .= ':' . $key;
}

// 入力なので insert文
$sql = 'insert into contacts (' . $columns . ')values(' . $values')';

var_dump($sql);
```

- `insert.php`にアクセスすると下記のようになる

```
接続成功string(133) "insert into contacts (id,name,email,url,gender,age,contact,created_at)values(:id,:name,:email,:url,:gender,:age,:contact,:created_at)"
```

# DBに保存できるようにする

- `insert.php`を編集

```php:insert.php
<?php

require 'db_connection.php';

$params = [
    'id' => null,
    'name' => 'test4',
    'email' => 'test4@test.com',
    'url' => 'http://test4.com',
    'gender' => '1',
    'age' => '4',
    'contact' => 'test4です',
    'created_at' => null,
];

$count = 0;
$columns = '';
$values = '';

foreach (array_keys($params) as $key) {
    if ($count++ > 0) {
        $columns .= ',';
        $values .= ',';
    }
    $columns .= $key;
    $values .= ':' . $key;
}

$sql = 'insert into contacts (' . $columns . ')values(' . $values . ')';

$stmt = $pdo->prepare($sql); // プリペアードステートメント
$stmt->execute($params); // queryを実行
```
- `insert.php`にアクセスすると `DB`に保存される

# 入力フォームからの送信・DB保存処理

- `form.php`の `$pageFlag === 2`のセクションに `insert.php`を読み込む
- 関数名は何でも良いが、`inputContact()`という関数を作成し、引数にPOST送信で入る値`($_POST)`を入れる

`form.php`を編集

```php:form.php
            // 省略

<?php if ($pageFlag === 2) : ?>
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <?php
            require 'insert.php'; // insert.phpを読み込む

            insertContact($_POST); // insertContact関数の実行 $_POSTに入力値が入ってくる
            ?>

            送信が完了しました。
            <!-- sessionトークンの削除 -->
            <?php unset($_SESSION['csrfToken']);  ?>
        <?php else : ?>
            <p>不正なアクセスです。</p>
            <?php unset($_SESSION['csrfToken']);  ?>
        <?php endif; ?>
    <?php endif; ?>

          // 以下省略
```

- `insert.php`を `inputContact`関数で囲み引数は `$_POST`を入れなくてはならないので `$request`としておく

`insert.php`を編集

```php:insert.php
<?php

function insertContact($request) // $requestに $_POSTが入ってくる
{
    // DB接続 PDO
    require 'db_connection.php';

    // 入力 DB保存 prepare, execute(配列(全て文字列))
    $params = [
        'id' => null,
        'name' => $request['name'],
        'email' => $request['email'],
        'url' => $request['url'],
        'gender' => $request['gender'],
        'age' => $request['age'],
        'contact' => $request['contact'],
        'created_at' => null,
    ];

    $count = 0;
    $columns = '';
    $values = '';

    foreach (array_keys($params) as $key) {
        if ($count++ > 0) {
            $columns .= ',';
            $values .= ',';
        }
        $columns .= $key;
        $values .= ':' . $key;
    }

    $sql = 'insert into contacts (' . $columns . ')values(' . $values . ')';

    $stmt = $pdo->prepare($sql); // プリペアードステートメント
    $stmt->execute($params); // queryを実行
}
```

`form.php`にアクセスしてフォーム入力を完了させるとDBに保存される。

以上です。