phpbar.de logo

Mailinglisten-Archive

[php] mysql_insert_id() nicht bei mehreren Connections?

[php] mysql_insert_id() nicht bei mehreren Connections?

Matthias Jim Knopf jim_(at)_users.de
Mon, 14 Aug 2000 23:00:26 +0200 (MEST)


On Mon, 14 Aug 2000, Robert Hoffmann wrote:

> > > >    eigentlich schon, aber wie gesagt:  Sie  IST  erfolgreich.  Wie
> > > >  man  vielleicht  erkennen  kann,  wird  hiermit  ein  User-Account
> > > >  angelegt, und dieser  Account  ist  nachher  auch  vorhanden,  nur
> > > >  weiss ich halt nicht seine ID !
> > >
> > > Einfach mal reingefragt : Warum möchtest du die ID wissen? Wenns nur für
> > > interne DB-Zwecke ist, kannst du das Ganze Problem auch umgehen...
> >
> >     Nein, ich kann es  nicht  wirklich  umgehen,  abgesehen  davon,
> >  dass ich das auch nicht ganz einsehen wuerde... Ich brauche  diese
> >  Funktion an vielen Stellen in meinem Script, und wenn ich auf  sie
> >  verzichten  wollte,  koennte   ich   direkt   auf   AUTO_INCREMENT
> >  verzichten, das waer auch nicht Sinn der Sache! Die ID  von  einer
> >  Tabelle muss ich uebrigens  in  einer  anderen  Tabelle  eintragen
> >  (als Referenz darauf), und so kann ich auf  diese  Funktion  nicht
> >  verzichten.
> >     Aeh, aber  da  ich  mich  jetzt  an  jeden  Strohhalm  klammere
> >  trotzdem die Frage: Was meinst Du mit Umgehen? Ich sehe jetzt  nur
> >  eine Moeglichkeit: Ich frage die Datenbank selber  nach  den  IDs,
> >  nehme die hoechste Zahl und addiere eins, und  schon  "glaube  ich
> >  zu wissen", was MySQL als naechste ID verwenden wird... bei  Multi
> >  User Systemen ist das aber schon hart an der Grenze, oder  an  was
> >  dachtest Du?
>
> Nun ja, ich hatte auch mal das Problem mit dem Autoincrement (jedoch unter
> Sybase, das spielt aber hier keine Rolle).
> Du könntest hingehen und deine IDs selbst verwalten. Dazu schaltest du
> autoincrement aus und dann:
>
> Du erstellst eine Zusatztabelle die nichts mit den restlichen zu tun hat.
> Nennen wir sie mal "internaldata". In dieser Tabelle
> erstellst du ein Feld "internal_lastid" oder so ähnlich
[...]
> Den inhalt setzt du in eine Variable ($id). Dann machst du ein $id++; und
> schon hast du deine Id
[...]
> diese Id schreibst du anschliessend zurück in
> die Tabelle internaldata. Ausserdem kannst du diese Id in alle Tabellen
> reinschreiben die sich aufeinander beziehen...

    Seit Stunden suche ich in dieser Liste und im  IRC  nach  einer
 Loesung, doch Deine Mail  ist  der  erste  theoretisch  umsetzbare
 Ansatz, auch wenn er mir nicht gefaellt...  aber  ich  kann  nicht
 genug betonen: Es ist eine  funktionierende  Loesung,  und  dafuer
 erstmal riesigen DANK!
    Und dass er mir nicht  gefaellt  wirst  Du  wohl  verstehen  im
 Angesicht von 800 MB Datenbank, ueber 10000  Zeilen  Code  und  70
 mysql_query("Insert ...") - Anweisungen.
    Im Moment, da mir wenigstens zwei Leute bestaetigt haben,  dass
 es mit  mysql_insert_id()  (und  PHP4)  mit  mehreren  Connections
 Probleme gibt,  denke  ich  in  Richtung  Vermeidung  der  zweiten
 Verbindung um jeden Preis.

> Mit autoincrement hatte ich schon mal Probleme dass ich Tests mit Tabelle1
> machte und dann für diese Tabelle der Autoincrement-Wert bei x stand und für
> Tabelle2 auf x-y somit war die Sch...am dampfen...

    (fast?) jede Tabelle ist bei mir mit  einer  ID  versehen,  die
 AUTO_INCREMENT ist, aber ich gehe ja auch nicht  davon  aus,  dass
 die IDs untereinander eindeutig sind, warum sollten sie auch,  sie
 werden auch nur fuer jeweils eine Tabelle  gebraucht.  Interessant
 an Deinem Ansatz ist tatsaechlich, dass es ja nicht schadet,  dass
 alle Tabellen ueberschneidungsfreie IDs haben.

> Mit der obigen Lösung hast du übrigens eine Tabelle in der du alle internen
> Daten schon verwalten kannst, quasi eine ini-datei in der DB.

 :-) So eine Tabelle hab ich schon, auch wenn ich DIE nicht fuer
     Deine Loesung verwenden kann...

Diese Sendung wurde Ihnen praesentiert von Jim
PGP encrypted mails welcome! Key on any keyserver or ftp://users.de
---
 And you wouldn't want to use capabilities over NFS anyway,
 since NFS stands for No File Security. ( Theodore Y Ts'o )



php::bar PHP Wiki   -   Listenarchive