質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

3626閲覧

PDO bindParamを使った複数行insert方法

TarouMos

総合スコア21

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/10/28 08:46

PDOのbindParamを使った複数行をInsertする手法はどのようにするのでしょうか?
現在、下記のように $inserDate の連想配列に入ったデータを
1行ずつ insert しています。

データ数(insert回数)が増えるととても遅くなるので,
SQLを普通に書いた場合、VALUES部を ',' で繋げて

spl

1INSERT INTO user_info (memberId, name, birthday, nickname) 2 VALUES 3 ("mh0001", "abc" ,"1980/01/01" , "hogehoge"), 4 ("mh0002", "efg" ,"1980/02/01" , "warawara"), 5 : 6 : 7 : 8 ("mh9999", "xyz" ,"1980/12/01" , "gosogoso") 9

このように行う思いますが、下記のようなPDO bindParamを使用した
insert の場合はどのように、実現させれば良いでしょうか?(そもそも、無理?!)

ご教授よろしくお願いいたします。

PHP

1 2$sql = "INSERT INTO user_info (memberId, name, birthday, nickname) "; 3$sql .= "VALUES (:memberId , :name ,:birthday , :nickname)"; 4 5foreach ($inserDate as $rawData){ 6 7 $sqlParams = array( 8 ":memberId" => $rawData['memberId'], 9 ":name" => $rawData['name'], 10 ":birthday" => $rawData['birthday'], 11 ":nickname" => $rawData['nickname'], 12 ); 13 14 $sth = $pdo->prepare($sql); 15 $sth->bindParam(':memberId', $params[':memberId'], PDO::PARAM_STR); 16 $sth->bindParam(':name', $params[':name'], PDO::PARAM_STR); 17 $sth->bindParam(':birthday', $params[':birthday'], PDO::PARAM_STR); 18 $sth->bindParam(':nickname', $params[':nickname'], PDO::PARAM_STR); 19 20 $sth->execute(); 21} 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

このような場合は、bindParamで割り当てようとすると全部バラバラの変数名にしないといけないので、かなり煩雑となります。

?でプレースホルダを用意した上で、

sql

1INSERT INTO user_info (memberId, name, birthday, nickname) 2VALUES (?, ?, ?, ?), (?, ?, ?, ?), (?, ?, ?, ?) 3-- 必要なだけ (?, ?, ?, ?)を繰り返す
  • execute(配列)というかたちで一気に割り当てる(楽だけれど、全て「文字列として」結びつくので、数値系の値は注意が必要)
  • bindValueをループさせて順々に割り当てていく

のどちらかの手段が妥当かと思います。

投稿2017/10/28 08:57

編集2017/10/28 09:00
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

流れ的にはこうです

PHP

1$a=[ 2 ["mh0001", "abc" ,"1980/01/01" , "hogehoge"], 3 ["mh0002", "efg" ,"1980/02/01" , "warawara"], 4 ["mh9999", "xyz" ,"1980/12/01" , "gosogoso"], 5 ]; 6if(count($a)>0){ 7 $sql="INSERT INTO user_info (memberId, name, birthday, nickname) VALUES"; 8 $data=[]; 9 $sql.=implode(",",array_fill(0,count($a),"(?,?,?,?)")); 10 array_walk($a,function($x) use(&$data){$data=array_merge($data,$x);}); 11 print $sql; 12 print_r($data); 13 /* pdo処理 14 $stmt = $pdo->prepare($sql); 15 $stmt->execute($data); 16 */ 17}

投稿2017/10/30 00:52

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問