2011-12-26 9 views
1

fooと呼ばれるテーブルがid (PRIMARY & AUTO_INCREMENT)の列と考えてください。私はこのテーブルに行を挿入しており、この時点でチャレンジが開始されます。"mysql_insert_id"に依存する

$db->query("INSERT INTO `foo` (id, row1, ...) VALUES('', '$row1', ...)"); 
if (!$db->is_error && $db->last_insert_id) { 
    $id = $db->last_insert_id; 
    do_really_important_things_with_last_ID($id); 
    do_another_important_things_with_last_ID($id); 
    ... 
    do_ ... with_last_ID($id); 
    do_ ... with_last_ID($id); 
} 

私はすぐにINSERTクエリの後、それを呼び出して、正確に現在の接続リンクを使用してlast_insert_idを取得中に、どのようにそれは問題ではない(?)知りませんよ。

$this->dbh = @mysql_connect(.....); 
... 
// query function 
$this->result = @mysql_query($query, $this->dbh); 
... 
if (preg_match("/insert/i", $query)) { 
    $this->last_insert_id = @mysql_insert_id($this->dbh); 
} 


私はmysql_insert_idに頼って、この実装を心配すべきか?

答えて

5

LAST_INSERT_IDは、IDに挿入された詳細については、http://dev.mysql.com/doc/refman/5.1/en/getting-unique-id.html

function last_insert_id(){ 
return @mysql_insert_id(); 
} 

if (!$db->is_error && $db->last_insert_id()) { 
    $id = $db->last_insert_id(); 
    do_really_important_things_with_last_ID($id); 
    do_another_important_things_with_last_ID($id); 
    ... 
    do_ ... with_last_ID($id); 
    do_ ... with_last_ID($id); 
} 
+0

ありがとう@Hemant;しかし、 '$ this-> last_insert_id'を' $ db-> query() '関数に' $ query'に 'INSERT'キーワードが含まれていればすぐに格納します。 –

+0

クエリでidフィールドを使用してスキップしてみてください – Dau

4

ルック返す関数、である必要があり、それはこの意見:最近生成LAST_INSERT_ID()については、

IDは、接続ごとに に保持され、別の クライアントによって変更されることはありません。別のAUTO_INCREMENT 列を(つまり、NULLではない値であり、 は0ではありません)。 LAST_INSERT_ID()とAUTO_INCREMENTカラムを同時に使用すると、複数のクライアントから同時に が完全に有効になります。各クライアント は

だから、あなたが望むものをやって問題ないはずです「。クライアント が実行された最後の文の最後に挿入IDを受信すると、あなたは奇妙な結果を得るべきではありません。

3

@Antonがあります正しいそれ以外の場合、それは予期しない結果が返されます。トランザクションで使用する場合、

。以下を追加したいにmysql_insert_id() がコミットする前に呼び出さなければなりません。

礼儀http://php.net/manual/en/function.mysql-insert-id.php

関連する問題