PHPを使って複数の配列をPDOによるSQLのINSERT文で簡潔に挿入する方法。

 今日のタイトルを見て妻に暗号だなと言われたいまがーです、おはようございます。

 

 

今日はかなり技術に寄った話。というか、PHPのコーディングの話なので、PHPって何それ?って人は旅行記でもどうぞ! 笑

 

で、本題。最近のコーディングで引っかかったポイント。

PHPのマニュアル読めば普通に書いてあったことなのだけど、思い込みでそんな方法でできるとは全く思っていなかったこと。

 

それは、PHPを使ってPDOによるSQLのINSERT文で配列データを複数同時挿入したいときの話。

 

一般的にPDO接続でINSERTするときは、

 

$sql = "$INSERT INTO hoge_table (hoge, hogehoge) VALUES(:hoge, :hogehoge)";

$sth $dbh->prepare($sql);

$sth->bindParam(':hoge'$hogePDO::PARAM_INT);
$sth->bindValue(':hogehoge'"%{$hogehoge}%");
$sth->execute();

 

として、bindParam等で一つずつ値を指定してあげることが多い。

しかし、これができるのはあくまで値がすべて定まっていたときのみ。もし挿入したい値が配列で、しかも複数のデータを一括で挿入したいときだったらどうしたらいいのか。そこでしばらく悩んだ。

単に配列データが一つなら配列から取り出して格納し直して入れてもいい。だけど複数のデータとなるとそれを全て格納し直すのはナンセンスだし、そもそもデータ数が決まっていなかったりすればかなり面倒になる。なのでなるべく簡潔にする方法を探った。

 

その解決法は、以下。

まず、配列にデータを格納する際にキーをVALUESの型(「:hoge」のような型)に指定しておく。複数のデータを配列に格納する方法はどんな方法でもいいけれど、今回はforeachでぶん回して受け取った値を順に入れていく。

foreach ($hoge as $val1){
   foreach ($hogehoge as $val2){
$hoge_array[] = array(':hoge'=>$val1, ':hogehoge'=>$val2);
   }
}

 

あとはbindParamは使わずに以下のようにそのままexecuteするだけ。その際にexecute後の()に配列をそのまま渡してあげればいい。

ただ、それだと配列全てが入らないのでそれもforeachで回してあげる。配列が一つなら回す必要はない。

 

$sql = "$INSERT INTO hoge_table (hoge, hogehoge) VALUES(:hoge, :hogehoge)";

$sth $dbh->prepare($sql);

foreach ($hoge_array as $insert){

$sth->execute($insert);

}

 

たったこれだけのことで簡潔にかける。こんな書き方が出来るとは恥ずかしいことに全く知らなかった。もし同じようなことで悩んでいる人がいたら、参考になれば幸い。

 

ちなみに、私のPHPは全て独学なので、これを見てもしこれは違うよとか、これはこうした方がいいよ、という指摘がありましたら、是非教えてください。

 

 

 

では、今日はここら辺で。