Äquivalent zu $mysqli->insert_id für PostgreSQL

Hi,

ich bin derzeit dabei PostgreSQL Unterstützung einzubauen, habe jedoch
das Problem, dass es für die Insert ID des letzten Statements keine
Funktion in PHP gibt bzw. keine gefunden habe.

Bisher hab ich nur heraus gefunden, dass man mit einem auf das Insert
Statement folgendem Select Statement diese ID bekommen kann:
"select currval(...)"

Für die Punkte muss man aber nun ein Namen übergeben. Ist dieser Name in
irgendeiner Weise standardmäßig festgelegt, kann dieser vom Benutzer
frei gewählt werden oder woraus setzt sich dieser zusammen? Wenn dieser
vom Benutzer frei bestimmt werden kann, kann dieser mit Hilfe der Angabe
der Tabelle oder direkt nach dem Insert Statement ermittelt werden?

Allgemein benötige ich eine Lösung, welche nicht mehr benötigt als das
Insert Statement, das Result davon und die Connection. Es sind keine
weiteren Daten Übergabe wie eindeutige Namen für diese Funktionalität
möglich.

Kennt daher einer von euch eine Lösung?

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 19:39 ] [ ID #1903835 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

PS: Wenn ich schon dabei bin und ein Thread offen habe. :)

Ich habe ebenfalls keine Lösung dafür gefunden eine Liste von
Tabellennamen der aktuell verbundenen Datenbanke zu bekommen.

(In MySQL würde dies mit "SHOW TABLES" funktionieren)

Kennt da jemand eine Möglichkeit das gleiche von einer PostgreSQL
Datenbank zu bekommen?

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 19:42 ] [ ID #1903836 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:

> Ich habe ebenfalls keine Lösung dafür gefunden eine Liste von
> Tabellennamen der aktuell verbundenen Datenbanke zu bekommen.

> Kennt da jemand eine Möglichkeit das gleiche von einer PostgreSQL
> Datenbank zu bekommen?

Wie bei Oracle auch stehen diese Informationen in Systemkatalogen, die
du mit SQL abfragen kannst. Du suchst die View pg_tables, bzw.

SELECT schemaname, tablename
FROM pg_tables
WHERE tableowner LIKE 'besitzer'

Eine Übersicht aller Systemviews findest du - wer hätte das gedacht - im
Handbuch. <http://www.postgresql.org/docs/8.2/interactive/catalogs.html>

RTFM!

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Mi, 09 Januar 2008 20:20 ] [ ID #1903837 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:

> ich bin derzeit dabei PostgreSQL Unterstützung einzubauen, habe jedoch
> das Problem, dass es für die Insert ID des letzten Statements keine
> Funktion in PHP gibt bzw. keine gefunden habe.

<http://www.postgresql.org/docs/8.2/interactive/index.html>

> Bisher hab ich nur heraus gefunden, dass man mit einem auf das Insert
> Statement folgendem Select Statement diese ID bekommen kann:
> "select currval(...)"

SELECT currval('tabelle_spalte_seq')

> Für die Punkte muss man aber nun ein Namen übergeben. Ist dieser Name in
> irgendeiner Weise standardmäßig festgelegt, kann dieser vom Benutzer
> frei gewählt werden oder woraus setzt sich dieser zusammen? Wenn dieser
> vom Benutzer frei bestimmt werden kann, kann dieser mit Hilfe der Angabe
> der Tabelle oder direkt nach dem Insert Statement ermittelt werden?

Du fragst mit currval('sequenz') den aktuellen Wert der Sequenz mit dem
Namen 'sequenz' ab. Der Name ist frei definierbar.

CREATE SEQUENCE blubb START 4711;

Wenn du jedoch den Datentyp "serial" oder "bigserial" verwendest, dann
wird eine Art "AUTO_INCREMENT" Mechanismus verwendet. Intern passiert
nichts anderes als

CREATE SEQUENCE tabelle_spalte_seq;
CREATE TABLE tabelle (
spalte integer NOT NULL DEFAULT nextval('tabelle_spalte_seq')
);

> Allgemein benötige ich eine Lösung, welche nicht mehr benötigt als das
> Insert Statement, das Result davon und die Connection. Es sind keine
> weiteren Daten Übergabe wie eindeutige Namen für diese Funktionalität
> möglich.
>
> Kennt daher einer von euch eine Lösung?

RTFM!

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Mi, 09 Januar 2008 20:27 ] [ ID #1903838 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Thomas Hamacher schrieb:
> <http://www.postgresql.org/docs/8.2/interactive/index.html>

Thx, werde ich dann die Tage über probieren.

> Du fragst mit currval('sequenz') den aktuellen Wert der Sequenz mit dem
> Namen 'sequenz' ab. Der Name ist frei definierbar.
>
> CREATE SEQUENCE blubb START 4711;

Ich unterstütze dann nur die untenstehende Variante. Weil frei
definierbare Namen kann ich nicht ohne weiteres automatisiert
unterstützen. Hierfür müsste der Benutzer dann selbst ein Statement
abschicken.

> Wenn du jedoch den Datentyp "serial" oder "bigserial" verwendest, dann
> wird eine Art "AUTO_INCREMENT" Mechanismus verwendet. Intern passiert
> nichts anderes als
>
> CREATE SEQUENCE tabelle_spalte_seq;
> CREATE TABLE tabelle (
> spalte integer NOT NULL DEFAULT nextval('tabelle_spalte_seq')
> );

Also benötige ich den Tabellennamen und den Spaltennamen. Ersteres
bekomme ich aus dem Insert Statement und damit kann ich bestimmt mit den
Systemkatalog Views die Spalte heraus finden, welche als Serial oder
Bigserial definiert wurde, oder? ;)

