web-dev-qa-db-ja.com

PDOで準備された挿入の後、最後の挿入IDを取得します

私は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;
}
41
Psyche

手動 から:

基になるドライバーに応じて、最後に挿入された行のID、またはシーケンスオブジェクトの最後の値を返します。たとえば、PDO_PGSQL()では、nameパラメーターにシーケンスオブジェクトの名前を指定する必要があります。

次のようになります。

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

[編集]ドキュメントへのリンクを更新

59
Alix Axel

PHP manual から:

たとえば、PDO_PGSQL()では、nameパラメーターにシーケンスオブジェクトの名前を指定する必要があります。

また、INSERTステートメントで [〜#〜] returning [〜#〜] を使用して、SELECT結果のようにINSERT結果をフェッチすることもできます。

11
Frank Heikens

以前の回答はあまり明確ではありません(PDOドキュメントも)

PostgreSQLでは、SERIALデータ型を使用しているときにシーケンスが作成されます。

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

したがって、シーケンス名はingredients_id_seq

$db->lastInsertId('ingredients_id_seq');
4
m4tm4t