###デモテーブル
MySQL
1create table TestA ( 2id int not null primary key auto_increment, 30 bit(1) not null default b'0', 41 bit(1) not null default b'0', 52 bit(1) not null default b'0'); 6 7create table TestB ( 8id int not null primary key auto_increment, 90 bit(1) not null default b'0', 101 bit(1) not null default b'0', 112 bit(1) not null default b'0', 123 bit(1) not null default b'0'); 13 14create table TestC ( 15id int not null primary key auto_increment, 160 bit(1) not null default b'0', 171 bit(1) not null default b'0');
テーブルの作成方法に関してはここでは置いておいていただいても良いでしょうか?
カラム名をあくまでもこのようにさせていただいて考えたいので、、、
###デモデータ
PHP
1$data['TestA'] = [true, true, false]; 2$data['TestB'] = [true, true, true, false]; 3$data['TestC'] = [true, true];
カラムとデータの個数、そして並びに関しては一致しているものとします。
###質問:SQL文、BINDする部分において一つの書き方で動的に変化させる方法があるか?
PHP
1// 基本的なSQL文 2$sql = " 3 INSERT INTO TestA(table名) (0, 1, 2) VALUES (:0, :1, :2) 4"; 5for($i = 0; $i < $cnt(個数分); $i++;) { 6 $stmt = bindParam(':'.$i, $data['TestA'][$i]); 7} 8$stmt->execute();
なんとなく上記のような感じを見たのですが、、、
$sqlの部分で、table名はたとえば、、、
PHP
1foreach($data as $key => $val) { 2 $table = $key; 3}
としてforeach内で上記のような処理を実行していけばどうだろうか?と思ったりしていたのですが、、、
カラムの指定と、VALUESの部分を$dataに合わせて変動させたいのですが、、、どのようにすると良いでしょうか?
###最後に
若干、無理やりな部分や、問題もある部分はありますが、、、あくまでも上記の条件下でやるならば、、、ということで思っていただければと思います。
よろしくお願いいたします。
###自分でやってみて(追記)
PHP
1foreach($data as $key => $val) { 2 $test[$key] = $val; 3 // テーブル名はkeyになるので 4 $table = $key; 5 // 値の個数を数えておく 6 $cnt = count($test[$key]); 7 $setColumn = setColumn($cnt); 8 $setValues = setValues($cnt); 9 $sql = "INSERT INTO ".$table." (".$setColumn.") VALUES (".$setValues.")"; 10} 11 12function setColumn($cnt) { 13 $column = ''; 14 for($i = 0; $i < $cnt; $i++) { 15 $column .= $i.","; 16 } 17 return $column; 18} 19function setValues($cnt) { 20 $values = ''; 21 for($i = 0; $i < $cnt; $i++) { 22 $values .= ':'.$i.','; 23 } 24 return $values; 25}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/07 06:30