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

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

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

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

4回答

390閲覧

レコードをinsert直後にプライマリなidを取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2017/09/14 05:33

編集2017/09/14 05:45

###わかっていないこと
現在PDOにてレコードをインサートし、その直後にそのレコードのプライマリキーを取得しようとしています。

###コード

public function save() { $data = date('Y-m-d H:i:s'); $stmt = self::$_pdo->prepare("INSERT INTO clients ( created_at, updated_at ) VALUES ( :created_at, :updated_at )" ); $stmt->bindValue('created_at', $date, PDO::PARAM_STR); $stmt->bindValue('updated_at', $date, PDO::PARAM_STR); $stmt->execute(); $link = mysqli_connect('localhost', 'root', '', 'cr'); $result = mysqli_query($link, "INSERT INTO clients (created_at, updated_at)");var_dump($result); $lastId = mysqli_insert_id();

該当のテーブルは、id created_at updated_atで構成されています。そのうちidがプライマリキーになります。
上記のコードのvar_dumpにてfalseが返ってきます。
原因がわかっておりませんので、ご教授いただけないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

PDOを利用しているのであればPDOのlastInsertIdメソッドを使えばよいかと思います。
executeした後に
self::$_pdo->lastInsertId()で良いかと思いました。
また、質問内容の後に書かれているmysqliで取ってこようとしていますが、INSERTになっていますしこれがもしもレプリケーションをしているDBシステムであれば取得できないでしょう。

http://chaika.hatenablog.com/entry/2015/01/19/090827

投稿2017/09/14 05:47

編集2017/09/14 05:49
fagai

総合スコア2158

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

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

退会済みユーザー

退会済みユーザー

2017/09/14 06:03

ご回答ありがとうございます。 まさにレプリケーションしているシステムでしたので、とってこれなかったのかと思います。 ありがとうございます。
fagai

2017/09/14 06:13 編集

レプリケーションしているシステムだと、自ずとレプリケーション遅延を意識した処理を考える必要があります。 インサートした直後にデータを取得するような処理は基本的に書かないように気をつけたほうが良いです。(もしもどうしても必要であるなら向き先をmasterから取ってくる必要があります) 今回の場合はmysqliで別取得しようとしたのが問題ではありますが、、、
guest

0

ベストアンサー

lastInsertIdではないでしょうか?

PDOとmysqliの併用は意味が無いのでやめた方がいいでしょう
かりにPDOでinsertしたらmysqliではおなじセッションではないので戻り値をえられないと思います。
auto_incrementのmax値をとってもそれが自分が最後に投入したデータという保証はありません

投稿2017/09/14 05:46

yambejp

総合スコア114574

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

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

退会済みユーザー

退会済みユーザー

2017/09/14 05:54

ご回答ありがとうございます。 仰っていただいた通り、lastInsertIdでidをとることができました。 mysqliとのヘ羽陽は無意味なのですね。 セッションの相違を考えに入れておりませんでした。 ありがとうございます。
guest

0

そもそも、作成日と更新日だけ追加するような目的があるとは思えません。
コードを省略していないなら、キー値などのNot Null制約等でエラーになっているのではありませんか?

追加しているテーブルの構成と共に、コードを省略しているなら、SQL全体を質問に追記して下さい。

投稿2017/09/14 05:55

sazi

総合スコア25138

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

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

0

mysqli_error()をしてみてください。
この質問内容だけの推測ですが、直前のINSERT文でclientsにcreated_at, updated_atを指定していますが、valuesが指定されていないからではないでしょうか?

投稿2017/09/14 05:39

m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2017/09/14 05:44

ご回答ありがとうございます。 VALUESを追加しましたが、結果はfalseでした。 質問文が稚拙で申し訳ありませんが、テーブルのカラムはid created_at updated_atで構成されています。
m.ts10806

2017/09/14 05:46

idはオートインクリメントですか? mysqli_error()の結果も教えてください。 「直前のエラーを表示する」なのでinsert投げた直後がいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問