returning last id mit PDO

Hey All,

ich versuche schon einige Zeit mit phpDataObjects beim Insert mir die letzte id zu holen.

Funktioniert das mit PDO und Postgresql überhaupt??

Wenn ja dann wie??

Ich habe es jetzt so:

public function insert( $table, $fields, $values, $lastInsertId = FALSE ){
        $stmt = parent::prepare("INSERT INTO $table (".implode(',',$fields).") VALUES (".str_repeat("?,",count($fields)-1)."?) " );
        if( $this->logAll ) $this->writeLog( __FUNCTION__.': '.$stmt->queryString );
        if( !$result = $stmt->execute( $values ) ) $this->error( $stmt->errorInfo() );
        if( $lastInsertId ){  //parent::lastInsertId('id'); doesn't work
            $stmt = parent::prepare('SELECT max(id) as id FROM '.$table);
            if( !$result = $stmt->execute() ) $this->error( $stmt->errorInfo() );
            $lastId = $stmt->fetch(PDO::FETCH_NUM);
            return $lastId['0'];
        }
        return $result;
        //$lastInsertId ? $stmt->fetch(PDO::FETCH_ASSOC)[$lastInsertId] : $result; 
    }

Vlt gibt es da ja noch eine elegantere Lösung…

Viele Grüße

Ronny

versuch mal diese Form:

test=# create table foo(id serial, val text);
CREATE TABLE
test=*# insert into foo values (default, 'test') returning id;
 id 
----
  1
(1 Zeile)

INSERT 0 1
test=*#

Ich weiß aber nicht, ob PDO das auswerten kann. Ansonsten mit :

test=*# select * from currval('foo_id_seq');
 currval 
---------
       1
(1 Zeile)

test=*#

Das sollte definitiv gehen, ist aber halt ‘eine Runde mehr laufen’ :wink:

PS.: currval() ist safe, das bezieht sich immer auf die aktuelle Session. Sag ich nur, um Deine nächste Frage gleich zu beantworten.

Die Frage ist hier, möchtest du die höchste allgemein in der Tabelle, oder die zuletzt von dir eingefügte.
Wenn du ersteres möchtest, dann ist max(id) der richtige Weg. Bei Zweiterem musst du bei curval() schauen, dass du nach dem Insert die Session offen lässt, sonst ist das weg. mit “returning id” bekommst du bei einem Insert von mehreren Werten auch mehrere IDs zurück, bzw. jedes mal eine. Hier kannst du dir das ja irgendwo in einer Variable ablegen und die dann am Ende auslesen. Mit max(id) hast du hier u.U. ein Problem, wenn parallel mehrere auf der DB arbeiten. Dann kann es sein, das bevor du abfragt schon andere Daten eingetragen haben und damit die id höher ist als die zuletzt von dir eingefügte.