• ベストアンサー

PDOのlastInsertId

PDOのlastInsertIdについて質問です。lastinsertid()について調べてみると、「最後に挿入された行の ID あるいはシーケンスの値を返す」と書いてあったのですが、最後に挿入された行のIDをどうやってlastinsertidはIDかIDでないかを判断しているのですか?lastLnsertIdはAUTO_INCREMENTの値を取得すると解釈していますが、これで正しいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

基本的にはそうです。 MySQLをPDOで操作する場合には、MySQLで提供されている関数「LAST_INSERT_ID()」が利用され、それを返します。 https://dev.mysql.com/doc/refman/5.6/ja/information-functions.html#function_last-insert-id PostgreSQLの場合は、おそらく「LastVal()」、SQLServer(MSSQL)の場合はMicrosoftが提供しているMicrosoft SQL Server 用 Drivers for PHPにて、同様な意味合いの機能が実装されている、といった感じで、PDOで操作する対象のRDBMSによって多少の違いはあるものの、大体において、同じ動きをします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PDOのlastInsertIDについて

    PDOのlastInsertIdって、データベースに挿入された最後のidを取得出来るらしいのですが 1つのテーブルにバンバンinsertされるようなプログラムがあった場合 そのプログラム内でlastInsertIdを使うと、「そのプログラムで最後に挿入されたid」を返してくれるのでしょうか。

    • ベストアンサー
    • PHP
  • 重複エラー時のシーケンスIDの取得方法について

    いつも参考にさせて頂いております。 重複エラー時のシーケンスIDの取得方法についてご質問させて頂きます。 ユニークキー設定してあるテーブルにデータを挿入し、入っている行のAUTO_INCREMENTの値を取得したい場合、 挿入できるものに関しては挿入後LAST_INSERT_ID()で取得できますが、 重複エラーにより挿入されない場合の取得方法で悩んでおります。 挿入するデータには限りがあるので、挿入されたデータ量が増えるほど(時間が経てば経つほど)、 エラーが返る可能性が高くなり、その分の遅延がもったいないなぁと思っておりますが、 何かよい方法はありませんでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENTについて教えてください

    ■質問1 PHPを使ってMySQLに接続しているのですが、 「AUTO_INCREMENT」指定しているIDの次の値を取得したいのですが、 どうすれば良いでしょうか? 用途としては、レコードを挿入する際、画像ファイルにレコードID名を付与したパスをつけたいのです。 <やりたいこと> 1.AUTO_INCREMENT指定しているIDの次の値を取得 2.画像ファイル名に付与 3.レコード挿入 この1を、どうやるか知りたいです ■質問2 「AUTO_INCREMENT」指定はどこに保存されているのでしょうか? 例えばレコードを削除した後、新たにデータ挿入する場合、 次の「AUTO_INCREMENT」値ではなく、削除した一番若い番号を利用することは可能でしょうか? ■質問3 質問2に関連しているのですが、DUMPデータを移行した際など、次の「AUTO_INCREMENT」値も新しいDBへ引き継がれるのでしょうか?

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENTを2つ設定する方法

    お世話になっております。 現在すでに投稿されている記事を複製する処理をphpで作成しています。 linkmetaというテーブル内のid、link_idというカラムがありidはAUTO_INCREMENTとなっています。 link_idにもAUTO_INCREMENTを設定したいのですが調べるとそれは仕様により不可能ということがわかりました。 現在link_idにもidと同じ値を自動的に挿入したいと考えております。 別の手段でlink_idにAUTO_INCREMENTもしくは同様のINSERTを行う方法はありませんでしょうか? idの数値を取得しようと考えたのですが INSERT前ではAUTO_INCREMENT後の値は取得できない事に後から気づきました。 この様に1つのテーブルに値が重複しない様にする処理は皆様はどのように行なっているのでしょうか? 良い方法は思いつかずに困っております。 どなたかご回答くださいませ。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PDOで取得すると全てSTRING型で取得する?

    PDOを利用してprepareとbindValueでPDO::PARAM_INTなどと型指定をしてINSERTしているのですが、ネットをいろいろ見てみると「型指定をしてもexecute()時に全ての型は文字列として扱われる」と書いています。 これはデータベースの各カラムの型は無視して全て文字列としてINSERTしているのでしょうか? それともデータベースの型にMySQL側で勝手に変換して値を挿入してくれるのでしょうか? INSERTした数値を含むデータをprepareでSELECTしてexecute()してみると数値を含めて全てのカラムがstringとして取得しています。 MySQL側ではカラムの型をINTやFROATとして定義しても数値を文字列として挿入するとMySQL側も文字列として扱うのですか?それとも数値に変換されて挿入されますか? もし文字列として挿入されたらインデックスに影響しますか? いまいちどうすればいいのかわかりません。 一応 $id = 1; $name = "hoge"; $float = 0.055; $stmt = $dbh->prepare("INSERT INTO REGISTRY (id, name, float) VALUES (:id, :name, :float)"); $stmt->bindValue(:id, $id, PDO::PARAM_INT); $stmt->bindValue(:name, $name, PDO::PARAM_STR); $stmt->bindValue(:float, (string)$float, PDO::PARAM_STR); としています。 あと、PDO::PARAM_FLOATはないみたいで、PDO::PARAM_STRにすべきと書いていますが、このように指定してもMySQL側で勝手にFLOAT型に変換して値をINSERTするのでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • PDOについて

    プログラム初心者です 最近PDO使うようになりましたがまったく使いこなせません 何回もSQL発行して効率わるいコードになりました(--; 一回のSQL発行にまとめる方法はありますか? for ($i=0; $i<$count; $i++) { $id=$Array[$i][0]; $name=$Array[$i][1]; $stmt = $pdo -> prepare("INSERT IGNORE INTO table(id,name) VALUES (?,?)"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $name, PDO::PARAM_STR); $stmt->execute(); } 質問2 prepareのキャッシュを利かすってどうゆうことでしょうか?上の場合でもキャッシュ生かせていますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • SQLite3(PDO)でクエリー件数を取得したい

    SQLite3をPHPで使用しています。 ネットでいろいろ見たのですがわかりませんでしたのでこちらで質問させて頂きました。 SELECTで条件に合うidを抽出した場合にその行数を取得したいのですが、どのようにするとスマートに取得できるのでしょうか? スマートにというのは「データベースへのアクセスが一度で済むような」という意味です。抽出データの取得と件数の取得が一度のアクセスで可能なのでしょうか? $pdo = new PDO(sqlite:test.db); $query = $pdo->prepare('SELECT id FROM testTable WHERE id > 0 AND id < 10'); $query->execute(); 私が現在行なっているのは、データ抽出は上記のコードでやって、件数の取得は以下のようにしています。 $query = $pdo->prepare('SELECT count(*) FROM testTable WHERE id > 0 AND id < 10'); $query->execute(); $num = $query->fetch(PDO::FETCH_NUM); echo $num[0]; ネットで調べてもMySQLやPostgreSQLのことしか載っていなく、なかなかSQLite3での取得方法がわかりません。 お手数ですが教えて頂ければと思います。よろしくお願い致します。

  • pdo

    個別で指定がない限り全体のsetFetchModeを最初に定義したいのですがエラーになってしまいます。 マニュアル等も見たのですがいまいち理解できず質問させて頂きました。 全体の指定をするにはどのように書けばいいでしょうか?以下現在のソースです。 また、pdoは初めて使用するのですがその他に定義しておいたほうがいい定数等がありましたら 是非アドバイスをお願い致します。 (自分で思いつくのは文字コードとフェッチモード程度でした^^;) $sql = "SELECT * FROM table where id = ?"; try { $pdo = new PDO($dsn, $user, $password); if ($pdo == null){ print('接続失敗'); } //$pdo->setFetchMode(PDO::FETCH_ASSOC); $pdo->query('SET NAMES utf8'); $stmt = $pdo->prepare($sql); if ($stmt->execute(array(1))) { while ($row = $stmt->fetch()) { print_r($row); } } } catch (PDOException $e) { print('Error:'.$e->getMessage()); die(); } $pdo = null;

    • 締切済み
    • PHP
  • MySQLでinsertした行を取得する

    table t1 id name ------- 1 aaa 2 asv 3 aae といったauto incrementのidを持ったテーブルt1を考えたときに mysql_queryで新規行をinsertした場合にそのidを取得するような ことはできるのでしょうか? phpのmanualを参考にしたところ出来ないような感じのことが書かれて いたのですが,このようなことは頻繁に必要な気もするのですが・・・ 既に考えた案としては ・auto incrementを外して最大のidの1つ上を指定してinsertする ・一度lockしてからinsertして最大のidを取得する というものです もっと1つの関数かなにかでスマートに書けたらいいのですが

    • ベストアンサー
    • PHP
  • PDO で IN句を利用することができません

    PDOでIN句を使用しているのですが、正しく動作しません。 $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?)'); $stmt->bindValue(1, '123, 456, 789'); $stmt->execute(); var_dump($stmt->fetchAll()); fetchAllを行っても複数のレコードがかえってこず、ヒットした最初の1行のレコードしか取得することができません。PDOでIN句を使用することはできないのでしょうか? DBMSはMySQLを使用して、PHPは5.2.6を使用しています。 ちなみに $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?, ?, ?)'); $stmt->bindValue(1, 123); $stmt->bindValue(2, 456); $stmt->bindValue(3, 789); $stmt->execute(); では、fetchAll で複数のレコードが返ってきます。 どうしてもpreparedで単一のIN句を使いたいのですが、何か良い方法はありますでしょうか?

    • 締切済み
    • PHP