PHPでPDOでMariaDB(MySQL)テーブルへの挿入更新削除抽出 ~サンプルソースコード
PHPでPDOでMariaDB(MySQL)データベースのテーブルへのレコードの挿入、削除、更新、抽出をサンプルソースコードとともに解説します。
テーブルの構造
テーブルの構造は以下としてサンプルを提示します。
CREATE TABLE t_test(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(40),
birth DATE,
tall DECIMAL(5,2),
section INT,
up_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
reg_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY idx_t_test_id(id)
) ENGINE=InnoDB DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
+----------+--------------+------+-----+---------------------+-------------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------------------+-------------------------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| birth | date | YES | | NULL | |
| tall | decimal(5,2) | YES | | NULL | |
| section | int(11) | YES | | NULL | |
| up_date | datetime | NO | | current_timestamp() | on update current_timestamp() |
| reg_date | datetime | NO | | current_timestamp() | |
+----------+--------------+------+-----+---------------------+-------------------------------+
レコードを挿入
executeでパラメータを渡してレコードを挿入
$stmt->execute(パラメータ配列);
でパラメータ配列を渡してレコード挿入(INSERT INTO)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"INSERT INTO t_test(name, birth, tall, section) VALUES(?, ?, ?, ?)"
);
$stmt->execute( ["佐藤", "2001-01-01", 175.2, 1] );
$stmt->execute( ["森", "2002-02-02", 165, 2] );
$stmt->execute( ["林", "2003-03-03", 170.1, 3] );
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 1 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 3 | 2024-02-14 11:11:15 | 2024-02-14 11:11:15 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで疑問符プレースホルダで値を渡してレコードを挿入
$stmt->bindValue(1から始まるパラメータID,値,型);
$stmt->execute();
でパラメータを渡してレコード挿入(INSERT INTO)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"INSERT INTO t_test(name, birth, tall, section) VALUES(?, ?, ?, ?)"
);
//1つ目のパラメータに文字列として値をバインド
$stmt->bindValue(1, "田中", PDO::PARAM_STR);
//2つ目のパラメータに文字列として値をバインド
$stmt->bindValue(2, "2004-04-04", PDO::PARAM_STR);
//3つ目のパラメータに文字列として値をバインド
$stmt->bindValue(3, 160.20, PDO::PARAM_STR);
//4つ目のパラメータに整数として値をバインド
$stmt->bindValue(4, 2, PDO::PARAM_INT);
$stmt->execute();
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 1 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 3 | 2024-02-14 11:11:15 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 160.20 | 2 | 2024-02-14 11:11:56 | 2024-02-14 11:11:56 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで名前付きプレースホルダで値を渡してレコードを挿入
$stmt->bindValue(パラメータ名,値,型);
$stmt->execute();
でパラメータを渡してレコード挿入(INSERT INTO)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"INSERT INTO t_test(name, birth, tall, section) VALUES(:name, :birth, :tall, :section)"
);
//nameパラメータに文字列として値をバインド
$stmt->bindValue("name", "伊藤", PDO::PARAM_STR);
//birthパラメータに文字列として値をバインド
$stmt->bindValue("birth", "2005-05-05", PDO::PARAM_STR);
//tallパラメータに文字列として値をバインド
$stmt->bindValue("tall", 181.505, PDO::PARAM_STR);
//sectionパラメータに整数として値をバインド
$stmt->bindValue("section", 3, PDO::PARAM_INT);
$stmt->execute();
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 1 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 3 | 2024-02-14 11:11:15 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 160.20 | 2 | 2024-02-14 11:11:56 | 2024-02-14 11:11:56 |
| 5 | 伊藤 | 2005-05-05 | 181.51 | 3 | 2024-02-14 11:12:41 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
レコードを更新
executeでパラメータを渡してレコードを更新
$stmt->execute(パラメータ配列);
でパラメータ配列を渡してレコード更新(UPDATE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"UPDATE t_test SET section=? WHERE id=?"
);
$stmt->execute( [1, 3] );
$stmt->execute( [2, 2] );
$stmt->execute( [3, 1] );
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 3 | 2024-02-14 11:16:21 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 160.20 | 2 | 2024-02-14 11:11:56 | 2024-02-14 11:11:56 |
| 5 | 伊藤 | 2005-05-05 | 181.51 | 3 | 2024-02-14 11:12:41 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで疑問符プレースホルダで値を渡してレコードを更新
$stmt->bindValue(1から始まるパラメータID,値,型);
$stmt->execute();
でパラメータを渡してレコード更新(UPDATE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"UPDATE t_test SET tall=? WHERE id=?"
);
//1つ目のパラメータに文字列として値をバインド
$stmt->bindValue(1, 194.4, PDO::PARAM_STR);
//2つ目のパラメータに整数として値をバインド
$stmt->bindValue(2, 4, PDO::PARAM_INT);
$stmt->execute();
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 3 | 2024-02-14 11:16:21 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 194.40 | 2 | 2024-02-14 11:25:47 | 2024-02-14 11:11:56 |
| 5 | 伊藤 | 2005-05-05 | 181.51 | 3 | 2024-02-14 11:12:41 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで名前付きプレースホルダで値を渡してレコードを更新
$stmt->bindValue(パラメータ名,値,型);
$stmt->execute();
でパラメータを渡してレコード更新(UPDATE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"UPDATE t_test SET birth=:birth WHERE id=:id"
);
//birthパラメータに文字列として値をバインド
$stmt->bindValue("birth", "1990-09-09", PDO::PARAM_STR);
//idパラメータに整数として値をバインド
$stmt->bindValue("id", "5", PDO::PARAM_INT);
$stmt->execute();
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 1 | 佐藤 | 2001-01-01 | 175.20 | 3 | 2024-02-14 11:16:21 | 2024-02-14 11:11:14 |
| 2 | 森 | 2002-02-02 | 165.00 | 2 | 2024-02-14 11:11:14 | 2024-02-14 11:11:14 |
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 194.40 | 2 | 2024-02-14 11:25:47 | 2024-02-14 11:11:56 |
| 5 | 伊藤 | 1990-09-09 | 181.51 | 3 | 2024-02-14 11:33:25 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
レコードを抽出
executeでパラメータを渡してレコードを抽出
$stmt->execute(パラメータ配列);
でパラメータ配列を渡してレコード抽出(SELECT)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"SELECT * FROM t_test WHERE id BETWEEN ? AND ?"
);
$stmt->execute( [2, 4] );
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
echo "{$row['id']}, {$row['name']}, {$row['birth']}, {$row['tall']}, {$row['section']}\r\n";
}
2, 森, 2002-02-02, 165.00, 2
3, 林, 2003-03-03, 170.10, 1
4, 田中, 2004-04-04, 194.40, 2
bindValueで疑問符プレースホルダで値を渡してレコードを抽出
$stmt->bindValue(1から始まるパラメータID,値,型);
$stmt->execute();
でパラメータを渡してレコード抽出(SELECT)する例です。
LIMIT(0から数えた行数目, 最大出力行数)で4行目から2行分を出力しています。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"SELECT * FROM t_test LIMIT ? , ?"
);
//1つ目のパラメータに文字列として値をバインド
$stmt->bindValue(1, 3, PDO::PARAM_INT);
//2つ目のパラメータに整数として値をバインド
$stmt->bindValue(2, 2, PDO::PARAM_INT);
$stmt->execute();
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
echo "{$row['id']}, {$row['name']}, {$row['birth']}, {$row['tall']}, {$row['section']}\r\n";
}
4, 田中, 2004-04-04, 194.40, 2
5, 伊藤, 1990-09-09, 181.51, 3
bindValueで名前付きプレースホルダで値を渡してレコードを抽出
$stmt->bindValue(パラメータ名,値,型);
$stmt->execute();
でパラメータを渡してレコード抽出(SELECT)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"SELECT * FROM t_test WHERE name LIKE :name"
);
//birthパラメータに文字列として値をバインド
$stmt->bindValue("name", "%藤%", PDO::PARAM_STR);
$stmt->execute();
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
echo "{$row['id']}, {$row['name']}, {$row['birth']}, {$row['tall']}, {$row['section']}\r\n";
}
1, 佐藤, 2001-01-01, 175.20, 3
5, 伊藤, 1990-09-09, 181.51, 3
レコードを削除
executeでパラメータを渡してレコードを削除
$stmt->execute(パラメータ配列);
でパラメータ配列を渡してレコード削除(DELETE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"DELETE FROM t_test WHERE id BETWEEN ? AND ?"
);
$stmt->execute( [1, 2] );
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
| 4 | 田中 | 2004-04-04 | 194.40 | 2 | 2024-02-14 11:25:47 | 2024-02-14 11:11:56 |
| 5 | 伊藤 | 1990-09-09 | 181.51 | 3 | 2024-02-14 11:33:25 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで疑問符プレースホルダで値を渡してレコードを削除
$stmt->bindValue(1から始まるパラメータID,値,型);
$stmt->execute();
でパラメータを渡してレコード抽出(DELETE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"DELETE FROM t_test WHERE tall BETWEEN ? AND ?"
);
//1つ目のパラメータに文字列として値をバインド
$stmt->bindValue(1, 190, PDO::PARAM_STR);
//2つ目のパラメータに整数として値をバインド
$stmt->bindValue(2, 200, PDO::PARAM_STR);
$stmt->execute();
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
echo "{$row['id']}, {$row['name']}, {$row['birth']}, {$row['tall']}, {$row['section']}\r\n";
}
+----+--------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+--------+------------+--------+---------+---------------------+---------------------+
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
| 5 | 伊藤 | 1990-09-09 | 181.51 | 3 | 2024-02-14 11:33:25 | 2024-02-14 11:12:41 |
+----+--------+------------+--------+---------+---------------------+---------------------+
bindValueで名前付きプレースホルダで値を渡してレコードを削除
$stmt->bindValue(パラメータ名,値,型);
$stmt->execute();
でパラメータを渡してレコード削除(DELETE)する例です。
<?php
$dns="mysql:dbname=接続データベース名;host=ホスト名";
$pdo=new PDO($dns,"ユーザー名", "パスワード");
$pdo->query("SET NAMES utf8mb4");
$stmt=$pdo->prepare(
"DELETE FROM t_test WHERE name LIKE :name"
);
//birthパラメータに文字列として値をバインド
$stmt->bindValue("name", "伊%", PDO::PARAM_STR);
$stmt->execute();
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
echo "{$row['id']}, {$row['name']}, {$row['birth']}, {$row['tall']}, {$row['section']}\r\n";
}
+----+------+------------+--------+---------+---------------------+---------------------+
| id | name | birth | tall | section | up_date | reg_date |
+----+------+------------+--------+---------+---------------------+---------------------+
| 3 | 林 | 2003-03-03 | 170.10 | 1 | 2024-02-14 11:16:19 | 2024-02-14 11:11:15 |
+----+------+------------+--------+---------+---------------------+---------------------+