UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#149 PHPでバルクインサートを行うための`BulkInsert`クラスを定義

記入日:2023-06-06 編集日:2023-06-06

PHPでバルクインサートを行うための`BulkInsert`クラスを定義する方法を解説してみようと思います。

この記事を読むと(約5分)
PHPでバルクインサートを行うための`BulkInsert`クラスを定義する方法をイメージできます。

バルクインサートのクラスを定義

以下のコードは、PHPでバルクインサートを行うための`BulkInsert`クラスを定義し、それを使用するサンプルコードです。

class BulkInsert
{
    private $conn;

    public function __construct($servername, $username, $password, $dbname)
    {
        try {
            $this->conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "データベースに接続しました。";
        } catch(PDOException $e) {
            echo "接続エラー: " . $e->getMessage();
        }
    }

    public function execute($tableName, $columns, $data)
    {
        try {
            $this->conn->beginTransaction();

            // バルクインサートのSQL文を作成します
            $columnNames = implode(', ', $columns);
            $placeholder = '(' . implode(', ', array_fill(0, count($columns), '?')) . ')';
            $placeholders = implode(', ', array_fill(0, count($data), $placeholder));
            $sql = "INSERT INTO $tableName ($columnNames) VALUES $placeholders";
            $stmt = $this->conn->prepare($sql);

            // データをバインドして実行します
            foreach ($data as $row) {
                $stmt->execute($row);
            }

            $this->conn->commit();
            echo "データを挿入しました。";
        } catch(PDOException $e) {
            $this->conn->rollback();
            echo "エラー: " . $e->getMessage();
        }
    }

    public function closeConnection()
    {
        $this->conn = null;
        echo "データベース接続を切断しました。";
    }
}

// 使用例
$bulkInsert = new BulkInsert('localhost', 'ユーザー名', 'パスワード', 'データベース名');

$data = array(
    array('John', 'Doe', 'john@example.com'),
    array('Jane', 'Smith', 'jane@example.com'),
    array('Bob', 'Johnson', 'bob@example.com')
);

$bulkInsert->execute('テーブル名', ['カラム1', 'カラム2', 'カラム3'], $data);

$bulkInsert->closeConnection();

1. BulkInsertクラスの定義:
・ private $conn;: データベース接続用のPDOオブジェクトを保持するプライベート変数です。
・ __construct(): コンストラクタメソッドです。データベースへの接続を確立し、エラーハンドリングを行います。
・ execute(): バルクインサートを実行するメソッドです。引数としてテーブル名、カラム名、データを受け取り、バルクインサートを行います。トランザクションの開始、SQL文の作成、プリペアドステートメントの実行などを行います。
・ closeConnection(): データベース接続を切断するメソッドです。

2. クラスの利用例:
・ new BulkInsert(): BulkInsertクラスのインスタンスを作成します。接続情報(サーバー名、ユーザー名、パスワード、データベース名)を指定します。
・ $data: バルクインサートするデータの配列です。各要素は一つの行を表し、カラムに対応する値が含まれています。
・ $bulkInsert->execute(): execute()メソッドを呼び出してバルクインサートを実行します。テーブル名とカラム名も指定します。
・ $bulkInsert->closeConnection(): closeConnection()メソッドを呼び出してデータベース接続を切断します。

このコードでは、PDOのプリペアドステートメントを使用しており、SQLインジェクション攻撃からの保護が行われています。また、トランザクションを利用してデータの整合性を保証しています。

最終的に、データベース接続の確立や切断、バルクインサートの実行結果などがメッセージとして表示されます。

使用する際には、適切な接続情報やテーブル名、カラム名、データを指定してインスタンスを作成し、execute()メソッドを呼び出すことでバルクインサートを実行します。最後に、closeConnection()メソッドを呼び出してデータベースとの接続を切断します。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。