gerry: Eindeutige Nummer vergeben

Hallo Leute,
Ich habe folgendes Problem:
Mittels Formular soll der User die Möglichkeit einer Fehlerbeschreibung für ein Programm erhalten. Damit diese Formulare eindeutig zugewiesen werden können, soll eine eindeutige Nummer vergeben werden und zwar schon beim Aufruf des Formulares. Hab das mit PHP und der id eines tables versucht, nur das ergibt nicht das Ergebnis, welches ich brauche. Könnt mir vorstellen das ganze mit Javascript zu realisieren, nur weiß ich nicht wie. Danke für Eure Hilfe im vorhinein.

Gerry

  1. Moin Moin !

    Laß das die Datenbank machen. Stichworte zur Suche:

    MS-SQL: Datentyp "int identity"
    Oracle: Sequence und evtl. ein Trigger
    PostgreSQL: Datentyp "serial"

    Auf dem Client kannst Du die Nummer ohnehin nicht erzeugen, denn Du kannst gar nicht wissen, wer alles gleichzeitig sich eine Nummer ausdenkt. Und auf dem Server müßtest Du all das nachprogrammieren und für parallele Zugriffe absichern, was in der Datenbank schon vorhanden ist.

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    Mein "Lieblings-Forums-Bug": http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
  2. Hallo Gerry,

    waerst Du auch an einer Loesung PHP/MySQL intersssiert?

    Dieter

    1. Ja, klar. Wär sogar optimal.

      Danke
      Gerry

      1. HI Gerry,

        die folgenden Beispiele sind Teile meiner eigenen Scripte, die du halt anpassen musst:

        • die Tabelle

        DROP TABLE IF EXISTS objekte;
        CREATE TABLE objekte (
          id smallint(3) unsigned zerofill NOT NULL auto_increment,
          user varchar(100) default NULL,
          PRIMARY KEY  (id)
        ) TYPE=MyISAM;

        erstellt eine Tabelle mit id und user
        id ist auto_increment, zaehlt also selbst hoch

        In PHP machst du jedesmal, wenn die Seite geoeffnet wird eine Abfrage:

        • die Abfrage

        $sql = "SELECT max(id) FROM objekte"; // sucht die groesste ID
        $result = mysql_query($sql)or die($db_error);
        $data = mysql_fetch_row($result);
        $data[0]?$id = $data[0]+1:$id=1; // addiert 1 dazu, wenn die Tabelle noch ganz frisch ist, wird ID 1 angelegt.

        Das wars schon im Prinzip - melde Dich mit Fragen, wenn das zu kurz und buendig ist

        Dieter

        1. Hi Dieter,
          So ungefähr hab ich das schon gehabt. Funktioniert auch. Was aber, wenn mehr als ein User gleichzeitig das Formular aufmachen. Wenn jetzt noch kein Eintrag in der db ist, wird doch für jeden dieser user 1 vergeben, oder irre ich mich da? Dann hätt ich doch mehr als einmal die 1 vergeben.

          Gerry

          1. Hi Gerry,

            Das ist wohl wahr, ich hab das nicht bedacht, weil meine Anwendung nur von einem Benutzer benutzt (gutes Deutsch, wa?) wird, die ID hat bei mir einen anderen Zweck.
            Wie waere es, die SessionID oder die IP mit ins Spiel zu bringen? Ich hab dazu auf die Schnelle keinen Vorschlag, denke aber, das sollte machbar sein.

            Dieter

          2. Moin!

            Hi Dieter,
            So ungefähr hab ich das schon gehabt. Funktioniert auch. Was aber, wenn mehr als ein User gleichzeitig das Formular aufmachen. Wenn jetzt noch kein Eintrag in der db ist, wird doch für jeden dieser user 1 vergeben, oder irre ich mich da? Dann hätt ich doch mehr als einmal die 1 vergeben.

            Lege bereits beim Aufruf des Formulars einen neuen Datensatz an. Dann kannst du diese ID verwenden und sie ins Formular hineinschreiben.

            Das Problem ist allerdings, dass du beachten mußt, dass der Client diese ID verändern kann. Wenn du die ID 23 neu angelegt hast und ins Formular schreibst, der Benutzer sie aber verändert in 22, dann würdest du ohne weitere Prüfung den alten Datensatz überschreiben. Du müßtest also irgendeinen sicheren Mechanismus erfinden, der die herausgegebene ID auf jeden Fall wiedererkennt, damit du im neu angelegten Datensatz die eingegebenen Daten speichern kannst.

            Aber was ist dann, wenn das Formular niemals abgeschickt wird? Dann belegst du immer neue Datensätze, die niemals verwendet werden. Das ist auch nicht gut.

            Deshalb ist es die beste Lösung, einen Datensatz wirklich erst dann anzulegen, wenn die Daten dafür dir bekannt sind. Und dann kannst du die dadurch entstandene ID abfragen (mysql_insert_id() macht das direkt nach dem INSERT) und bekanntgeben. Alles andere ist aufwendig, fehleranfällig und blödsinnig.

            - Sven Rautenberg

            --
            "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
          3. Moin Moin !

            So ungefähr hab ich das schon gehabt. Funktioniert auch. Was aber, wenn mehr als ein User gleichzeitig das Formular aufmachen. Wenn jetzt noch kein Eintrag in der db ist, wird doch für jeden dieser user 1 vergeben, oder irre ich mich da? Dann hätt ich doch mehr als einmal die 1 vergeben.

            Genau das ist das Problem an dem Code. Er ist nicht sicher gegen parallele Zugriffe. Die Tabelle an sich ist aber schon ok.

            Du mußt ein INSERT machen (mit Dummy-Daten), das bekommt (garantiert durch die DB) eine eindeutige ID, auch wenn 10 Millionen Leute gleichzeitig den INSERT machen. Die bekommst Du nach dem INSERT irgendwie (ohne SELECT, einfach über die Datenbank-API von PHP) wieder raus. Und dann kommt nur noch das übliche "wie editiere ich eine Datenbank-Zeile per Web-Frontend".

            Alexander

            --
            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
            Mein "Lieblings-Forums-Bug": http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
            1. Hi Leute,
              werd das mal mit den Dummy-daten versuchen.
              Danke vorerst für Eure Hilfe

              Gerry