0
0

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

Posted at

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

以前に作成した、form.php$pageFlag === 2セクションにDB接続及びDB保存処理を実装するための準備をする

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

DB接続には以前に作成した db_connection.php を読み込ませるようにする

insert.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を編集
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を編集

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.phpinputContact関数で囲み引数は $_POSTを入れなくてはならないので $requestとしておく

insert.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に保存される。

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0