(Ich werde mal schauen, aber wer gerade die Antwort darauf hat kann ja
auch schnell antworten *g*)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 20:27 ] [ ID #1903839 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Thomas Hamacher schrieb:
> Wie bei Oracle auch stehen diese Informationen in Systemkatalogen, die
> du mit SQL abfragen kannst. Du suchst die View pg_tables, bzw.

Kommt mir bekannt vor aus DB2.

> SELECT schemaname, tablename
> FROM pg_tables
> WHERE tableowner LIKE 'besitzer'
>
> Eine Übersicht aller Systemviews findest du - wer hätte das gedacht - im
> Handbuch. <http://www.postgresql.org/docs/8.2/interactive/catalogs.html>

Thx, schaue ich mir ebenfalls die Tage über an. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 20:29 ] [ ID #1903840 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Thomas Hamacher schrieb:
>> <http://www.postgresql.org/docs/8.2/interactive/index.html>

> Thx, werde ich dann die Tage über probieren.

Gern geschehen. Die Dokumentation solltest du in jedem Fall zumindest
quer lesen, wenn du vor hast deine Anwendungen mit PostgreSQL laufen zu
lassen. Das Teil ist sehr komplex.

>> Wenn du jedoch den Datentyp "serial" oder "bigserial" verwendest, dann
>> wird eine Art "AUTO_INCREMENT" Mechanismus verwendet. Intern passiert
>> nichts anderes als
>>
>> CREATE SEQUENCE tabelle_spalte_seq;
>> CREATE TABLE tabelle (
>> spalte integer NOT NULL DEFAULT nextval('tabelle_spalte_seq')
>> );

> Also benötige ich den Tabellennamen und den Spaltennamen.

Wenn du Postgre 8.2 zur Verfügung hast, dann kannst du ggf. auch die
proprietäre Erweiterung INSERT INTO ... RETURNING verwenden. Dann wird
die Sequenznummer zurückgegeben. Weiss aber nicht ob das in dein Konzept
passt.

<http://www.postgresql.org/docs/8.2/interactive/sql-insert.html>

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Mi, 09 Januar 2008 20:58 ] [ ID #1903841 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Thomas Hamacher wrote:

> Christoph Herrmann schrieb:
>
>> Ich habe ebenfalls keine Lösung dafür gefunden eine Liste von
>> Tabellennamen der aktuell verbundenen Datenbanke zu bekommen.
>
>> Kennt da jemand eine Möglichkeit das gleiche von einer PostgreSQL
>> Datenbank zu bekommen?
>
> Wie bei Oracle auch stehen diese Informationen in Systemkatalogen, die
> du mit SQL abfragen kannst. Du suchst die View pg_tables, bzw.
>
> SELECT schemaname, tablename
> FROM pg_tables
> WHERE tableowner LIKE 'besitzer'
>

Ich würde hier aber eher ein Blick in das im SQL Standard
definierte "Information Schema"[1] von PostgreSQL vorschlagen. Die
Systemtabellen _können_ sich von Version zu Version ändern, das Information
Schema nicht (solange sich der Standard nicht ändert *g*).

[1] http://www.postgresql.org/docs/current/static/information-sc hema.html

Robert

PS: Das Information Schema gibt es auch in "neueren" MySQL Versionen.
mueller [ Mi, 09 Januar 2008 20:57 ] [ ID #1903842 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Robert Müller schrieb:
> Thomas Hamacher wrote:
>> Christoph Herrmann schrieb:

>>> Ich habe ebenfalls keine Lösung dafür gefunden eine Liste von
>>> Tabellennamen der aktuell verbundenen Datenbanke zu bekommen.
>>> Kennt da jemand eine Möglichkeit das gleiche von einer PostgreSQL
>>> Datenbank zu bekommen?

>> Wie bei Oracle auch stehen diese Informationen in Systemkatalogen, die
>> du mit SQL abfragen kannst. Du suchst die View pg_tables, bzw.

>> SELECT schemaname, tablename
>> FROM pg_tables
>> WHERE tableowner LIKE 'besitzer'

> Ich würde hier aber eher ein Blick in das im SQL Standard
> definierte "Information Schema"[1] von PostgreSQL vorschlagen. Die
> Systemtabellen _können_ sich von Version zu Version ändern, das Information
> Schema nicht (solange sich der Standard nicht ändert *g*).

ACK! Das ist in diesem Fall wirklich viel besser.

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Mi, 09 Januar 2008 21:15 ] [ ID #1903844 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Thomas Hamacher schrieb:
> Gern geschehen. Die Dokumentation solltest du in jedem Fall zumindest
> quer lesen, wenn du vor hast deine Anwendungen mit PostgreSQL laufen zu
> lassen. Das Teil ist sehr komplex.

Andere Frage, ich persönlich benötige keine Postgre Unterstützung, will
es aber in mein Framework einbauen, da es anscheinend recht verbreitet
ist. Denkt Ihr denn, dass Postgre populär genug ist, sodass man es in
einem Framework unterstützen sollte?

Darüber hinaus wird noch MySQL, MySQLi, SQLite und ODBC unterstützt.
Falls es noch weitere wichtige Datenbanken gibt, die von Haus aus von
PHP unterstützt werden, kann man mir das gerne per PM schicken. :)

> Wenn du Postgre 8.2 zur Verfügung hast, dann kannst du ggf. auch die
> proprietäre Erweiterung INSERT INTO ... RETURNING verwenden. Dann wird
> die Sequenznummer zurückgegeben. Weiss aber nicht ob das in dein Konzept
> passt.
>
> <http://www.postgresql.org/docs/8.2/interactive/sql-insert.html>

Mein Konzept ist ein Nachbau von Javas JDBC. Ich hab Schnittstellen [1]
die allgemein Datenbankverbindung, Prepared Statements und die
Verarbeitung eines Results definieren und darunter leg ich dann in PHP
geschriebene "Treiber", also konkrete Klassen, die das Ganze dann auf
die jeweilige Datenbank zugeschnitten implementieren. Für den Anwender
ist es daher fast transparent (mit Ausnahme von Datenbankspezifischem
SQL, da ist eine Lösung noch in der Ideensammlung), welche Datenbank
darunter liegt.

Daher funktioniert die Lösung allgemein in der aktuellen PostgreSQL
Version, ist das für mich vollkommen ausreichend (soweit ich das sehe,
könnte man es ja einfach automatisch bei Insert Statements hintendran
hängen). Aber wegen den sehr Allgemein gehaltenen Schnittstellen will
ich nicht einfach Datenbankspezifische Sachen wie den Serialnamen
übergeben lassen.

[1] http://dragonengine.de/Downloads/connection.png
(Noch nicht komplett ausgereift und in Arbeit, aber vom Konzept her
sollte es zur Anschauen genügen, wenn es jemand interessiert)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 22:33 ] [ ID #1903847 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Thomas Hamacher wrote:
> Christoph Herrmann schrieb:
>
>
>>ich bin derzeit dabei PostgreSQL Unterstützung einzubauen, habe jedoc=
h
>>das Problem, dass es für die Insert ID des letzten Statements keine
>>Funktion in PHP gibt bzw. keine gefunden habe.
>
>
> <http://www.postgresql.org/docs/8.2/interactive/index.html>
>
>>Bisher hab ich nur heraus gefunden, dass man mit einem auf das Insert
>>Statement folgendem Select Statement diese ID bekommen kann:
>>"select currval(...)"
>
>
> SELECT currval('tabelle_spalte_seq')

Dazu habe ich mal eine Nachfrage. Ich mich mit PostgreSQL leider bisher
nicht beschäftigt. Habe das aber auf die Schnelle nicht im Handbuch
gefunden. Wie ist denn da sichergestellt, dass zwischen meinem Insert
und dem Select currval kein konkurriender insert statt gefunden hat?
Muss ich da die Tabelle locken oder bezieht sich das curval auf die
meine aktuelle DB-Verbindung?
Stefan Dreyer [ Mi, 09 Januar 2008 23:02 ] [ ID #1903848 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Thomas Hamacher schrieb:
>> Gern geschehen. Die Dokumentation solltest du in jedem Fall zumindest
>> quer lesen, wenn du vor hast deine Anwendungen mit PostgreSQL laufen zu
>> lassen. Das Teil ist sehr komplex.

> Andere Frage, ich persönlich benötige keine Postgre Unterstützung, will
> es aber in mein Framework einbauen, da es anscheinend recht verbreitet
> ist. Denkt Ihr denn, dass Postgre populär genug ist, sodass man es in
> einem Framework unterstützen sollte?

Ja. Aber lass dir den "Treiber" doch von jemandem implementieren, der PG
besser kennt als du ;)

> Darüber hinaus wird noch MySQL, MySQLi, SQLite und ODBC unterstützt.
> Falls es noch weitere wichtige Datenbanken gibt, die von Haus aus von
> PHP unterstützt werden, kann man mir das gerne per PM schicken. :)

