PHPプログラミング

最終更新日:
公開日:

レシピ

データベース MySQL / MariaDB

mysqliでMySQL/MariaDBにデータを登録:INSERT

MySQLiクラスのオブジェクトや関数を使って、データベースに新しいデータを登録する方法を解説していきます。

この記事のポイント

  • MySQLiクラスのオブジェクトや関数を使ってMySQL / MariaDBのデータベースに新しくデータを登録する
  • データの登録ではプリペアドステートメントを使う
  • オブジェクト、または関数(手続き型)を使った2通りの方法を解説

目次

データベースに新しくデータを登録する

MySQLiクラスのオブジェクトや関数とSQLのINSERT文を使って、データベースに新しくデータを登録していきます。
今回は次のようなuserテーブルを使って進めていきます。

テーブル名:user
idnamegenderagemodify_datetimecreate_datetime
1青山 太郎1352016-10-04 00:00:002014-04-10 00:00:00
2飯島 彩子2262016-10-02 00:00:002014-04-10 00:00:00
3宇多 太郎1272016-10-01 00:00:002014-04-10 00:00:00
4江藤 彩子2322016-09-20 00:00:002015-08-07 00:00:00
5大島 太郎1222016-09-03 00:00:002012-10-05 00:00:00
6加藤 彩子2412016-09-18 00:00:002012-04-20 00:00:00
7岸田 太郎1272016-09-18 00:00:002012-04-20 00:00:00
8工藤 彩子2392016-10-01 00:00:002012-05-10 00:00:00
9小島 太郎1302016-09-10 00:00:002012-04-20 00:00:00
10佐藤 彩子2322016-09-24 00:00:002012-05-15 00:00:00

各カラムの役割は次の通りです。

  • id – ID(主キー、AUTO INCREMENT)
  • name – 名前
  • gender – 性別。1は男性、2は女性
  • age – 年齢
  • modify_datetime – データ更新日時
  • create_datetime – データ登録日時

まず、データを登録するためのSQLであるINSERT文の基本的な形を確認しましょう。

オブジェクト型のコード例

INSERT INTO テーブル名 (
	カラム1, カラム2, カラム3
) VALUES (
	'カラム1の値','カラム2の値','カラム3の値'
);

テーブル名、データを登録するカラム名、値の順にそれぞれ記述します。
今回のuserテーブルに置き換えると以下のようになります。

オブジェクト型のコード例

INSERT INTO user (
	name, gender, age, modify_datetime, create_datetime
) VALUES (
	'山田 健太', 1, '25', '2021-11-30', '2018-09-20'
);

このSQLを元に、MySQLiクラスのオブジェクトと関数(手続き型)の2つのパターンを使った方法を見ていきます。
どちらの方法でもSQLを実行するときはプリペアドステートメントを使います。

今回の方法はMySQL、MariaDBのいずれも同じコードで動作します。

なお、データベースへの接続までは「mysqliを使ってMySQL/MariaDBのデータベースへ接続」と同様です。
詳しくはこちらの記事をご覧ください。

オブジェクトを使った書き方

まずはMySQLiクラスのオブジェクトを使った書き方から見ていきます。

index.php

// (1)登録するデータを用意
$name = '山田 健太';
$gender = 1;
$age = 25;
$modify_datetime = '2021-11-30';
$create_datetime = '2018-09-20';

// (2)データベースと接続
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

// (3)文字コードを設定
$mysqli->set_charset('utf8');

// (4)プリペアドステートメントの用意
$stmt = $mysqli->prepare('INSERT INTO user (
	name, gender, age, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)');

// (5)登録するデータをセット
$stmt->bind_param('siiss', $name, $gender, $age, $modify_datetime, $create_datetime);

// (6)登録実行
$stmt->execute();

// (7)データベースとの接続解除
$mysqli->close();

新しいデータを登録した後のuserテーブルを出力してみると、以下のように新しいデータが1件登録されていることがわかります。

userテーブル

+----+---------------+--------+-----+---------------------+---------------------+
| id | name          | gender | age | modify_datetime     | create_datetime     |
+----+---------------+--------+-----+---------------------+---------------------+
|  1 | 青山 太郎     |      1 |  35 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
|  2 | 飯島 彩子     |      2 |  26 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
|  3 | 宇多 太郎     |      1 |  27 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
|  4 | 江藤 彩子     |      2 |  32 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
|  5 | 大島 太郎     |      1 |  22 | 2016-09-03 00:00:00 | 2012-10-05 00:00:00 |
|  6 | 加藤 彩子     |      2 |  41 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
|  7 | 岸田 太郎     |      1 |  27 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
|  8 | 工藤 彩子     |      2 |  39 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
|  9 | 小島 太郎     |      1 |  30 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
| 10 | 佐藤 彩子     |      2 |  32 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
| 11 | 山田 健太     |      1 |  25 | 2021-11-30 00:00:00 | 2018-09-20 00:00:00 |
+----+---------------+--------+-----+---------------------+---------------------+

最初の(1)では新しく登録するデータの各カラムの値を変数に入れます。

続く(2)ではMySQLiクラスのオブジェクトを作成してデータベースの接続を行います。
もし接続にエラーがあった場合は、if文の中にあるecho関数でエラー番号のconnect_errnoプロパティと、エラー内容のconnect_errorプロパティを出力します。

データベースに接続

// (2)データベースと接続
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

続いて(3)ではset_charsetメソッドを使ってデータベースの文字コードを指定します。

文字コードの設定

// (3)文字コードを設定
$mysqli->set_charset('utf8');

