PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

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

データベースの基本操作である作成(INSERT)、取得(SELECT)、更新(UPDATE)、削除(DELETE)のうち、作成(INSERT)行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースそれぞれの場合に分けて解説します。

この記事のポイント

  • PDOを使って各種データベースにデータを登録する
  • 登録するデータはプリペアドステートメントを使う

目次

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

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

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

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

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

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

まずはPDOでデータを登録する方法から解説します。
SQLは使うデータベースによって異なりますが、PDOの実行の流れは共通です。

データの登録はSQLのINSERT文をPDOのプリペアドステートメントを実行して登録します。
今回はデータ登録(INSERT)のみ行いますが、その他の取得(SELECT)、更新(UPDATE)、削除(DELETE)についても処理の流れ自体は同じです。

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

<?php

// (1) 登録するデータを用意
$name = '山田太郎';
$age = 30;
$created_at = '2021-06-24 11:20:00';

// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');

// (3) SQL作成
$stmt = $pdo->prepare("INSERT INTO user_list (
	name, age, created_at
) VALUES (
	:name, :age, :created_at
)");

// (4) 登録するデータをセット
$stmt->bindParam( ':name', $name, PDO::PARAM_STR);
$stmt->bindParam( ':age', $age, PDO::PARAM_STR);
$stmt->bindParam( ':created_at', $created_at, PDO::PARAM_STR);

// (5) SQL実行
$res = $stmt->execute();

// (6) データベースの接続解除
$pdo = null;

(5)のexecuteメソッドを実行してデータの登録に成功するとtrueを返し、失敗した場合はfalseを返します。
以降はそれぞれのデータベースごとにデータ登録を実行していきます。

MySQL / MariaDBへのデータ登録

まずはMySQLとMariaDBからデータ登録を行っていきます。
この2つのデータベースは同じ方法を使うことができます。

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

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

コード例

<?php

// (1) 登録するデータを用意
date_default_timezone_set('Asia/Tokyo');
$name = '山田太郎';
$age = 30;
$created_at = date('Y-m-d H:i:s');

// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');

// (3) SQL作成
$stmt = $pdo->prepare("INSERT INTO user_list (
	name, age, created_at
) VALUES (
	:name, :age, :created_at
)");

// (4) 登録するデータをセット
$stmt->bindParam( ':name', $name, PDO::PARAM_STR);
$stmt->bindParam( ':age', $age, PDO::PARAM_STR);
$stmt->bindParam( ':created_at', $created_at, PDO::PARAM_STR);

// (5) SQL実行
$res = $stmt->execute();

// (6) データベースの接続解除
$pdo = null;

成功した時の返り値

bool(true)

失敗した時の返り値

bool(false)

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

  1. (1) 登録するデータを用意
  2. (2) データベースに接続
  3. (3) SQL作成
  4. (4) 登録するデータをセット
  5. (5) SQL実行
  6. (6) データベース接続解除

(1)では変数の初期化の他に、date_default_timezone_set関数を使って取得する時刻のタイムゾーンを指定しています。
Asia/Tokyo」を指定しているため、date関数で取得する時刻は東京のタイムゾーンになります。

(2)はPDOオブジェクトのインスタンス作成と同時に、データベースへの接続を行います。
ここではPDOのDSN接頭辞「mysql」と使用する文字コード、接続するデータベースのホスト名、データベース名、ユーザー名、パスワードの合計6つを指定しています。
PDOではMySQLとMariaDBはいずれも同じDSN接頭辞「mysql」を使用することができます。

続いて、(3)ではprepareメソッドに実行したいSQLを登録します。
今回はデータ登録なのでINSERT文を記述しています。
また、登録する値は直接SQLに記述するのではなく、プリペアドステートメントを使うため「:name」など「:(コロン)」から始まる「プレースホルダー」を使います。

SQLのプレースホルダーは、(4)でbindParamメソッドを使って値を設定します。
bindParamメソッドは第1パラメータにプレースホルダー名、第2パラメータにセットする値、そして第3パラメータに登録するデータの型を指定します。
第3パラメータについてはオプションのため指定しないで実行することも可能です。

データの型の指定はあらかじめ用意されている「定義済み定数」を使います。
文字列であれば「PDO::PARAM_STR」、数値のときは「PDO::PARAM_INT」など、登録する値によって使い分けます。
定義されている定数についてより詳しくは「php.net」の以下のURLを参照してください。
PHP:定義済み定数 – php.net

(5)では、ここまで用意してきたプリペアドステートメントをexecuteメソッドより実行します。
そして最後に(6)で変数$pdonullをセットしてデータベースとの接続を解除します。

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

PostgreSQLへのデータ登録

続いて、PostgreSQLのデータベースにデータを登録していきましょう。

データを登録するSQLは上記のMySQLと同じ内容になるため解説は省略します。
データベース接続の箇所など記述が異なる部分もありますが、全体の流れも全く同じです。
赤字のコードは変更箇所になります。

コード例

<?php

// (1) 登録するデータを用意
date_default_timezone_set('Asia/Tokyo');
$name = '山田太郎';
$age = 30;
$created_at = date('Y-m-d');

// (2) データベースに接続
$pdo = new PDO('pgsql:dbname=test;options=\'--client_encoding=UTF8\';host=localhost', 'username', 'password');

// (3) SQL作成
$stmt = $pdo->prepare("INSERT INTO user_list (
	name, age, created_at
) VALUES (
	:name, :age, :created_at
)");

// (4) 登録するデータをセット
$stmt->bindParam( ':name', $name, PDO::PARAM_STR);
$stmt->bindParam( ':age', $age, PDO::PARAM_STR);
$stmt->bindParam( ':created_at', $created_at, PDO::PARAM_STR);

// (5) SQL実行
$res = $stmt->execute();

// (6) データベースの接続解除
$pdo = null;

MySQLのときと異なる点は、(1)でdate関数から日付を取得するときに「年月日(Y-m-d)」のみに変更している点と、(2)のデータベース接続部分です。
特に(2)では使用するデータベースにあわせてDSN接頭辞を「pgsql」に変更する必要があるため重要なポイントです。

使用する文字コードの指定方法も異なります。
PostgreSQLでは「options='–client_encoding=UTF8'」で指定します。
また、指定するときに「'」の前に「\」でエスケープしています。

返り値はMySQLと同様に成功したらtrue、失敗したときはfalseが渡されます。

以上がPostgreSQLへのデータ登録でした。

SQLiteへのデータ登録

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

SQLiteについても実行するSQLはこれまでと同じ内容になるため解説は省略します。
全体の流れも同じです。

コード例

<?php

// (1) 登録するデータを用意
date_default_timezone_set('Asia/Tokyo');
$name = '山田太郎';
$age = 30;
$created_at = date('Y-m-d H:i:s');

// (2) データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.sqlite3');

// (3) SQL作成
$stmt = $pdo->prepare("INSERT INTO user_list (
	name, age, created_at
) VALUES (
	:name, :age, :created_at
)");

// (4) 登録するデータをセット
$stmt->bindParam( ':name', $name, PDO::PARAM_STR);
$stmt->bindParam( ':age', $age, PDO::PARAM_STR);
$stmt->bindParam( ':created_at', $created_at, PDO::PARAM_STR);

// (5) SQL実行
$res = $stmt->execute();

// (6) データベースの接続解除
$pdo = null;

データの型はデータベースによって異なりますが、データを登録するSQL自体には違いはありません。
SQLiteの場合、日時は「text」になります。

返り値については上記2つのデータベースと同じで論理値のtruefalseです。
以上がPDOを使ってSQLiteのデータベースにデータを登録する流れになります。