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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

Q&A

解決済

1回答

1720閲覧

Sqlite3とPHPを使いオートナンバリングした値を即時に得たいのですが…

jinba

総合スコア310

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

0グッド

0クリップ

投稿2015/11/08 05:44


no|家族| 名前 |性別|

1| 1|山田太郎| 男|

2| 1|山田次郎| 男|

3| 1|山田花子| 女|

4| 4|鈴木一郎| 男|

5| 4|鈴木一子| 女|

上記のようなテーブルがあり
下記のようなPHPを使い
POSTデータ(namae⇒"佐藤一夫" seibetu⇒"男" namae⇒"佐藤二郎" seibetu⇒"男")
というデータを取得し


no|家族| 名前 |性別|

1| 1|山田太郎| 男|

2| 1|山田次郎| 男|

3| 1|山田花子| 女|

4| 4|鈴木一郎| 男|

5| 4|鈴木一子| 女|

6| 6|佐藤一夫| 男|

7| 6|佐藤二郎| 男|

というデータベースを作りたいのですが
noはINTEGER PRIMARY KEYでオートナンバリングされています。
家族の紐づけとして初めに登録した行のナンバリング値を取得し
家族カラムに登録したいのですがやり方がわかりません。

変数「$kazoku」「$kazoku2」にオートナンバリングした値「6」を入れる方法を教えてください。

//以下PHPのサンプル文

$dsn = "sqlite:データーベース名";
$pdo = new PDO($dsn);

$sql = "CREATE TABLE IF NOT EXISTS kazoku(no INTEGER PRIMARY KEY , 家族 , 名前 , 性別 )";
$stmt = $pdo->prepare($sql);
$stmt->execute();

$namae = @$_POST['namae'];
$seibetu = @$_POST['seibetu'];

$namae2 = @$_POST['namae2'];
$seibetu2 = @$_POST['seibetu2'];

$sql = "INSERT INTO kazoku(家族 , 名前 , 性別 )
VALUES('$kazoku' , '$namae' , '$seibetu')
,('$kazoku2' , '$namae2' , '$seibetu2')";
$st = $pdo->prepare($sql);
$st->execute();

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

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

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

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

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

guest

回答1

0

ベストアンサー

オートインクリメントで挿入されたIDはInsetされるまで決定しないので、一回のSQLでnoと家族に同じ値を挿入することはできません。

$pdo->lastInsertId();
で、その接続で最後にオートインクリメントで挿入されたIDを取得することはできます。

なので挿入と同時に家族を確定させることは諦めて、挿入した後に更新という流れになります。

1.佐藤一夫を[家族]不明(null)のままinsertする
*事前に[家族]にnullを使用できるようにしておく
2.$pdo->lastInsertId();によって佐藤一夫のnoを取得
3.佐藤一夫のnoを使って佐藤一夫の家族をupdateする
4.家族は既に取得されているので佐藤二郎(以降)はinsertと同時に家族を指定

という形ですね。

要件にもよりますが、家族テーブルを別のテーブルにして管理をする方が家族の編集をする時に楽だとは思います。
例えば、佐藤一夫が家族ではなくなり、レコードを削除しなければならなくなった場合、更新の処理が少し大変だったりします。

*それとは別の問題として、現在のコードだとSQLインジェクションし放題(システムの破壊やデータの漏洩が可能)の非常に危険なコードになっています。
・SQLインジェクションは$sqlで指定されるSQL文に直接変数を結合させず、:変数名+executeでの指定またはbindParamまたはbindValueを使うことで回避可能です。
SQLインジェクションについて参考URL
プリペアドステートメントの正しい使い方

投稿2015/11/08 07:56

tanat

総合スコア18709

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

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

jinba

2015/11/18 09:17

返答遅れ申し訳ありません 「idを即時に得る」というのは難しいということに気づかされました。 ・家族の筆頭がわかる ・のちのコードが理解しやすいだろう という安直な意見から何か方法は無いかと模索していましたが 結果、今回に限っては家族の紐づけが出来ればよいだけだったので 家族カラムには別のユニークIDを設定することにしました。 あとはコードの安全性も指摘してくださってありがとうございました。 初心者なので参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問