Obtener el último id de inserción después de un inserto preparado con PDO


Estoy usando PHP PDO con PostgreSQL para un nuevo proyecto.

Dada la siguiente función, ¿cómo puedo devolver el id de la fila que acabo de insertar? No funciona como parece ahora.

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;
}
Author: Psyche, 2011-02-20

3 answers

Del Manual :

Devuelve el ID de la última inserción fila, o el último valor de una secuencia objeto, dependiendo del subyacente controlador. Por ejemplo, PDO_PGSQL() requiere que especifique el nombre de un objeto de secuencia para el nombre parámetro.

Debería ser algo así como:

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

[EDITAR] Actualizar enlace a doc

 59
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-02 14:22:20

Del manual de PHP :

Por ejemplo, PDO_PGSQL () requiere que para especificar el nombre de una secuencia objeto para el parámetro name.

También puede usar DEVOLVIENDO en la instrucción INSERT-y obtener el resultado INSERT-result como un resultado SELECT.

 11
Author: Frank Heikens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-20 15:37:18

Las respuestas anteriores no son muy claras (DOP doc también)

En PostgreSQL, las secuencias se crean cuando se utiliza el tipo de datos SERIAL.

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

Así que el nombre de la secuencia será ingredients_id_seq

$db->lastInsertId('ingredients_id_seq');
 4
Author: m4tm4t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-26 14:35:53