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

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

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

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

PHP

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

Q&A

解決済

1回答

2428閲覧

PHP MySQL 共通IDの作成

Z-TALBO

総合スコア525

MySQL

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

PHP

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

0グッド

1クリップ

投稿2016/06/07 08:19

編集2016/06/07 08:20

###やりたいこと
別の質問で、予定表をDBに登録する際にテーブルを切り分けていくので、その共通Idみたいので紐付けなどができるようにしたらどうだろう?ということで、質問しました。

テーブルとしては、大きく予定のテーブルと訪問スタッフのテーブルと二つを用意しました。
では、下記でDBの設計などを記載してみたいと思います。

###DBの設計

MySQL

1[visitPlan] 2plan_id int not null auto_increment primary key, 3plan_user int // user_masterと紐付け 訪問先 4plan_car int // car_masterと紐付け 乗車する車 5plan_time datetime // 訪問日時 6 7[visitPlan_staff] 8plan_id int not null primary key, 9plan_staff int // staff_masterと紐付け 訪問スタッフ

単純に上記のような設計をしております。
スタッフの部分は現在最大3人ですが、場合によっては4人と増えることがまれにある為、切り分けました。

###コード
はじめに、クラスなどは使用せず、フルスクラッチでfunctionばかりを使いながら処理を分けていくやり方をしております。その部分に関してはスルーでお願いいたします。

HTML

1[index.php] 2<form action="" method="post"> 3// ほとんどの項目がselectの為option部分は省略いたします 4<select name="year"></select>年 5<select name="month"></select>月 6<select name="day"></select>日 7<select name="car"></select>号車 8 9<?php for ($i = 0; $i <= 8; $i++) : ?> 10訪問先<select name="user[<?= $i; ?>][name]"></select> 11 時 <select name="user[<?= $i; ?>][hour]"></select> 12 分 <select name="user[<?= $i; ?>][minutes]"></select> 13staffA<select name="user[<?= $i; ?>][A]"></select> 14staffB<select name="user[<?= $i; ?>][B]"></select> 15staffC<select name="user[<?= $i; ?>][C]"></select> 16<?php endfor; ?> 17<input type="submit" name="insert"> 18</form> 19 20<?php if (isset($_POST['insert'])) { plan_insert(); } ?>

PHP

1[controller.php] 2function plan_insert() { 3$users = $_POST['user']; 4foreach ($users as $user) { 5$year = $_POST['year']; 6$month = $_POST['month']; 7$day = $_POST['day']; 8$car = $_POST['car']; 9$name = $user['name']; 10$hour = $user['hour']; 11$minutes = $user['minutes']; 12$second = date('s'); 13$staffA = $user['A']; 14$staffB = $user['B']; 15$staffC = $user['C']; 16 17if ($name == "") { 18// 何もしない 19} else { 20$time = mktime($hour, $minutes, $second, $month, $day, $year); 21$insert_time = date('Y-m-d H:i:s', $time); 22 23$plan_insert = plan_insert_db($name, $car, $insert_time); 24}}}

PHP

1[db.php] 2function plan_insert_db($name, $car, $insert_time) { 3$dbh = connectDb(); 4$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 5$sql = "INSERT INTO visitplan (plan_user, plan_car, plan_time) VALUES (:name, :car, :insert_time)"; 6$stmt = $dbh->prepare($sql); 7$stmt->bindParam(':name', $name, PDO::PARAM_INT); 8$stmt->bindParam(':car', $car, PDO::PARAM_INT); 9$stmt->bindParam(':insert_time', $insert_time, PDO::PARAM_STR); 10$stmt->execute(); 11return $plan_insert;

まずは上記のような流れで登録までの動作は確認しております。
plan_idに関してもauto_incrementなので問題なく入っているのは当たり前ですが、、、、

###質問内容
さて、やっと質問ですが、、、
スタッフ側に登録するという部分において

PHP

1[controller.php] 2if ($name == "") { 3// 何もしない 4} else { 5$time = mktime($hour, $minutes, $second, $month, $day, $year); 6$insert_time = date('Y-m-d H:i:s', $time); 7 8// visitPlanの登録 9$plan_insert = plan_insert_db($name, $car, $insert_time); 10// visitPlan_staffの登録 11$plan_insert_staff = plan_insert_staff_db($staffA, $staffB, $staffC); 12}}}

PHP

1[db.php] 2function plan_insert_staff_db($staffA, $staffB, $staffC) { 3$dbh = connectDb(); 4$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 5$sql = "INSERT INTO visitplan_staff (plan_id, plan_staff) VALUES (:id, :staff)"; 6$stmt = $dbh->prepare($sql); 7$stmt->bindParam(':staff', $staffA, PDO::PARAM_INT); 8$stmt->execute(); 9$stmt->bindParam(':staff', $staffB, PDO::PARAM_INT); 10$stmt->execute(); 11$stmt->bindParam(':staff', $staffC, PDO::PARAM_INT); 12$stmt->execute(); 13return $plan_insert;

###質問
とりあえず登録という流れまではできましたが、、、
plan側で得たauto_incrementのplan_idをスタッフ側のplan_idに引っ張る方法はどのようになるでしょうか?

plan_insert_db()で登録処理をしてから、そのデータについたIDを持ってきて?
それをどうにかする?

最初から次につくIDを取得してからそれをどうにかする?

最終的には一覧表示する際に
plan_id = 1のデータ
訪問先○○、訪問時間○○:○○、スタッフA、スタッフB、スタッフCという事にしたいのです。
DB的には
plan_id = 1
plan_staff = スタッフA
plan_id = 1
plan_staff = スタッフB
plan_id = 1
plan_staff = スタッフC
という感じでInsertされるイメージですね。

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

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

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

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

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

guest

回答1

0

ベストアンサー

はじめまして。

Mysqlですと、select last_insert_id()で AUTO INCREMENT で挿入された plan_id を取得して、
それを基にスタッフ登録という感じでしょうか?
https://nysql.g.hatena.ne.jp/py4s-tnk/20081209/1202500558
http://hensa40.cutegirl.jp/archives/2025

ちなにみ、planを登録したのと同じDB接続(リソース)でないと、正しい値が取れないかと思いますのでご注意を。接続毎に、最後に挿入したデータを元に値が切り替わる関数だったはずですので。

投稿2016/06/07 10:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Z-TALBO

2016/06/07 23:56

回答ありがとうございます、やはりlastInsertIdという奴なんですね。。。 やってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問