So gesehen wird "von Haus aus" von PHP gar nichts unterstützt. Dazu
braucht es schon die entsprechenden Client-Bibliotheken und eine
entsprechende Erweiterung.

Mir fehlt Oracle in der Liste. Gerade seit der kostenlosen Oracle
Express Edition könnte das interessant sein.

>> Wenn du Postgre 8.2 zur Verfügung hast, dann kannst du ggf. auch die
>> proprietäre Erweiterung INSERT INTO ... RETURNING verwenden. Dann wird
>> die Sequenznummer zurückgegeben. Weiss aber nicht ob das in dein Konzept
>> passt.
>>
>> <http://www.postgresql.org/docs/8.2/interactive/sql-insert.html>

> Mein Konzept ist ein Nachbau von Javas JDBC. Ich hab Schnittstellen [1]
> die allgemein Datenbankverbindung, Prepared Statements und die
> Verarbeitung eines Results definieren und darunter leg ich dann in PHP
> geschriebene "Treiber", also konkrete Klassen, die das Ganze dann auf
> die jeweilige Datenbank zugeschnitten implementieren. Für den Anwender
> ist es daher fast transparent (mit Ausnahme von Datenbankspezifischem
> SQL, da ist eine Lösung noch in der Ideensammlung), welche Datenbank
> darunter liegt.

