Ankündigung

Einklappen
Keine Ankündigung bisher.

mysql_insert_id() |*beste methode

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysql_insert_id() |*beste methode

    hallo

    ich bin auf folgendes problem gestossen, und unsicher welche lösung am besten/sichersten/effizientesten ist:

    - ich füge daten in eine tabelle (INSERT)
    - um die neu eingefügten daten richtig zu "verlinken" brauche ich deren id
    - diese schreibe ich dann in eine andere tabelle

    --> wenn ich die ID mit mysql_insert_id() abfrage (direkt nach dem INSERT), wie kann ich sicher sein, dass in der Zwischenzeit keine anderen INSERTS stattgefunden haben, welche dann das resultat (die letzte autoincrement id) verfälschen würden.
    ist diese befürchtung realistisch?
    wie würded ihr das ganze realisieren damit es effizient und sicher ist?

    danke für eure hilfe!

    andy


  • #2
    Als PHP-Fortgeschrittener würde ich mir jetzt direkt das PHP-Manual zu Hand nehmen und einfach mal unter mysql_insert_id() nachsehen.

    [edit]mysql_insert_id() nicht mysql_insertId()[/edit]

    Kommentar


    • #3
      Hi.

      mysql_insert_id() bezieht sich immer auf den letzten Insert im Verlauf des aktuellen Scripts, nicht auf die Datenbank insgesamt.

      Du erhältst also mit mysql_insert_id() immer die richtige ID zurück.

      Bin übrigens nicht der Meinung, dass das hier eine Fortgeschrittenen-Frage sein soll

      Mit ein bisschen nachdenken hättest Du selbst drauf kommen können, dass Deine Frage Quatsch ist:
      Woher sollte mysql_insert_id() denn wissen, aus welcher Tabelle Du die insert_id haben willst, wenn es sich nicht auf den letzten eigenen INSERT bezieht?

      Gruß, Timo.

      Kommentar


      • #4
        danke für die antworten.
        mag sein, dass die frage nicht hier hin gehört, sorry, mein fehler.

        doch dass die frage quatsch ist, sehe ich nicht so.
        zu mindest findet man auf php.net viele beiträge anderer user,
        die sich mit diesem thema beschäftigt hatten:

        An effective way to retrieve the last insert id without fail or having two queries inserted at the same time causing an unexpected number being returned.

        <?
        mysql_query("LOCK TABLES apc_forms WRITE");
        mysql_query("SET AUTOCOMMIT = 0");
        mysql_query("INSERT INTO apc_forms (form_title, form_event_id, form_expirey) VALUES ('title',1,'2005-10-10')");
        define('ID',mysql_query("SELECT LAST_INSERT_ID()"));
        mysql_query("COMMIT");
        mysql_query("UNLOCK TABLES");
        ?>

        http://ch2.php.net/mysql_insert_id

        ein weiteres problem ist, dass die php funktion mysql_insert_id() nur die letzte id eines funktionierenden inserts zurückgibt (und solange null ist, bis einer stattfindet)

        Kommentar


        • #5
          Also, nehmen wir dein Szenario.

          2 User rufen gleichzeitig dein Script auf.
          Bei User 1 entsteht durch was auch immer ein Fehler, bei User 2 nicht

          Da sich aber mysql_insert_id() auf das letzte Insert innerhalb der aktiven Session bezieht, bleibt User 2 vom Fehler von User 1 verschont.



          2 User rufen gleichzeitig dein Script auf
          User 1 -> insert (ai = 3)
          User 2 -> insert (ai = 4)
          User 1 -> mysql_insert_id() => rückgabe 3
          User 2 -> mysql_insert_id() => rückgabe 4

          User 1 steht mit der Session von User 2 nicht in Verbindung, genauso ander herum.

          Du musst nur innherlab deiner Routine gewährleisten, dass die id direkt nach dem Insert abgefragt wird.

          mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat.
          Kann nur passieren, wenn du kein AI-Feld hast oder du einen möglichen Fehler beim Insert nicht abfängst.

          Kommentar


          • #6
            Zitat von mr.delete
            An effective way to retrieve the last insert id without fail or having two queries inserted at the same time causing an unexpected number being returned.
            Der Kerl litt scheinbar an den gleichen Halluzinationen wie Du.

            Bei mysql_insert_id() muss man lediglich gewährleisten, dass das dazugehörige Insert auf der gleichen Verbindung das vorherige war, und dass es erfolgreich war (was ja zurückgeliefert wird).
            Und da PHP kein connection-pooling hat, muss man sich auch keine Sorgen machen, dass auf der Verbindung ein anderes Insert dazwischenfunkt.
            mod = master of disaster

            Kommentar


            • #7
              Zitat von Waq
              Der Kerl litt scheinbar an den gleichen Halluzinationen wie Du.
              Nicht ganz richtig.

              Der Kerl oben benutzt ja gar nicht mysql_insert_id(), sondern verwendet den SQL-Befehl "SELECT LAST_INSERT_ID()". Da ist es in der Tat so, dass die letzte ID zurückgegeben wird. Wenn zwischenzeitlich jemand dazwischengefunkt hat, wird halt dessen ID zurückgegeben.

              Mit dem PHP-Befehl mysql_insert_id() passiert dies jedenfalls nicht und wer genau hinschaut, hätte das erkennen können Daher beharre ich immer noch auf der meinung, dass Deine ursprüngliche Frage Quatsch war, mr.delete.

              Kommentar


              • #8
                Zitat von Tentacle
                verwendet den SQL-Befehl "SELECT LAST_INSERT_ID()". Da ist es in der Tat so
                Auch da braucht man Halluzinationen.
                http://dev.mysql.com/doc/mysql/en/ge...unique-id.html

                For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client.
                mod = master of disaster

                Kommentar


                • #9
                  Mea Culpa

                  Kommentar

                  Lädt...
                  X