PHPプログラミング

ベストプラクティス

データベース PDO その5

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

  • このエントリーをはてなブックマークに追加

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

目次

  1. #  PDOを使ってデータを登録する
  2. #  PDOでデータを登録する方法
  3. #  MySQLへのデータ登録
  4. #  PostgreSQLへのデータ登録
  5. #  SQLiteへのデータ登録

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

今回は新しくデータを登録する方法を解説していきます。
次のような方が対象です。

  • データベースにデータを登録する基本的なSQLを確認したい
  • PDOを使ってデータベースにデータを登録したい
  • MySQL/PostgreSQL/SQLiteのそれぞれにPDOでデータを登録する方法を知りたい

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

テーブル名: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へのデータ登録

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

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

実行するSQL文の例

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

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

index.php

<?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の解説は省略します。
全体の流れも同じです。

index.php

<?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の解説は省略します。
全体の流れも同じです。

index.php

<?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において違いはありません。
上のSQLの場合は日時が「text」になります。

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

  • このエントリーをはてなブックマークに追加