Du kennst Creole/Propel? Das ist die JDBC-API und ein Port von Apache
Torque. Mit Phing-Tasks wird dann das Datenmodell aus Definitionsdateien
generiert über die Kommandozeile. Wenn man ANT unter Java kennt, dann
kommt einem die vorgehensweise jedoch sehr vertraut vor. Ob das im
produktiven Einsatz was taugt weiss ich aber nicht.

Dort haben die das Problem mit "ID-Generatoren" gelöst:
<http://creole.phpdb.org/trac/browser/trunk/classes/creole/drivers/pgsql/PgSQLIdGenerator.php>

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Do, 10 Januar 2008 00:36 ] [ ID #1903851 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Stefan Dreyer schrieb:
> Dazu habe ich mal eine Nachfrage. Ich mich mit PostgreSQL leider bisher
> nicht beschäftigt. Habe das aber auf die Schnelle nicht im Handbuch
> gefunden. Wie ist denn da sichergestellt, dass zwischen meinem Insert
> und dem Select currval kein konkurriender insert statt gefunden hat?
> Muss ich da die Tabelle locken oder bezieht sich das curval auf die
> meine aktuelle DB-Verbindung?

Das currval bezieht sich auf eine Sequenz mit einem bestimmten Namen
(wie man im Thread gelesen hat entweder beliebiger Namen oder bei
Datentyp Serial tabelle_column_seq). Somit müsstest du zwei Inserts auf
die selbe Tabelle machen bzw. halt auf die selbe Sequenz, ich denke dann
wirst die angesprochenen Probleme haben.

Zumindest rein logisch gesehen, praktisch keine Ahnung. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Do, 10 Januar 2008 00:58 ] [ ID #1904804 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Stefan Dreyer schrieb:
> Thomas Hamacher wrote:
>> Christoph Herrmann schrieb:
>>
>>
>>> ich bin derzeit dabei PostgreSQL Unterstützung einzubauen, habe jedoch
>>> das Problem, dass es für die Insert ID des letzten Statements keine
>>> Funktion in PHP gibt bzw. keine gefunden habe.
>>
>>
>> <http://www.postgresql.org/docs/8.2/interactive/index.html>
>>
>>> Bisher hab ich nur heraus gefunden, dass man mit einem auf das Insert
>>> Statement folgendem Select Statement diese ID bekommen kann:
>>> "select currval(...)"
>>
>>
>> SELECT currval('tabelle_spalte_seq')
>
> Dazu habe ich mal eine Nachfrage. Ich mich mit PostgreSQL leider bisher
> nicht beschäftigt. Habe das aber auf die Schnelle nicht im Handbuch
> gefunden. Wie ist denn da sichergestellt, dass zwischen meinem Insert
> und dem Select currval kein konkurriender insert statt gefunden hat?
> Muss ich da die Tabelle locken oder bezieht sich das curval auf die
> meine aktuelle DB-Verbindung?
>

Currval ist sesson bezogen, also auf deine aktuelle DB-Verbindung, steht
aber direkt so bei currval im postgres manual.
Stefan Braumeister [ Do, 10 Januar 2008 09:26 ] [ ID #1904805 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Thomas Hamacher schrieb:
>> Gern geschehen. Die Dokumentation solltest du in jedem Fall zumindest
>> quer lesen, wenn du vor hast deine Anwendungen mit PostgreSQL laufen zu
>> lassen. Das Teil ist sehr komplex.
>
> Andere Frage, ich persönlich benötige keine Postgre Unterstützung, will
> es aber in mein Framework einbauen, da es anscheinend recht verbreitet
> ist. Denkt Ihr denn, dass Postgre populär genug ist, sodass man es in
> einem Framework unterstützen sollte?

Die Frage ist werden PostgreSQL Nutzer dein Framework nutzen.
PostgreSQL ist im Enterprise Markt angesiedelt, da gehts weniger um
private Homepages etc.

Ich nutze in der Arbeit nur PostgreSQL.

>
> Darüber hinaus wird noch MySQL, MySQLi, SQLite und ODBC unterstützt.
> Falls es noch weitere wichtige Datenbanken gibt, die von Haus aus von
> PHP unterstützt werden, kann man mir das gerne per PM schicken. :)
>
>> Wenn du Postgre 8.2 zur Verfügung hast, dann kannst du ggf. auch die
>> proprietäre Erweiterung INSERT INTO ... RETURNING verwenden. Dann wird
>> die Sequenznummer zurückgegeben. Weiss aber nicht ob das in dein Konzept
>> passt.
>>
>> <http://www.postgresql.org/docs/8.2/interactive/sql-insert.html>
>
> Mein Konzept ist ein Nachbau von Javas JDBC. Ich hab Schnittstellen [1]
> die allgemein Datenbankverbindung, Prepared Statements und die
> Verarbeitung eines Results definieren und darunter leg ich dann in PHP
> geschriebene "Treiber", also konkrete Klassen, die das Ganze dann auf
> die jeweilige Datenbank zugeschnitten implementieren. Für den Anwender
> ist es daher fast transparent (mit Ausnahme von Datenbankspezifischem
> SQL, da ist eine Lösung noch in der Ideensammlung), welche Datenbank
> darunter liegt.

Hört sich danach an als möchtest du PDO neu erfinden.
Was ist der Unterschied zu deinen Klassen und PDO?

Gruß Stefan
Stefan Braumeister [ Do, 10 Januar 2008 09:45 ] [ ID #1904807 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Stefan Braumeister schrieb:
> Hört sich danach an als möchtest du PDO neu erfinden.

Hatte mir vorher PDO nie detailliert angeschaut, weil es eine PECL
Erweiterung war und somit nachinstalliert werden musste (hoffe da liege
ich jetzt nicht falsch). Ich bin dagegen mir die Plattformunabhängigkeit
zu nehmen, sodass meine Anwendung nicht auf jedem Server prinzipiell
lauffähig ist.

Aus diesem Grunde wollte ich genau das Prinzip von PDO (von daher ja,
genau das stellen meine Schnittstellen dar, ein Nachbau dieses Prinzips)
in PHP geschriebener Form haben, was auf jedem Server funktioniert.

> Was ist der Unterschied zu deinen Klassen und PDO?

Ich habe bei php.net nichts darüber gefunden wie man neue Treiber
einbinden kann. Aber ich gehe davon aus (da es sich im eine PECL
Erweiterung handelt), dass diese Treiber nicht in PHP geschrieben sind
bzw. neue Treiber in PHP geschrieben hinzugefügt werden können. Meine
Schnittstellen lassen sich ganz einfach in PHP erweitern.

Des weiteren fügen sich meine Schnittstellen bzw. die implementierenden
Klassen nahtlos in das Gesamtkonzept des Frameworks ein was vor allem
die Fehlerbehandlung mit dem Logsystem betrifft.


Ich werde mir PDO auf jeden Fall genauer anschauen und eventuell Ideen
daraus auf meine Schnittstellen übertragen um diese zu optimieren. Ganz
auf meine Schnittstellen möchte ich aus den oben genannten Gründen nicht
verzichten. Ich denke es wird dann einfach ein PDO "Treiber" angeboten
werden, welcher sich in meine Schnittstellen einfügt.

Auf diese Weise erschlage ich vielleicht die Notwendigkeit für die von
PDO unterstützten Datenbanken selbst Klassen zu implementieren und
geniesse trotzdem die Vorteile meiner Schnittstellen.

Dafür wäre aber interessant zu wissen, ob PDO Allgemein und die Treiber
denn auf jeder PHP Installation zur Verfügung stehen? :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Do, 10 Januar 2008 15:26 ] [ ID #1904817 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Stefan Braumeister schrieb:

>> Hört sich danach an als möchtest du PDO neu erfinden.
>
> Hatte mir vorher PDO nie detailliert angeschaut, weil es eine PECL
> Erweiterung war und somit nachinstalliert werden musste (hoffe da liege=

> ich jetzt nicht falsch).

Das galt bis 5.0. Inzwischen:

> If you're running a PHP 5.1 release, PDO and PDO_SQLITE is included
> in the distribution; it will be automatically enabled when you run
> configure.

> Ich bin dagegen mir die Plattformunabhängigkeit
> zu nehmen, sodass meine Anwendung nicht auf jedem Server prinzipiell
> lauffähig ist.

Im Prinzip eine gute Einstellung. Aber 5.2 solltest du voraussetzen
(können/dürfen/wollen) =3D> http://www.gophp5.org/

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Do, 10 Januar 2008 18:40 ] [ ID #1904842 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Niels Braczek schrieb:
> Im Prinzip eine gute Einstellung. Aber 5.2 solltest du voraussetzen
> (können/dürfen/wollen) => http://www.gophp5.org/

Ich setze derzeit immer eine aktuelle 5er Version voraus, von daher
sollte dies kein Problem sein.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Do, 10 Januar 2008 19:29 ] [ ID #1904843 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Stefan Braumeister schrieb:
>> Hört sich danach an als möchtest du PDO neu erfinden.
>
> Hatte mir vorher PDO nie detailliert angeschaut, weil es eine PECL
> Erweiterung war und somit nachinstalliert werden musste (hoffe da liege
> ich jetzt nicht falsch). Ich bin dagegen mir die Plattformunabhängigkeit
> zu nehmen, sodass meine Anwendung nicht auf jedem Server prinzipiell
> lauffähig ist.

Mittlerweile findest du eigentlich überall php mit PDO, zumindestens ist
das bei allen Hostern, mit denen ich arbeite, so.
Mach einfach ein phpinfo() bei deinen Hostern und guck ob da PDO dabei ist.

Da der PHP4 Support ausläuft wirst du wohl in Zukunft nur noch Exoten
finden, die PDO nicht anbieten.


>
> Aus diesem Grunde wollte ich genau das Prinzip von PDO (von daher ja,
> genau das stellen meine Schnittstellen dar, ein Nachbau dieses Prinzips)
> in PHP geschriebener Form haben, was auf jedem Server funktioniert.
>
>> Was ist der Unterschied zu deinen Klassen und PDO?
>
> Ich habe bei php.net nichts darüber gefunden wie man neue Treiber
> einbinden kann. Aber ich gehe davon aus (da es sich im eine PECL
> Erweiterung handelt), dass diese Treiber nicht in PHP geschrieben sind
> bzw. neue Treiber in PHP geschrieben hinzugefügt werden können. Meine
> Schnittstellen lassen sich ganz einfach in PHP erweitern.
>

Wie auch PDO, in C/C++ geschrieben, und daher auch performanter als in
php geschriebene Klassen. Für PDO hat so ziemlich für jede bekannte DB
einen Treiber.
Stefan Braumeister [ Do, 10 Januar 2008 21:15 ] [ ID #1904849 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Stefan Braumeister schrieb:
> Wie auch PDO, in C/C++ geschrieben, und daher auch performanter als in
> php geschriebene Klassen. Für PDO hat so ziemlich für jede bekannte DB
> einen Treiber.

Deswegen will ich einfach einen Adapter machen, der PDO auf meine
Schnittstellen anpasst und habe so den Vorteil, dass ich sehr performant
und ohne einen größeren Aufwand alle unterstützten Datenbanken habe und
trotzdem über meine Schnittstelle bestimmte Exoten unter den Datenbanken
noch hinzufügen kann mit in PHP geschriebenen Klassen. Und ein Adapter
sollte wohl keinen größeren Performanceverlust nach sich ziehen.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Do, 10 Januar 2008 23:22 ] [ ID #1904851 ]

Re: Äquivalent zu $mysqli->insert_id für PostgreSQL

Christoph Herrmann schrieb:
> Deswegen will ich einfach einen Adapter machen, der PDO auf meine
> Schnittstellen anpasst und habe so den Vorteil, dass ich sehr performant
> und ohne einen größeren Aufwand alle unterstützten Datenbanken habe und
> trotzdem über meine Schnittstelle bestimmte Exoten unter den Datenbanken
> noch hinzufügen kann mit in PHP geschriebenen Klassen. Und ein Adapter
> sollte wohl keinen größeren Performanceverlust nach sich ziehen.

Frage bezüglich PDO, weil ich nichts dazu gefunden habe:

Wenn ich beginTransaction mache, schaltet er das Autocommit aus. Wird
dieses wieder automatisch eingeschaltet bei einem commit oder rollback?
Sodass ich für jede Transaktion wieder beginTransaction machen muss?

Da es keine Methode gibt um die Transaktion sonst zu beenden und in den
Autocommit Modus zu wechseln, gehe ich zumindest davon aus, dass es so
gemacht wird, allerdings ist wissen immer schöner. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 14 Januar 2008 16:35 ] [ ID #1907635 ]
PHP » de.comp.lang.php.misc » Äquivalent zu $mysqli->insert_id für PostgreSQL

Vorheriges Thema: Dereferenzieren von NULL abfangen
Nächstes Thema: imagecopy, Qualität des Bildes