トップへ(mam-mam.net/)

PHPでPDOでMariaDB(MySQL)テーブルへの挿入更新削除抽出 ~サンプルソースコード

検索:

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 |
+----+------+------------+--------+---------+---------------------+---------------------+

引数など

bindValueで指定できる主な定数

$stmt->bindValue(パラメータ名又はID,値,);

PDO::PARAM_BOOL
ブール型
PDO::PARAM_INT
整数型(SMALLINT, INT, BIGINTなど)
PDO::PARAM_STR
文字列型(CHAR,VARCHARなど)

fetchで指定できる主な定数

$stmt->fetch(レコードを呼び出し元に返す方法));

PDO::FETCH_ASSOC
カラム名と同じキーを付けた連想配列として各行を返す
PDO::FETCH_NUM
0から始まるカラム番号と同じ添字を付けた配列として各行を返す
PDO::FETCH_BOTH
カラム名と同じキーと0から始まるカラム番号の両方が合体した配列として各行を返す
(つまり各カラムが2つずつ返される)