2013-06-03 215 views
1

在此先感謝您閱讀本文,我無法找到解決我的問題的答案......我不明白我所做的與教程/建議不同發現:PHP PDO :: lastInsertId()返回0

SQL表

CREATE TABLE IF NOT EXISTS `LastInsertID` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` char(150) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 

PHP文件

<?php 

// Connect to database 
$user = "foo"; 
$pswd = "bar"; 

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pswd); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// Prepare request 
$rq = $db->prepare('INSERT INTO `LastInsertID` VALUES(NULL,:name,:email)'); 

// Begin and commit request 
$db->beginTransaction(); 
$values = array('name'=>'Foo','email'=>'[email protected]'); 
$rq->execute($values); 
$db->commit(); 

// Echo last ID 
echo $db->lastInsertId(); 

?> 

這種再當它應該返回時變爲0.問題在哪裏?

+1

http://www.php.net/manual/en/pdo.lastinsertid.php#85129 –

+0

@Pekka웃愚蠢的我,我沒有代碼示例... – Sheljohn

回答

6

如果您處於事務中,您必須在提交之前使用$db->lastInsertId()。即使你回滾一個事務,這個id也是「被使用」或跳過了,這就是爲什麼你不應該依賴ID來連續的原因。

+0

謝謝;這會返回正確的ID :)但是如果我在不提交的情況下在不同的表中執行多個準備好的請求,會在每次請求後正確更新嗎? – Sheljohn

+0

是的,你可以做很多查詢,並獲得交易中的每個ID。 – Mike

+0

非常感謝您的幫助!我會標記你作爲答案,因此讓我:) – Sheljohn

0

使用此

INSERT INTO `LastInsertID` (name, email) VALUES(:name,:email) 

代替

INSERT INTO `LastInsertID` VALUES(NULL,:name,:email) 

我已經刪除了NULL

+1

不前閱讀句子改變行爲 –

+0

@Pekka웃好的我在這裏有疑問。如果對於唯一的'Id'和自動增量設置爲'NULL'不會影響? – Yogus

+0

如果指定NULL,自動增量將填充正確的值。 (你提出的方式也沒有錯 - 它不能解決OP的問題,這與提交有關,請參閱Mike的回答) –