2012-05-21 71 views
104

我有一个查询,我想要插入最后一个ID。字段ID是主键和自动递增。PDO获取插入的最后一个ID

我知道,我必须用这个语句:

LAST_INSERT_ID() 

这种说法可与这样的查询:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())"; 

但是,如果我想用这个说法来获取ID:

$ID = LAST_INSERT_ID(); 

我得到这个错误:

Fatal error: Call to undefined function LAST_INSERT_ID() 

我在做什么错?

回答

220

这是因为这是一个SQL函数,而不是PHP。您可以使用PDO::lastInsertId()

像:

$stmt = $db->prepare("..."); 
$stmt->execute(); 
$id = $db->lastInsertId(); 

如果你想用SQL代替PDO API来做到这一点,你会做它像一个正常的选择查询:

$stmt = $db->query("SELECT LAST_INSERT_ID()"); 
$lastId = $stmt->fetchColumn(); 
+0

是你的权利,我发现它和它的作品,谢谢你,我会接受的答案 –

+2

@IllyasMimouni能否请您解释一下编辑如何提供更高的安全性?在交易中包装单个陈述不会提供任何内容。 – Corbin

+0

@Corbin:我删除了部分,你说得对。 – Mimouni

4

lastInsertId()后才能正常工作INSERT查询。

正确:

$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
           VALUES($username,$email,$pass)"); 
$sonuc = $stmt->execute(); 
$LAST_ID = $this->conn->lastInsertId(); 

错误:

$stmt = $this->conn->prepare("SELECT * FROM users"); 
$sonuc = $stmt->execute(); 
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0 
+8

糟糕的例子是,变量在查询中没有位置。使用准备好的语句:http://php.net/manual/en/pdo.prepared-statements.php –