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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1297閲覧

複数VALUESをINSERTする場合の書き方について

sheep100

総合スコア13

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/07/16 15:31

編集2021/07/16 15:33

前提・実現したいこと

WordPressでサイトを作成しています。

配列の入力項目を取得して
親テーブルにメインデータをINSERTしたした後
PRIMARY KEYのidを取得して
子テーブルにforeachで取り出した複数データを一回でINSERTしたいです。

わからないこと

・子テーブルの複数データを一括で入れたいのですが、
書き方は

$sql_box = $wpdb->prepare( "INSERT INTO $wpdb->application ( app_id, type, num, created_at ) values ( %d,%d,%d,%s )", $app_id, $type, $num, $today) values ( %d,%d,%d,%s )", $app_id2, $type2, $num2, $today2) values ( %d,%d,%d,%s )", $app_id3, $type3, $num3, $today3); $wpdb->query( $sql_box );

上記のようにvalues以降が増えていく認識で合ってますでしょうか。

・TIMESTAMPのプレースホルダは%sでしょうか。

・オートインクリメントのid取得はname(入力された名前)と日付で取得しようと思っていますが、これは一般的でしょうか。

$sql = $wpdb->prepare( "INSERT INTO $wpdb->table (name, kana, p_code, p_pref, p_address1, p_address2, tel, mail_address, created_at) values (%s, %s, %s, %s, %s, %s, %s, %s, %s)", $name, $kana, $p_code2, $p_pref2, $p_address3, $p_address4, $tel, $mail_address, $today); $wpdb->query( $sql ); //オートインクリメントのid取得 $id_sql = $wpdb->prepare("SELECT id FROM $wpdb->application WHERE name = %s, created_at = %s", $name, $today); $app_id = $wpdb->get_results($id_sql); $box = array(); $box = $_POST['box'];//配列 foreach ($cabinets as $type_key => $type) {  foreach ($type as $num_key => $num) {   $box_val .= '('.$app_id.','.$type.','.$num.','.$today.'),';  } } $sql_box = $wpdb->prepare( "INSERT INTO $wpdb->application ( app_id, type, num, created_at ) values ( %d,%d,%d,%s )", $cabinet_val); $wpdb->query( $sql_box );
<form> <select name="box[]" class="text"> <option value="0" selected>タイプ</option> <option value="1">1ドア</option> <option value="2">2ドア</option> <option value="3">3ドア</option> <option value="4">4ドア</option> </select> <select name="box[][]" class="text"> <option value="0" selected>個数</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> <input type="button" value="+" class="add pluralBtn"> <input type="button" value="-" class="del pluralBtn"> </form>

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

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

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

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

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

guest

回答1

0

ベストアンサー

・子テーブルの複数データを一括で入れたいのですが、

きっとやりたいことは「バルクインサート」
SQLのインサートとバルクインサート

認識は合ってますが、例示した書き方は間違ってますね。
$wpdb->prepare()って第1引数がSQLで第2引数以降がバインドしたいパラメータになるようですし、バルクインサートはSQL文として1つなので、途中で切ってはいけません。

・TIMESTAMPのプレースホルダは%sでしょうか。

「now」や「today」としてtimestamp入れたいなら外から値作って入れなくても対象のカラムをDEFAULT CURRENT_TIMESTAMPに指定すれば良いのではないでしょうか。
MySQL 5.6 リファレンスマニュアル / TIMESTAMP および DATETIME の自動初期化および更新機能
でなくてもSQL側でNOW()書いてあげれば現在時刻を使ってくれます。

WordPressのほうはあまり詳しくないですが、先に提示した日本語訳ドキュメントを見る感じ、パラメータはsprintf() 風のプレースホルダーを使えます。書式は %s (文字列), %d (整数) and %f (浮動小数点数) がサポートされていますとのことで、該当するのは%sしかなさそうですね。

この2つに関しては試してみればわかることと思います。
違ってればエラーが出るだけ。合ってればエラーが出ず登録されるだけ。登録したい内容でなかったら削除すればいいだけですから。

・オートインクリメントのid取得はname(入力された名前)と日付で取得しようと思っていますが、これは一般的でしょうか。

えっと、これは「今登録したデータのIDを取得したい」ということでしょうかね。

PDOであればPDO::lastInsertIdというのがありますが(サポートされてないDBもあるようですが)、WordPressでもそれに近い機能はあるんじゃないでしょうか。

別サイトですが質問が投稿されていますのでご確認を。
WordPress Development Stack Exchange:$wpdb->insert_id
Stackoverflow:How to get last inserted row ID from WordPress database?

から見るに先に提示した日本語訳ドキュメントにもありますね。

行の INSERT

挿入した後、カラム AUTO_INCREMENT へ生成された ID は次の方法でアクセスできます:
$wpdb->insert_id

投稿2021/07/16 21:19

m.ts10806

総合スコア80861

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

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

sheep100

2021/07/17 07:07

ありがとうございます。 バルクインサートというんですね。単語を知りませんでした、、 検索したら下記サイトがありこちらでできました。ありがとうございます。 https://agohack.com/wpdb-bulk-insert-with-array/ %sについてはこちらでTIMESTAMP保存できました。ありがとうございます。 >これは「今登録したデータのIDを取得したい」ということでしょうかね。 これについてはそのとおりです。 複数アクセスがありほぼ同時にINSERTした場合違う親IDを取得してしまう可能性があるのが怖いので、 名前とか保存日時で絞った方がいいかと思っていました。 心配しすぎでしょうか??
m.ts10806

2021/07/17 08:03

もし100%の確実性を求めるのでしたらオートインクリメントをしないことです。プラス複合キーで対応します。
sheep100

2021/07/17 08:49

思いつきませんでした、、ありがとうございます >プラス複合キーで対応します。 1件ごとにキーを生成して保存、生成したキーで親と子のテーブルを紐づけるということであってますでしょうか?
m.ts10806

2021/07/17 08:53

そうですね。 「アプリケーション側で払い出す」という考え方で、何振られるか分からないDBのオートインクリメントより制御はしやすくなります。 「重複しないキーを作成する」のは若干ロジカルに組む必要がありますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問