Получить идентификатор последней вставки после подготовленной вставки с PDO

Я использую PHP PDO с PostgreSQL для нового проекта.

Учитывая следующую функцию, как я могу вернуть идентификатор только что вставленной строки? Это не работает так, как выглядит сейчас.

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;
}

person Psyche    schedule 20.02.2011    source источник
comment
Также звоните как - return $db->lastInsertId($stmt);   -  person Rohit Suthar    schedule 18.08.2015


Ответы (3)


Из Руководства:

Возвращает идентификатор последней вставленной строки или последнее значение из объекта последовательности, в зависимости от базового драйвера. Например, PDO_PGSQL() требует, чтобы вы указали имя объекта последовательности для параметра имени.

Это должно быть что-то вроде:

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

[EDIT] Обновить ссылку на документ

person Alix Axel    schedule 20.02.2011
comment
Я попытался использовать имя последовательности в качестве аргумента для lastInsertId(), и это сработало. Спасибо. - person Psyche; 20.02.2011
comment
Как называется последовательность? Имя столбца, содержащего автоматически увеличивающееся значение? - person brianmearns; 08.08.2013
comment
Последовательности @sh1ftst0rm используются в Postgres, а не в MySQL. MySQL обычно возвращается без передачи параметра (если у вас есть первичный ключ). - person arleslie; 22.06.2014
comment
\d tablename показал мне id | integer | not null default nextval('addr_source_id_seq'::regclass), поставил addr_source_id_seq и вуаля! Так что в моем случае это была не table_column_seq строка. - person simno; 08.09.2016

Из руководства по PHP:

Например, PDO_PGSQL() требует, чтобы вы указали имя объекта последовательности для параметра name.

Вы также можете использовать RETURNING в операторе INSERT и получить результат INSERT как ВЫБЕРИТЕ результат.

person Frank Heikens    schedule 20.02.2011

Предыдущие ответы не очень ясны (тоже документ PDO)

В postgreSQL последовательности создаются при использовании типа данных SERIAL.

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

Таким образом, имя последовательности будет ingredients_id_seq

$db->lastInsertId('ingredients_id_seq');
person m4tm4t    schedule 26.07.2015