PHPプログラミング

レシピ

データベース PDO

PDOでデータを新規登録(INSERT)

今回はデータベースの基本操作である生成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち、PDOで生成(INSERT)行う方法です。MySQL、PostgreSQL、SQLiteの3種類のデータベースを使い、それぞれの場合に分けて解説します。

この記事のポイント

  • PDOを使ってデータベースにデータを登録する
  • データベースの種類別にデータを登録する方法が分かる
  • パラメータ形式でデータを登録する

目次

PDOを使ってデータを登録する

今回は新しくデータを登録する方法を解説していきます。

前提として、3種類のデータベースには全て「test」というデータベースがあり、次の構造を持つuser_listテーブルがあることとします。

テーブル名:user_list
カラム名その他
id整数主キー
name文字列
age整数
registry_datetime日付(またはタイムスタンプ)

なお、PDOの基本的な紹介については「PDOについて」を、データベースへの接続については「PDOを使ってデータベースへ接続」をご覧ください。

PDOでデータを登録する方法

まずはPDOでデータを登録する方法から解説します。
SQL文の内容は各データベースで異なりますが、PDOの実行の流れは共通です。

データの登録は専用のメソッドがあるわけではなく、SQLのINSERT文を実行して登録する方法になります。
そのため、今回はデータ登録(INSERT)のみ行いますが、その他の参照(SELECT)、更新(UPDATE)、削除(DELETE)についても処理の流れ自体は同じです。

PDOでデータを登録する流れ

// (1)SQLを作成
$sql = "INSERT INTO tablename (
	column1, column2, column3, column4
) VALUES (
	10, 'Value2', 'Value3', '2017-11-10 10:00:00'
)";

// (2)SQL実行(データ登録)
$res = $dbh->query($sql);
// $dbhにはデータベースのハンドラ(PDOインスタンス)が入っている

queryメソッドが実行され、データ登録に成功するとPDOStatementを返し、失敗した場合はfalseを返します。
それでは実際に、それぞれのデータベースごとにデータ登録を実行していきましょう。

MySQL/MariaDBへのデータ登録

まずはMySQLからデータ登録を行っていきます。

実行するSQLは次のような形です。
変数$dateには日時が入ります。

実行するSQLの例

// SQLを作成
$sql = "INSERT INTO user_list (
	name, age, registry_datetime
) VALUES (
	'テスト二郎', 18, '$date'
)";

それではこのSQL文を実際に実行してみましょう。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$sql = null;
$res = null;
$dbh = null;
$date = date('Y-m-d H:i:s');

try {
	// DBへ接続
	$dbh = new PDO('mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age, registry_datetime
	) VALUES (
		'テスト太郎', 18, '$date'
	)";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

成功した時の返り値

object(PDOStatement)#2 (1) { ["queryString"]=> string(116) "INSERT INTO user_list ( name, age, registry_datetime ) VALUES ( 'テスト二郎', 18, '2017-11-12 15:51:28' )" }

失敗した時の返り値

bool(false)

こちらのコードは次の順番に処理を行っています。

  1. (1)変数の初期化 & 現在の日時を取得
  2. (2)データベースへ接続
  3. (3)データを登録するSQLを作成
  4. (4)SQLを実行
  5. (5)接続を解除

(1)では変数の初期化の他に、date_default_timezone_set関数を使ったタイムゾーンの指定と、date関数による現在の日時を取得しています。

(2)でデータベースに接続した後に先述したSQLを生成し、(4)でqueryメソッドからデータ登録を実行。
そして(5)で最後にデータベースとの接続を閉じて終了です。

try文で囲っていますが、INSERT文が文法エラーなどによって実行できなかった場合についてはPDOExceptionなどの例外は投げられません。
このtry文はデータベース接続で起きた場合、もしくはSQL実行時にデータベースがダウンしてしまった時などの場合にエラーメッセージを受け取るために設定しています。

以上がMySQLへのデータ登録の基本的な流れとなります。

PostgreSQLへのデータ登録

続いて、PostgreSQLデータベースへテーブルを作成していきましょう。

データ登録のSQLについてはMySQLと同じ内容で実行できるため、SQLの解説は省略します。
全体の流れも同じです。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$sql = null;
$res = null;
$dbh = null;
$date = date('Y-m-d H:i:s');

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age, registry_datetime
	) VALUES (
		'テスト太郎', 18, '$date'
	)";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

