PDOでINSERTの使い方【PHP】

PHPのPDOで挿入を行うINSERT文の使い方をまとめました。

例で出すサンプルコードで使用するテーブルは、下記のものを使用します。
idはデータ挿入時に自動的に挿入されるAUTO INCREMENTです。

table名:yasai_item
id
(AUTO INCREMENT)
name
(UNIQUE)
price
1 にんじん 50
2 トマト 100
3 きゅうり 80

PDOでのINSERT文の書き方

PDOでINSERT文を実行する方法は大きく分けて2つあります。

  • query
  • prepare→execute

queryとprepareを使用したINSERT文の実行方法をそれぞれで解説していきます。

query

1行の挿入

queryは、実行するINSERT文がソースコード上で既に決まっている場合に使用します。

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('ナス', 70)";
$sth = $pdo -> query($sql);

今回はソースコード上で商品名の「ナス」と値段の「70」を直接書いてINSERTしました。

文字列を挿入する場合は、VALUESにシングルクオーテーション、またはダブルクオーテーションで囲う必要があります。

実行すると、ナスと70がしっかり挿入されていることが分かります。

id
(AUTO INCREMENT)
name price
1 にんじん 50
2 トマト 100
3 きゅうり 80
4 ナス 70

複数行の挿入

複数行を挿入する場合は、VALUEの後にカンマ区切りで追加したいデータを入力します。

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('ナス', 70),
        ('ブロッコリー', 120)";
$sth = $pdo -> query($sql);

変数をINSERT文に組み込む場合の注意点

変数を使用したい場合は、文字列連結でも対応できます。(文字列は囲う必要があるので注意)

$item = 'ナス';
$price = 70;
$sql = "INSERT
        yasai_item
        (name, price)
        VALUES
        ('".$item."', ".$price.")";
$sth = $pdo -> query($sql);

ただし、この場合に文字列連結で組み込む変数は、外部のユーザーから取得した値を何の検証もせずに組み込むと、SQLインジェクション攻撃を受ける可能性があります。

//やってはいけない例 $_GETなどでユーザーから入力された値を文字列連結で組み込む
$item = $_GET['item'];
$price = $_GET['price'];
$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('".$item."', ".$price.")";
$sth = $pdo -> query($sql);

参考 PHPでSQLインジェクション攻撃の対策方法【PDO】

ユーザーから入力された値を挿入したい場合(そのほうが多くなると思いますが)、後述のprepareを使用してください。

prepare→execute

prepareは、SQL文を一度実行準備を行い、その後に変数を当てはめて実行できる機能です。

参考 PDOでprepareの使い方【PHP】

  • prepare()でクエリの実行準備
  • bindValue()でクエリ内の値を設定
  • execute()で挿入の実行

という流れでINSERTを行います。

実行準備の段階でINSERT文と認識するため、SQLインジェクション攻撃のようにクエリを改ざんされることがありません。
そのため、セキュリティに強いprepareからクエリを実行する方が基本的にオススメです。

1行の挿入

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        (:name, :price)";
//実行準備
$sth = $pdo -> prepare($sql);
//クエリのパラメータに合わせて値を組み込む
$sth -> bindValue(':name', 'ナス');
$sth -> bindValue(':price', 70);
//組み込み後のSQL文を実行
$sth -> execute();

コロン付きのパラメータで、のちに代入する値を指定しておきます。
その後、bindValueで値を設定後、executeでクエリが実行されます。

複数行の挿入

複数行を挿入する場合は、bindValueで置き換えるコロン付きパラメータを命名をしっかり行毎に変えておきましょう。

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        (:name1, :price1),
        (:name2, :price2)";
//実行準備
$sth = $pdo -> prepare($sql);
//クエリのパラメータに合わせて値を組み込む
$sth -> bindValue(':name1', 'ナス');
$sth -> bindValue(':price1', 70);
$sth -> bindValue(':name2', 'ブロッコリー');
$sth -> bindValue(':price2', 120);
//組み込み後のSQL文を実行
$sth -> execute();

もっと大量のデータをprepareから挿入する場合は、配列にデータを入れてforeachで繰り返す書き方がオススメです。

参考 【PHP】PDOのprepareで複数行を一括INSERTする方法

INSERTしたidを取得するlastInsertId

AUTO INCREMENTかつプライマリキーが設定されたカラムが存在する場合、挿入したidを取得できるlastInsertIdというメソッドがあります。

参考 【PHP】PDOのINSERT文で挿入されたIDを取得するlastInsertIdの使い方

今回のサンプルテーブルでは、「id」がそれに該当するため、挿入後にidの値を取得できます。

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('ナス', 70)";
$sth = $pdo -> query($sql);
$id = $pdo -> lastInsertId();
echo $id; // ⇒ 4

次に挿入するデータは4つ目なので、idの値である4を取得できました。

結果セットのオブジェクト$sthではなく、大元のPDOオブジェクト$pdoから取得できる機能なのでご注意ください。

挿入されたデータ件数を取得するrowCount

INSERTした結果、挿入された件数を取得できるrowCount()というメソッドがあります。

参考 【PHP】PDOで件数を取得するrowCountの使い方

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('ナス', 70),
        ('ブロッコリー', 120)";
$sth = $pdo -> query($sql);
$count = $sth -> rowCount();
echo $count; // ⇒ 2

INSERTで2件のデータを挿入したため、rowCountで2を取得できました。

重複するデータがある場合は無視するIGNORE

INSERT時に、UNIQUE制約などで同じデータがテーブル上に存在しないよう設計されているテーブルは、「INSERT IGNORE~」と入力することで、重複するデータが存在する場合は無視することが出来ます。

今回のテーブルでは、「name」にUNIQUE制約を設けています。
なので、同じ野菜の名前は挿入されないように、IGNOREを使用してみましょう。

$sql = "INSERT IGNORE INTO
        yasai_item
        (name, price)
        VALUES
        ('きゅうり', 70)";
$sth = $pdo -> query($sql);
echo $sth -> rowCount(); // ⇒ 0

「きゅうり」は既に存在するため、UNIQUE制約にひっかかり、IGNORE文で無視されました。
結果、件数を取得するrowCountでは0となります。

重複するデータがある場合は更新するON DUPLICATE KEY UPDATE

重複しているデータが既にある場合はUPDATE、ない場合はINSERT文を1つのクエリで行う「ON DUPLICATE KEY UPDATE」という機能もあります。

参考 【PHP】PDOで「ON DUPLICATE KEY UPDATE」の使い方

今回のテーブルでは、「name」にUNIQUE制約を設けています。
なので、既に存在する「きゅうり」を挿入しようとした場合は、挿入は行わず「値段」を変更する、という処理を行ってみます。

$sql = "INSERT INTO
        yasai_item
        (name, price)
        VALUES
        ('きゅうり', 70)
        ON DUPLICATE KEY UPDATE 
        price = VALUES(price)";
$sth = $pdo -> query($sql);

このクエリを実行すると、データを挿入されず、「きゅうり」の列の「price」が80⇒70に変更されます。

id name price
1 にんじん 50
2 トマト 100
3 きゅうり 70

PDOのINSERTの使い方と、それに関わる機能やメソッドについてまとめました。

INSERT文の書き方に迷った時、この記事が参考になれば幸いです。

以上、PDOでINSERTの使い方、でした。

PHP