(4)はprepareメソッドにSQLを渡してプリペアドステートメントを実行する準備をします。
この時点では登録するデータの値は指定せず、プレースホルダーの「?」を記述します。
このプレースホルダーは(5)でbind_paramメソッドを使って登録するデータの値をセットします。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = $mysqli->prepare('INSERT INTO user (
	name, gender, age, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)');

// (5)登録するデータをセット
$stmt->bind_param('siiss', $name, $gender, $age, $modify_datetime, $create_datetime);

bind_paramメソッドのパラメーター(引数)には(1)で用意した変数の前に「siiss」という文字があります。
これは先ほどのプレースホルダーを変数の値に置き換えるときのデータの型を指定するものです。
s」はstring(文字列)の頭文字、「i」はinteger(整数)の頭文字になります。

今回はプレースホルダーが5つあるので、先頭から順に「s <= $name」、「i <= $gender」、「i <= $age」、「s <= $modify_datetime」、「s <= $create_datetime」と対応させていることになります。

(6)で、ここまで用意したプリペアドステートメントを実行して新しくデータを登録します。
この時点でuserテーブルに新しくデータが1件追加されます。

プリペアドステートメントを実行

// (6)登録実行
$stmt->execute();

最後にデータベースとの接続を解除して終了します。

データベースとの接続解除

// (7)データベースとの接続解除
$mysqli->close();

以上がMySQLiクラスのオブジェクトを使ったデータの登録方法でした。

mysqli系の関数(手続き型)を使った書き方

続いて、mysqli系の関数(手続き型)を使ってデータを登録する方法を見ていきます。
オブジェクトを関数に置き換えるだけなので、全体的な流れやSQL自体は先述のオブジェクトを使った方法と同じ内容です。

index.php

// (1)登録するデータを用意
$name = '上野 涼子';
$gender = 2;
$age = 28;
$modify_datetime = '2021-11-30';
$create_datetime = '2018-09-22';

// (2)データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// (3)文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

// (4)プリペアドステートメントの用意
$stmt = mysqli_prepare( $db_link, 'INSERT INTO user (
	name, gender, age, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'siiss', $name, $gender, $age, $modify_datetime, $create_datetime);

// (6)登録実行
mysqli_stmt_execute($stmt);

// (7)データベースとの接続解除
mysqli_close($db_link);

新しいデータを登録した後のuserテーブルを出力すると、以下のように新しいデータが1件追加されていることがわかります。

userテーブル

+----+---------------+--------+-----+---------------------+---------------------+
| id | name          | gender | age | modify_datetime     | create_datetime     |
+----+---------------+--------+-----+---------------------+---------------------+
|  1 | 青山 太郎     |      1 |  35 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
|  2 | 飯島 彩子     |      2 |  26 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
|  3 | 宇多 太郎     |      1 |  27 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
|  4 | 江藤 彩子     |      2 |  32 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
|  5 | 大島 太郎     |      1 |  22 | 2016-09-03 00:00:00 | 2012-10-05 00:00:00 |
|  6 | 加藤 彩子     |      2 |  41 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
|  7 | 岸田 太郎     |      1 |  27 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
|  8 | 工藤 彩子     |      2 |  39 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
|  9 | 小島 太郎     |      1 |  30 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
| 10 | 佐藤 彩子     |      2 |  32 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
| 11 | 山田 健太     |      1 |  25 | 2021-11-30 00:00:00 | 2018-09-20 00:00:00 |
| 12 | 上野 涼子     |      2 |  28 | 2021-11-30 00:00:00 | 2018-09-22 00:00:00 |
+----+---------------+--------+-----+---------------------+---------------------+

最初の(1)では新しく登録するデータの各カラムの値を変数に入れます。

続く(2)ではmysqli_connect関数を実行してデータベースの接続を行います。
関数を実行するとデータベースの接続情報が返されるので、変数$db_linkで受け取ります。

もし接続にエラーがあった場合は、if文の中にあるecho関数mysqli_connect_errno関数からエラー番号と、mysqli_connect_error関数からエラー内容をそれぞれ取得して出力します。

データベースに接続

// (2)データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

続いて(3)ではmysqli_set_charset関数を使ってデータベースの文字コードを指定します。
関数を使った方法では、データベースに関連する操作を実行する関数は第1引数にデータベースの接続情報(オブジェクト)を渡す必要があります。

文字コードの設定

// (3)文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

(4)はmysqli_prepare関数にSQLを渡してプリペアドステートメントを実行する準備をして、続く(5)でmysqli_stmt_bind_param関数を使って登録するデータの値をセットします。
プレースホルダーを使ったSQLの記述と値のセットについては先述のオブジェクトを使った書き方と同様です。

プリペアドステートメントの用意

// (4)プリペアドステートメントの用意
$stmt = mysqli_prepare( $db_link, 'INSERT INTO user (
	name, gender, age, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)');

// (5)登録するデータをセット
mysqli_stmt_bind_param( $stmt, 'siiss', $name, $gender, $age, $modify_datetime, $create_datetime);

ここまで用意したプリペアドステートメントを(6)で実行し、新しくデータを登録します。
この時点でuserテーブルに新しくデータが1件追加されます。

プリペアドステートメントを実行

// (6)登録実行
$stmt->execute();

最後にデータベースとの接続を解除して終了します。

データベースとの接続解除

// (7)データベースとの接続解除
$mysqli->close();

以上がmysqli系の関数(手続き型)を使ったデータの登録方法になります。

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

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

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