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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

4回答

440閲覧

同じFORMのIDを、データ挿入前に取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2017/10/12 06:44

ご覧いただきありがとうございます。
PDOでフォームからinsert into でmysqlにデータを挿入する際に、
これから挿入するデータのIDを挿入前に取得することは可能でしょうか?
もし可能であればinputのhiddenで渡したいのですが、どのように記述すれば良いのでしょうか?

PHP

12<form class="" action="" method="post"> 3//titleテーブルに格納されるデータ。titleテーブルのidはauto_incrementです 4 <input type="text" name="title_name" value=""> 5 <input type="hidden" name="ctgid" value="<?= $ctgid;?>"> 6//ここまでがtitleテーブルに格納されるデータ 7 <p>投票</p> 8//pollテーブルに格納されるデータ 9 <input type="text" name="poll_one" value=""> 10 <input type="text" name="poll_two" value=""> 11 <input type="text" name="poll_three" value=""> 12//このhiddenの値にtitleテーブルのidを挿入したい 13 <input type="hidden" name="title_id" value="<?= $_POST['title_id'];?>"> 14//ここまでがpollテーブルに格納されるデータ 15 <input type="submit" name="" value="送信"> 16</form> 17

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/12 06:53

データidって整数値でしょうか。整数値だとした場合に、途中の抜けがあってもよいのか、それとも抜けを避けたいのかも教えて下さい。
退会済みユーザー

退会済みユーザー

2017/10/12 06:56

idは整数で、途中のidの抜けはできるだけ避けたいですが、抜けたとしても、titleに正しく紐付けできたpollが表示されればいいです。
guest

回答4

0

これから挿入するデータのIDを挿入前に取得することは可能でしょうか?

それは考え方が間違っています。
仮に新規のデータを登録するとして、idを先に発行させるとすると
何らかの理由で登録が中止されるとそのidはゴミとして残ってしまいます。
またそのidを使うかどうかはデータが登録されたタイミングに確定するので
かりに同じ時期に2つの要求があったとき、おなじidが発行されて競合する可能性もあります。

やり方としては2つ

  • 一つは、既存のレコードとユニークになるなんらかの値をつかってユニークを確保しつつ

auto_incrementの主キー(ユニークキー)を確保する

  • もう一つは、レコードを登録するのとは別のロジックで、予めIDを発行するルールを決めておき、

auto_incrementではない採番ルールを利用した主キー設定をしたレコード登録をすること

前者は単純な判断基準なので処理はラクですが、発行されるIDは必ずしも法則性を持たせられません。
たとえば品目コード、ユーザーコード、取引先コードなど一定のルール付をしたほうが効率的な
ものに関しては後者の処理が必要です。

投稿2017/10/12 07:14

yambejp

総合スコア114839

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

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

退会済みユーザー

退会済みユーザー

2017/10/12 07:18

例えばなのですが、titleテーブルのpost処理の直後に、pollテーブルの処理を行わせて、last_insert_id()でそのidを取得することはできないのでしょうか?
guest

0

フォームのhiddenにデータIDを詰めたとして、
例えば「次は6番だね」ってときに
Aさんがアクセスして6が詰められて、
さらにBさんがアクセスして6が詰められて
それぞれフォーム送信してしまうと、
idが被ってしまうことになりますから、
複数の人がアクセスしても被らないようにデータidの発行を管理しないといけません。

ユーザーインターフェース的に、
既に6が使われているときに、
再度データidを詰めなおしてフォームを再表示するようにすることも検討しないといけないでしょうし、
そうではなく、
6月買われているなら使われていない数字を調べて自動的に詰め直すようにする方法もあるでしょう。
システムの設計次第です。

システムを利用するユーザーごとにデータidを振る仕組みがあるのであれば、
かぶりは避けられそうな気がしますが、
同じユーザーが同時に複数ウィンドウやタブを開いて登録したりすることがないか
対策しないといけなくなりますね。

他のデータベースでは、シーケンスという概念で被らない数字をルール通りに発番する仕組みがあったりしますがMYSQLにはないようなので、
似たようなことをするための工夫もあるようです。

MySQL で採番テーブル - Qiita
MySQL で シーケンス 機能実現 - Qiita

でも、実は考え方次第で、
フォーム表示前にデータidを決めなくてもできちゃう方法があるんじゃないでしょうか?

投稿2017/10/12 06:57

編集2017/10/12 07:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

一応解決したので記載しておきます。
問題点等ありましたらぜひお願いいたします。

public function post(){
$sql = "insert into sleds (title_id,title_name) values (:title_id,:title_name)";
$stmt = $this->_db->prepare($sql);
$stmt->bindParam(':title_id',$_POST['ctgid']);
$stmt->bindParam(':title_name',$_POST['title_name']);
$stmt->execute();
$lastId = $this->_db->lastInsertId();
$sql = "insert into poll(poll_id,poll_one,poll_two,poll_three)
values (:poll_id,:poll_one,:poll_two,:poll_three)";
$stmt = $this->_db->prepare($sql);
$stmt->bindParam(':poll_id',$lastId);
$stmt->bindParam(':poll_one',$_POST['poll_one']);
$stmt->bindParam(':poll_two',$_POST['poll_two']);
$stmt->bindParam(':poll_three',$_POST['poll_three']);
$stmt->execute();
}

処理部分で先にtitleをinsertした後、そのinsertしたidを取得し、
pollのidに紐付けました。

投稿2017/10/12 08:22

編集2017/10/12 08:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/10/12 09:26

えっ、複数テーブルがあっての話だったの? データ構造を示さずに掲示されたソース部分だけを見ても、この回答に繋がらなくて意味がわからないんですが。
guest

0

titleテーブルのidはauto_incrementなんですよね?
でしたらhiddenでわざわざ渡してあげなくても対象のカラムの値がNULLまたは0だった場合には、1つ前にデータを追加した後に対象のカラムに格納されている最大の値に1を加えた値が格納されます。

投稿2017/10/12 06:54

June666

総合スコア290

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

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

退会済みユーザー

退会済みユーザー

2017/10/12 07:40

例えばなのですが、titleテーブルのpost処理の直後に、pollテーブルの処理を行わせて、last_insert_id()でそのidを取得することはできないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問