使用PDO进行预处理插入后获取最后插入的ID

41

我正在使用PHP PDO与PostgreSQL进行新项目开发。

在给定以下函数的情况下,如何返回刚插入的行的ID?它现在的样子行不通。

function adauga_administrator($detalii) {
    global $db;
    $ultima_logare = date('Y-m-d');

    $stmt = $db->prepare("INSERT INTO site_admins (sa_nume, sa_prenume, sa_user_name, sa_password, sa_email, sa_id_rol, sa_status, sa_ultima_logare) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bindParam(1, $detalii['nume']);
    $stmt->bindParam(2, $detalii['prenume']);
    $stmt->bindParam(3, $detalii['username']);
    $stmt->bindParam(4, md5(md5($detalii['parola'] . SIGURANTA_PAROLE) . SIGURANTA_PAROLE));
    $stmt->bindParam(5, $detalii['email']);
    $stmt->bindParam(6, $detalii['rol'], PDO::PARAM_INT);
    $stmt->bindParam(7, $detalii['status'], PDO::PARAM_INT);
    $stmt->bindParam(8, $ultima_logare);    
    $stmt->execute(); 

    $id = $db->lastInsertId();
    return $id;
}

还可以这样调用 - return $db->lastInsertId($stmt); - Rohit Suthar
3个回答

60

来自手册

  

返回最后插入行的ID或序列对象的最后一个值,具体取决于底层驱动程序。例如,PDO_PGSQL()要求您为名称参数指定序列对象的名称。

应该是这样的:

return $db->lastInsertId('yourIdColumn');

[编辑] 更新文档链接


7
我使用序列名称作为lastInsertId()的参数,它有效了。谢谢。 - Psyche
6
序列名称是什么?包含自增值的列的名称是什么? - brianmearns
@sh1ftst0rm 序列在Postgres中使用,而不是MySQL。如果没有传递参数(假设您有主键),MySQL通常会返回。 - arleslie
\d tablename 显示了 id | integer | not null default nextval('addr_source_id_seq'::regclass),我输入了 addr_source_id_seq,然后就成功了!所以在我的情况下,不是 table_column_seq 这一行的问题。 - simno

11
从PHP手册中可以看到:
例如,PDO_PGSQL()函数要求您为name参数指定一个序列对象的名称。
您还可以在INSERT语句中使用RETURNING,并像SELECT结果一样获取INSERT结果。

4

之前的回答(包括PDO文档)并不是很清晰。

在PostgreSQL中,当您使用SERIAL数据类型时,会创建序列。

CREATE TABLE ingredients (
  id         SERIAL PRIMARY KEY,
  name       varchar(255) NOT NULL,
);

因此,序列名称将是ingredients_id_seq
$db->lastInsertId('ingredients_id_seq');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接