• ベストアンサー

PDOのlastInsertIDについて

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

使っているRDBMSが「自動インクリメントフィールド、 もしくはシーケンスの概念をサポートしていれば」使えます(ドライバにも依存しますが、サポートしているRDBMS用のドライバでこれが欠落することは一般的には「ない」ので)。 http://php.net/manual/ja/pdo.lastinsertid.php (当然ですが)phpでよく使うMySQLやPostgreSQLでは問題ありません(マニュアルに記載のとおり、PostgreSQLでは引数でシーケンスオブジェクト名の指定が必須になります)。

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

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

PDOはデータベースへアクセスする汎用のモジュールです。 質問者さんがどのデータベースを想定しているか書いていないので なんともいえませんが、MySQLなのかPostgreなのかまたは全然別のRDBなのか によって挙動がことなり、画一的な動作は保証されないということでしょう。 またMySQLのようにDBエンジンに選択肢があるものも、そのエンジンによって 挙動がことなってくる可能性はあります。 ご利用のDBの特徴を理解したうえで運用されることが賢明です http://php.net/manual/ja/pdo.drivers.php

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>http://php.net/manual/ja/pdo.lastinsertid.php を見る限り、「このメソッドは、異なる PDO ドライバ間で意味のあるもしくは 一貫性のある結果を返さないかも知れません」 とあるので、必ずしも最後のデータではない可能性はあります。 きちんとやるなら、データを挿入する際にプライマリもしくはユニークなデータを保持しておき、 データ挿入後、 select idとなるカラム from テーブル where ユニークなカラム=該当データ で拾うのが妥当でしょう。 ただ、そもそもlastinsertidの使い道はかなり限定されているので、あまり利用する価値は ないと思いますが・・・

simizukiyo
質問者

補足

ご回答ありがとうございました。 ご提案していただいた方法で実装してみたいと思います。 ところで、大変無知でこんな事を聞くのもお恥ずかしいのですが、「このメソッドは、異なる PDO ドライバ間で意味のあるもしくは 一貫性のある結果を返さないかも知れません」とありますが、「PDOドライバ」とは何者なのでしょうか。

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

関連するQ&A

  • 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
  • PDOのlastInsertId

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

    • ベストアンサー
    • 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
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • 効率のよい方法があったらお教え下さい

    下記の仕様を元にAccessでプログラムを組もうと考えています。 「プログラムをするにあたっての方法」のように組もうと考えているのですが、効率が悪いように何となく感じています。 もし、こういった方法でプログラムしたらという方法がありましたらお教え下さい。 ------------------------------------------------------- 仕様 ------------------------------------------------------- TABLE1とTABLE2があります。 TABLE1は履歴蓄積テーブル。 TABLE2は新規インサート用テーブルです。 両テーブルともにIDフィールドがあります。 TABLE1に取得IDが無ければ、TABLE2にインサート。 TABLE1に取得IDが存在すれば、TABLE2にインサートをおこなわない。 取得IDはテキストファイルにあります。 ------------------------------------------------------- プログラムをするにあたっての方法 ------------------------------------------------------- TABLE1のレコードセットを取得 取得IDをキーにTABLE1のレコードセット・IDフィールドを検索 取得IDがレコードセットに無ければ Insert文でTABLE2に挿入 取得IDがレコードセットに有れば Insertをおこなわない テキストのIDがEOFになるまで繰り返し 終わり

  • PHP pdo データが無い場合とある場合

    tablename( id int not null, name text not null, age int ); 的なテーブルがあったとして、id番号と名前は必ずデータがあるが、年齢はデータがあったり無かったりするとします。 $id = 1; $name = "太郎"; $age = ""; だったり $age = "25";だったり シンプルにinsert 書きたいのですが、やはり$ageが空文字の場合と数字で構成される文字の場合でわけないと書けないでしょうか? $sql = "insert into tablename( id,name,age) values (:id,:name,:age); $stmt = $pdo->prepare($sql); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":name", null, PDO::PARAM_STR); if ($age === "") { $stmt->bindValue(":age ", null, PDO::PARAM_NULL); } else { $stmt->bindValue(":age ", $age , PDO::PARAM_INT); } とわけないと無理?

    • 締切済み
    • 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で文字列が正しく書けない

    PHP5.5(Windows 32bit) with PDO(PostgreSQL) + PostgreSQL 9.3(64bit) + Windows 7 です。 id(integer PK), text1(text), text2(text) の列を持つテーブル test に対して  INSERT INTO test (id, text1, text2) VALUES (41, '\', '<?xml version="1.0"?>') を pgp admin で実行すると正常に行がインサートされます。ところが PDO の prepare にこの SQL を単純に渡して実行すると text2 に <$1xml version="1.0"$2> というおかしな文字列がセットされてしまいます。 どうも 直前の列データが '\' というように、末尾が \ になっている文字列を渡す時だけ 次の列データ '<?xml version="1.0"?>' の中の ? がプレースホルダーとして処理されるっぽいのです。 どう考えてもPDOのバグのような気がするのですが、お心当たりのバグや回避方法などありましたら よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP PDO execute のsql

    $sql = "select count(*) as ..........."; $PDOStatement = $pdo->prepare($sql); $PDOStatement ->bindValue(':id', $dat, PDO::PARAM_INT); $PDOStatement -> execute(); のような場合に、実際に問い合わせが行われたSQLはどうやって取得できますか?

    • ベストアンサー
    • PHP
  • データベースに変数の値を挿入

     HTMLのフォームから、getParameterで取得した値(id,name,club)をデータベースに挿入したいのですが、 String sql="insert into test_table values(id,name,club)";  と記述してもその文字列がそのままテーブルに反映されてしまいます。  もちろん、 String sql="insert into test_table values('12','●田○郎','野球部')"; とあらかじめ記述しておけばこのデータがテーブルに挿入されるのですが・・・。  PHPでは確かvalues('{$id}','{$name}','{$club}')のように記述すればできたので戸惑っています。  JAVAでSQL文に変数を含める場合、どのように記述すればいいのでしょうか?

    • ベストアンサー
    • Java
このQ&Aのポイント
  • 日本の物価が上がり、腕時計の相場も上昇しています。
  • 新型コロナ禍明けになると物価が上昇し、家計が苦しい状況が続いています。
  • 日銀の利上げが進まず、車の価格も高騰しています。
回答を見る