生PDOの苦手とする部分ですね.何かしらORMを使うのが正解かもしれませんが,初心者さんには少し手出ししにくいと思うので,できるだけ生PDOに小細工をかける程度のスマートな方法を考えてみましょう.
php
1 <?php
2
3 // パラメータをここで定義
4 $parameters = [
5 'KO' => [ 1 , 2 , 3 , 4 ] ,
6 'OTSU' => [ 5 , 6 , 7 , 8 ] ,
7 'HEI' => [ 9 , 10 , 11 , 12 ] ,
8 ] ;
9
10 // プリペアドステートメントを作成
11 $format = 'INSERT INTO XTable(%s) VALUES(%s)' ;
12 $names = array_keys ( $parameters ) ; // ['KO', 'OTSU', 'HEI']
13 $placeholders = array_map (
14 function ( $name ) { return ": $name " ; } ,
15 $names
16 ) ; // [':KO', ':OTSU', ':HEI']
17 $stmt = $pdo -> prepare ( sprintf (
18 $format ,
19 implode ( ',' , $names ) , // 'KO,OTSU,HEI'
20 implode ( ',' , $placeholders ) // ':KO,:OTSU,:HEI'
21 ) ) ; // 'INSERT INTO XTable(KO,OTSU,HEI) VALUES(:KO,:OTSU,:HEI)'
22
23 // 順番にINSERTを実行 ($max = 4)
24 for ( $i = 0 , $max = count ( current ( $parameters ) ) ; $i < $max ; ++ $i ) {
25 foreach ( $parameters as $name => $values ) {
26 // $i = 0 のとき:
27 // $name = 'KO', $values[$i] = 1;
28 // $name = 'OTSU', $values[$i] = 5;
29 // $name = 'HEI', $values[$i] = 9;
30 $stmt -> bindValue ( $name , $values [ $i ] , PDO :: PARAM_INT ) ;
31 }
32 $stmt -> execute ( ) ;
33 }
もしバルクインサートにする場合,名前付きプレースホルダが使用できなくなる点に注意してください.
php
1 <?php
2
3 // パラメータをここで定義
4 $parameters = [
5 'KO' => [ 1 , 2 , 3 , 4 ] ,
6 'OTSU' => [ 5 , 6 , 7 , 8 ] ,
7 'HEI' => [ 9 , 10 , 11 , 12 ] ,
8 ] ;
9
10 // プリペアドステートメントを作成
11 $format = 'INSERT INTO XTable(%s) VALUES%s' ;
12 $names = array_keys ( $parameters ) ; // ['KO', 'OTSU', 'HEI']
13 $placeholder = array_fill ( 0 , count ( $parameters ) , '?' ) ; // ['?', '?', '?']
14 $placeholders = array_fill ( 0 , count ( current ( $parameters ) ) , '(' . implode ( ',' , $placeholder ) . ')' ) ; // ['(?,?,?)', '(?,?,?)', '(?,?,?)', '(?,?,?)']
15 $stmt = $pdo -> prepare ( sprintf (
16 $format ,
17 implode ( ',' , $names ) , // 'KO,OTSU,HEI'
18 implode ( ',' , $placeholders ) // '(?,?,?),(?,?,?),(?,?,?),(?,?,?)'
19 ) ) ; // 'INSERT INTO XTable(KO,OTSU,HEI) VALUES(?,?,?),(?,?,?),(?,?,?),(?,?,?)'
20
21 // 転置して平坦化した配列を作成
22 $transflat = call_user_func_array ( 'array_merge' , call_user_func_array ( 'array_map' , array_merge ( [ null ] , $parameters ) ) ) ; // [1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12]
23
24 // バルクINSERTを実行
25 foreach ( $transflat as $i => $value ) {
26 $stmt -> bindValue ( $i + 1 , $value , PDO :: PARAM_INT ) ;
27 }
28 $stmt -> execute ( ) ;
備考: PHPでデータベースに接続するときのまとめ - Qiita
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/14 19:26
2016/09/14 20:07
2016/09/14 23:18