2016-12-30 8 views
2

PDOのLastInsertIdは実際にどのように機能しますか? <a href="http://php.net/manual/en/pdo.lastinsertid.php" rel="nofollow noreferrer">manual</a>で

は、基礎となるドライバに応じて、シーケンスオブジェクトから最後に挿入された行、または最後の値のIDを返し述べています。 PDO::LastInsertID()に最初のパラメータとして渡された無$name変数がない場合

は、それがデータベースに挿入された最後の行を確認します。この機能の状態は、記載されているドライバによって正しく動作するかどうかを判断することもできます。MySQLを使用している場合は大丈夫ですが、OIDをサポートしていないデータベースを使用している場合は問題ありませんテーブル定義のAUTO_INCRAMENTPDO::LastInsertId()が動作しない可能性があります。

これはすべてうまくいっていますが、これはどのように達成されましたか?

私は理解していますPDOはデータベース接続のもう一つの抽象化層ですが、mysqli_insert_idの機能についても話しています。

私の考えではキャッシュ(not on PHP's side)がありました。このコードはマニュアルページのwarezthebeef at gmail dot comからこのビットを読むと真実でした。

// Assume $dbh connection handle is already established 
$sql = "INSERT INTO product (product_name) OUTPUT INSERTED.product_id VALUES (?)"; 
$sth = $dbh->prepare($sql); 
$sth->execute(array('widgets')); 
$temp = $sth->fetch(PDO::FETCH_ASSOC); 

echo "<pre>",print_r($temp),"</pre>"; 

これが表示されます:

Array 
(
    [product_id] => E1DA1CB0-676A-4CD9-A22C-90C9D4E81914 
) 

をこれは、データベース内のテーブルには、行product_idが含まれます原因であるとSQLにあなたがされるであろう、挿入した後に行出力に述べていますより一般的な用語の場合はidAUTO_INCRAMENTを使用する場合は単なる数字になります。我々だけで使用することができ、我々はPDO::LastInsertID()メソッドを使用しなかった場合のように、

ので(これもRETURNING SQLキーワードで達成可能である)(あなたはhereを見ることによって、それに詳細を読むことができます):

$sql = "INSERT INTO table (name, country) OUTPUT INSERTED.id VALUES (?,?)"; 
$sth = $dbh->prepare($sql); 
$sth->execute(['jack', 'Australia']); 
$temp = $sth->fetch(PDO::FETCH_ASSOC); 

echo $temp['id'] 

データベースに挿入した新しいIDを出力する必要があります。AUTO_INCRAMENTプライマリまたはOID列を使用していることに注意してください。

PDOはPHP's Tempのデータをキャッシュしていて、メソッドが呼び出されたときにそのデータを取得または書き込みできます。RETURNING idなどを追加することもできますが、そうではありません。それはOID列に基づいているので、それは動作する方法です。

は、私は質問の半分に答え - 私はこの方法が実際に最後のIDを格納したり、それを

感謝を引く方法を思ったんだけど!

+0

私はmysqlの最後のinsert id関数を使用していると思います。 http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id – bassxzero

+0

これに対して、 '$ lastInsertId = $ステートメントで直接' id'を選択することができますdbh-> lastInsertId(); ' – cmorrissey

答えて

2

正確な実装はドライバによって異なります。私はそれが私がよく知っているので、MySQLのためにどのように動作するか記述することができます。

我々はHow does MySqlCommand.LastInsertedId work?質問への回答で述べたように:MySQLは成功し、クライアントから要求されたクエリを実行した場合

、その後、MySQLは、応答としてOK_Packetを送信します。 OK_PacketのMySQLのペイロードに

は、(上記のリンク先のドキュメントを参照)最後に挿入されたIDを含む:サーバなしselect last_insert_id()

Type  | Name   | Description 
------------|----------------|----------------------------------- 
int<1>  | header   | [00] or [fe] the OK packet header 
int<lenenc> | affected_rows | affected rows 
int<lenenc> | last_insert_id | last insert-id 
... 

はOK_packetにこの値を移入するために実行されます。ドライバはパケットから最後に挿入されたIDを取得し、PDOはドライバから値を取得します。

+0

そしてコード内で実際にリトレースしたいのであれば、https://github.com/php/php-src/blob/PHP-7.1.0/extで始めることをお勧めします。 /pdo_mysql/mysql_driver.c#L288に移動し、https://github.com/php/php-src/blob/PHP-7.1.0/ext/mysqlnd/mysqlnd_wireprotocol.c#L2839 – VolkerK

+0

にお問い合わせください。 :-) – Jek

関連する問題

 関連する問題