Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

mysql -> postgres portierungsproblem mit mysql_insert_id()

Hallo zusammen!

Ich habe eine alte mysql-Abstraktions-Klasse von mir gerade in der Mangel um eine Applikation auch postgres-fähig zu machen. Dabei bin ich auf folgendes Problem gestoßen:

Die Funktion mysql_insert_id() liefert den Wert des letzten gesetzten Auto-Increment-Feldes (zB. einer Datensatz-ID) zurück. Eine solche Funktion fehlt innerhalb der Postgres-Funktionen leider völlig.

Hat jemand Erfahrungen mit einem Workaround? Meine Datensätze haben einen Identifier vom Typ SERIAL in postgres. Was ich also brauche ist der Wert dieses Serial-Feldes, der von einem Insert, Update oder Delete betroffen ist.

Beispiel:

Tabelle Test
|-----------------
|-id (SERIAL)
|-value (character(100))


pg_query($connection,"INSERT INTO test (value) VALUES ('testeintrag')");
-> setzt einen ersten Datensatz. ID wird automatisch vergeben und ist dann '1'.

pg_query($connection,"UPDATE test SET value='teständerung' WHERE value='testeintrag'");
-> setzt den geänderten Wert

Was ich brauche ist der Wert des ID Feldes des vom Update betroffenen Datensatzes (hier: '1').

Aber wie?

Vielen Dank im Voraus!

Hier gehts zum Orginal Eintrag "mysql -> postgres portierungsproblem mit mysql_insert_id()" im Forum

Antworten

[doc]pg_last_oid [/doc]

Steht doch alles in der Doku??????


2.

Zitat:
ende postete
[doc]pg_last_oid [/doc]

Steht doch alles in der Doku??????
Wenn es in der Doku stünde, würde ich es nicht hier versuchen herauszufinden.

pg_last_oid() liefert den internen Postgres-Objektbezeichner zurück, nicht aber den letzten Wert der in eine auto-increment-Spalte geschrieben wurde.

Aber mit etwas Bastelei und dank strikter Postgres-Namenskonventionen kam ich dann auf so etwas:

function pg_insert_id($tablename, $fieldname)
{
global $dbconnection;
$results=pg_query($dbconnection, "SELECT last_value FROM public.\"".$tablename."_".$fieldname."_seq\"");
$seq_array=pg_fetch_row($results, 0);
return $seq_array[0];
}

Das funktioniert auch, liefert aber bei einem erfolglosen Schreibversuch ohne Datenbank-Kosequenz trotzdem die letzten vergebenen auto-increment-Wert zurück.


3.

... also sollte man dafür Sorge tragen, die Funktion einmal vor und einmal nach einem insert aufzurufen und die Rückgabewerte zu vergleichen. Ist der zweite größer als der erste Wert, hat der Insert funktioniert.

z.B.:

$sql = "INSERT INTO test (value) VALUES ('testeintrag')";
$queryparts = split(" ",$sql);
$oldinsertid = $this->pg_last_insert_id($queryparts[2],"id");
$results = pg_query($dbconnection,$sql);
if(!$results) { return false; }
$newinsertid= $this->pg_last_insert_id($queryparts[2],"id");
if ($newinsertid > $oldinsertid) { return $newinsertid; }
else { return false; }

Dann sollte die Funktion (wie hier im Beispiel) aber richtigerweise auch "pg_last_insert_id()" heißen. ;)


Hier gehts zum Orginal Eintrag "mysql -> postgres portierungsproblem mit mysql_insert_id()" im Forum
 
phpforum.de | Impressum