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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

247閲覧

MySQL 同じようなテーブルでちょっと違う部分に対するやり方

Z-TALBO

総合スコア525

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/02/05 04:45

編集2018/02/05 04:57

###デモテーブル

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}

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

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

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

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

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

guest

回答4

0

PHPもMySQLもそれほど詳しくは無いのですが、BIT(M)※M=1~64なのでカラムは一つで桁を多めに取っておいて、受け取ったパラメータを各ビットに割り当てる編集を行ってから、INSERTとしてはどうですか?

投稿2018/02/05 06:49

編集2018/02/05 06:50
sazi

総合スコア25184

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

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

Z-TALBO

2018/02/07 06:30

私も全然MySQLなど使えておらず、こんな質問をすることになっております。 今回のbit(1)に関しては、データとしてはとりあえずtrueかfalseかが入っていればと思い検索していたら見つけた方法でした。 どれが最適化などが、まだ理解できておらず、割り当てる編集などもじゃぁどうやっていくかが、今のレベルでは見えてきていないのが実際です。。。
guest

0

INFORMATION_SCHEMA COLUMNS テーブル でそのテーブルの列の一覧を取得できます。さらに、group_concatでSELECTされた列を横に並べることができます。

投稿2018/02/05 05:16

Orlofsky

総合スコア16415

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

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

Z-TALBO

2018/02/07 06:29

コメントが遅くなりました。 テーブルの取得や列の横に並べるなど、私にはまだ理解していない事でした。 とても参考になりました。 ありがとうございます。
guest

0

ベストアンサー

名前付きプレースホルダにしないほうが楽かもしれませんね。
つまりこんな感じのSQL文を生成すればよいかと。

SQL

1INSERT INTO テーブル名(1,2,3) VALUES(?,?,?)

一応サンプル(未検証です)

PHP

1// 対象テーブル名 2$table = 'TestA'; 3 4// 可変部分の収集 5for($i = 0; $i < count($data[$table]); $i++){ 6 $cols[] = "`$i`"; 7 $ph[] = "?"; 8} 9 10// SQL文 11$sql = sprintf("INSERT INTO %s(%s) VALUES(%s)", $table, implode(",", $cols), implode(",", $ph); 12 13// パラメーターバインド 14for($i = 0; $i < count($data[$table]); $i++){ 15  $stmt->bindParam($i + 1, $data[$table][$i]); 16} 17 18// 実行 19$stmt->execute(); 20

投稿2018/02/05 05:15

編集2018/02/05 06:46
ttyp03

総合スコア16998

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

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

sazi

2018/02/05 06:35

>id int not null primary key auto_increment なので、idは省略したいのだと思われます。
ttyp03

2018/02/05 06:37

おぅ…。そこまで見てませんでした。 そうするとカラム名の指定が必要ですね。
Z-TALBO

2018/02/07 06:28

コメントが遅くなりました。 参考になるコードありがとうございました。確かにINSERTができました。 このコードを元に少し変化させたい部分がありますので、また新たに質問させていただこうと思っておりますので、もしよろしければ見ていただければと思います。
guest

0

数値のように特殊なカラム名を使用するなら
バッククォートで囲む必要があるかもしれません
またbindするときも数値での指定を避けたほうが
トラブルをさけることができます。

投稿2018/02/05 05:00

yambejp

総合スコア114814

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

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

Z-TALBO

2018/02/05 05:11

回答ありがとうございます。抜けておりました。数値のようなカラム名に対しては実際は`0`というようにしております(していないとエラー出ました)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問