返り値についてもMySQLと同じです。
以上がPostgreSQLへのデータ登録の流れでした。

SQLiteへのデータ登録

最後にSQLiteデータベースへのデータ登録です。

SQLiteについてもMySQLと同じSQLが実行できるため、SQLの解説は省略します。
全体の流れも同じです。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$sql = null;
$res = null;
$dbh = null;
$date = date('Y-m-d H:i:s');

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// SQL作成
	$sql = "INSERT INTO user_list (
		name, age, registry_datetime
	) VALUES (
		'テスト太郎', 18, '$date'
	)";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

厳密にはデータベースに格納される「型」は異なりますが、データを登録するSQLに違いはありません。
SQLiteの場合は日時が「text」になります。

返り値については上記2つのデータベースと同じです。
以上、SQLiteへのデータ登録の流れでした。

プリペアドステートメント(prepare)でパラメータを使ってデータを登録する

ここまでは値を直接指定して登録する方法を紹介してきましたが、最後にプリペアドステートメントを使ってパラメータ形式で登録する方法を紹介します。
この方法はいずれのデータベースでも同様に使用できますが、以下の例ではMariaDBを使います。

プリペアドステートメントでパラメータを指定する方法は「名前付きパラメータ」と「疑問符パラメータ」のいずれかを選ぶことができます。

名前付きパラメータ

「名前付きパラメータ」は、SQLで値をパラメータで渡したい箇所を変数のように「:パラメータ名」の形で記述します。

SQLの例

// SQLを作成
$sql = "INSERT INTO test (
	name, category, create_datetime
) VALUES (
	:name, :category, :create_datetime
)";

それではこのSQL文を実際に実行してみましょう。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$now_datetime = date('Y-m-d H:i:s');
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'INSERT INTO test (
    name, category, create_datetime
) VALUES (
    :name, :category, :create_datetime
)';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array(
    ':name' => 'ウィンターブレンド',
    ':category' => 4,
    ':create_datetime' => $now_datetime
));

// DB接続を解除
$statement = null;
$db_handle = null;

「// SQL実行準備」でSQL文を渡して実行準備をし、「// 値を渡して実行」のexecuteメソッドでそれぞれのパラメータに対応する値を指定します。

実行後に返される結果は登録に成功したら「true」、失敗したら「false」が渡されます。

ちなみに、パラメータと値が対応していれば問題ないため、指定の順番は自由に記述するができます。
例えば、SQL文では「:name」「:category」「:create_datetime」の順で記述されていますが、値を渡すときは「:category」「:create_datetime」「:name」のように異なる順番で指定しても正しくデータを登録することができます。

値の指定例

// 値を渡して実行
$result = $statement->execute( array(
    ':category' => 3,
    ':create_datetime' => $now_datetime,
    ':name' => 'ハウスブレンド デカフェ',
));

疑問符パラメータ

「疑問符パラメータ」は、SQL文の中にパラメータを渡したい箇所に「?」を記述します。

SQLの例

// SQLを作成
$sql = "INSERT INTO test (
	name, category, create_datetime
) VALUES (
	?, ?, ?
)";

パラメータの値は次のように配列形式で渡します。

コード例

<?php

// 変数の初期化 & 日時の取得
date_default_timezone_set('Asia/Tokyo');
$now_datetime = date('Y-m-d H:i:s');
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'INSERT INTO test (
    name, category, create_datetime
) VALUES (
    ?, ?, ?
)';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$result = $statement->execute( array('エメラルドマウンテン', 1, $now_datetime));

// DB接続を解除
$statement = null;
$db_handle = null;

「疑問符パラメータ」は渡した配列の先頭から順に「?」に当てはめていくため、値は正しい順番で指定する必要がある点に注意してください。

以上がパラメータを使ったデータ登録方法です。
今回はSQL文がシンプルなのであまり気になりませんが、「名前付きパラメータ」の方がパラメータと値の関係は分かりやすくなるためオススメです。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。