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', $hoge, PDO::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は全て独学なので、これを見てもしこれは違うよとか、これはこうした方がいいよ、という指摘がありましたら、是非教えてください。
では、今日はここら辺で。