Ankündigung

Einklappen
Keine Ankündigung bisher.

fortlaufende Rechnungsnummer

Einklappen

Neue Werbung 2019

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

  • fortlaufende Rechnungsnummer

    Hi,
    ich habe folgendes Problem:
    ein Kunde kann auf der Seite von unserem Schulorchester Karten bestellen.
    Jede Bestellung soll dabei eine eindeutige ID haben ,die bei jedem bestellvorgang erhöht werden soll. Soweit so gut. Fortlaufende IDs lassen sich bei SQL mit auto_increment leicht lösen. Das Problem ist, dass diese neue ID im gleichen Skript, sobald der Satz in die DB eingetrage ist, nochmal gebraucht wird, um die Besätitungsemail an den Kunden zu versenden.
    Ich könnte jetzt den Datensatz mit der höchsten ID aus der DB auslesen. Das find ich jetzt allerdings nicht sehr elegant, und race-conditions sind dann auch gleich vorprogrammiert.
    Ich hoffe mein Problem ist durch meine Beschreibung klar geworden.

    lg,
    André

  • #2
    Wenn du MySQL verwendest kannst du mysql_insert_id() ( http://de2.php.net/mysql_insert_id ) dafür verwenden.
    [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

    Kommentar


    • #3
      Exakt das habe ich gesucht. Vielen Dank.

      Kommentar


      • #4
        Du bist krass drauf ..

        Kommentar


        • #5
          Zitat von Zergling
          Du bist krass drauf ..
          Wie darf man denn das verstehen?
          [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

          Kommentar


          • #6
            Wie darf man denn das verstehen? :Smile
            Ich nehme mal an, weil Zergling weiß, dass man sich durch mysql_insert_id() erst recht Race Conditions ermöglicht...

            Statt dessen sollte man nach einem Statement mit

            Code:
            SELECT LAST_INSERT_ID()
            die letzte auto_increment-ID abfragen. Steht meines Wissens auch unter http://de2.php.net/mysql_insert_id .
            Viele Grüße,
            Dr.E.

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            1. Think about software design [B]before[/B] you start to write code!
            2. Discuss and review it together with [B]experts[/B]!
            3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
            4. Write [I][B]clean and reusable[/B][/I] software only!
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Kommentar


            • #7
              Soweit es mir bekannt ist kann mysql_insert_id() genauso verwendet werden wenn du den resource_link mit angegeben wird. Dann wird die letzte auto_increment ID die mit dieser Kennung erstellt wird zurückgegeben. Egal was andere Clients machen.

              ABER was ich nicht weiß ist was passiert wenn mysql_pconnect() verwendet wurde. Dann wird nicht per Client eine eigene Verbindung aufgebaut sondern eben zusammen verwendet.

              Allerdings hatte ich bis jetzt noch nie das Problem dass ich irgendwo eine falsche ID bekommen habe mit mysql_insert_id().

              Kommentar


              • #8
                Ich hatte mal ausprobiert, dass sich zwei mysql_insert_id()s möglicherweise das Ergebnis einer anderen Ausgabe einholen.

                PHP-Code:
                <?php
                (mysql_connect(..) and mysql_select_db(..)) or die(..);
                mysql_query('INSERT INTO ..');
                echo 
                'waiting..';
                flush();
                sleep(10);
                echo 
                time(), "\n
                "
                ;
                echo 
                mysql_insert_id();
                ?>
                (als "waiting.." erschien im 2. Browserfenster diese Datei aufgerufen)
                PHP-Code:
                <?php
                (mysql_connect(..) and mysql_select_db(..)) or die(..);
                mysql_query('INSERT INTO ..');
                echo 
                time(), "\n
                "
                ;
                echo 
                mysql_insert_id();
                ?>
                Beide haben jeweils die richtige ID geliefert.

                Nein mit krass meinte ich vielmehr, dass ein Schüler schon Race-Conditions kennt, dazu noch die Schulorchester-Page codet, in der er wahrscheinlich auch noch musiziert. Wieder so ein Wunderkind? Wahrscheinlich rennt er auf 100m auch gleich 11,0.

                Kommentar


                • #9
                  Hallo RaZor,

                  ABER was ich nicht weiß ist was passiert wenn mysql_pconnect() verwendet wurde. Dann wird nicht per Client eine eigene Verbindung aufgebaut sondern eben zusammen verwendet.
                  Ich benutze eine einzige Verbindung während eines Requests und darüber laufen zig Anwendungen, da passiert es ab und an schon mal, dass man Race Conditions hat...
                  Viele Grüße,
                  Dr.E.

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  1. Think about software design [B]before[/B] you start to write code!
                  2. Discuss and review it together with [B]experts[/B]!
                  3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                  4. Write [I][B]clean and reusable[/B][/I] software only!
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  Kommentar


                  • #10
                    Was passiert wenn du kein pconnect verwendest sondern einzelne Verbindungen? Kommt es dann immer noch zu Race Conditions? Das würd mich mal interessieren.

                    @Zergling: krass -> Race Conditions und dazu dann noch nicht wissen dass es mysql_insert_id() gibt das is krass ^^

                    Kommentar


                    • #11
                      Zitat von dr.e.
                      Wie darf man denn das verstehen? :Smile
                      Ich nehme mal an, weil Zergling weiß, dass man sich durch mysql_insert_id() erst recht Race Conditions ermöglicht...

                      Statt dessen sollte man nach einem Statement mit

                      Code:
                      SELECT LAST_INSERT_ID()
                      die letzte auto_increment-ID abfragen. Steht meines Wissens auch unter http://de2.php.net/mysql_insert_id .
                      Konnte da im Manual nichts dazu finden. Das einzige was ich finden konnte war der Fall, dass ein Query fehlschlägt und mysql_insert_id() dann nicht false,0, null liefert sondern eben den Wert des letzten erfolgreichen Queries. Aber das sollte ja kein Problem sein, wenn man Fehler abfängt.

                      Ansonsten verteh ich nicht ganz wo das Problem liegen soll (auch wenn man wie du für einen Request genau eine DB-Verbindung benutzt) bzw. wie LAST_INSERT_ID dieses Problem löst.
                      Vielleicht kann mir ja einer einen Beispielfall konstruieren!?
                      [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

                      Kommentar


                      • #12
                        @Razor: ich benutze kein mysql_pconnect(), sondern eine Singleton-Instanz meiner MySQL-Klasse. Persistente Connections sind über die Laufzeit des Webserverprozesses verfügbar, wenn diese einmal aufgebaut ist. Das ist meines Wissens ähnlich dem JAVA-Connection-Pooling.

                        Wenn ich für jede Abfrage eine eigene Verbindung nutzen würde - was verdammt unperformant ist - hättest du hier kein Problem. Da musst du aber sicherstellen dass du Abfragen mit

                        -> connect
                        -> query
                        -> mysql_insert_id()
                        -> close

                        in genau der Reihenfolge in deiner Applikation einbaust - z.B. in einer DB-Abstraktions-Schicht.
                        Viele Grüße,
                        Dr.E.

                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        1. Think about software design [B]before[/B] you start to write code!
                        2. Discuss and review it together with [B]experts[/B]!
                        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                        4. Write [I][B]clean and reusable[/B][/I] software only!
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        Kommentar


                        • #13
                          Welchen Vorteil LAST_INSERT_ID() gegenüber mysql_insert_id() haben soll, habe ich immer noch nicht verstanden. Race conditions erzeugen oder verhindert tut man mit LAST_INSERT_ID jedenfalls schonmal nicht. Wenn man zwei INSERT Stamtents abschickt, bekommt man sowohl mit LAST_INSERT_ID als auch mit mysql_insert_id jeweils die id der letzten Operation zurück.

                          Kommentar


                          • #14
                            Hallo Schnulli,

                            du behauptest hier Dinge, die nicht stimmen. Unter http://de3.php.net/manual/en/functio...-insert-id.php steht sogar eine Note dazu. Wenn du eine komplexe Struktur von Modulen hast, die warum auch immer beim Ausführen einen INSERT haben und anschließend die LAST_INSERT_ID weiterverwenden wollen, kann es sehr wohl zu Race Conditions kommen. Das ist sogar einer der beliebtesten Fälle.

                            Wenn du jedoch wie in meinem letzten Post beschrieben das Query absenden abstrahierst und direkt nach jeder Query die LAST_INSERT_ID per mysql_insert_id() abfragst wird das sicher nicht problematisch.
                            Viele Grüße,
                            Dr.E.

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            1. Think about software design [B]before[/B] you start to write code!
                            2. Discuss and review it together with [B]experts[/B]!
                            3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                            4. Write [I][B]clean and reusable[/B][/I] software only!
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                            Kommentar


                            • #15
                              Hallo dr.e.
                              Weder bei http://de3.php.net/manual/en/functio...-insert-id.php noch bei http://de3.php.net/manual/de/functio...-insert-id.php werden race conditions beschrieben. Der Sinn wird klarer, wenn man die Aussagen mit http://dev.mysql.com/doc/refman/4.1/...insert-id.html vergleicht. Gerade bei größeren, komplexeren Systemen ist das Verhalten von mysql_insert_id vorzuziehen.

                              Kommentar

                              Lädt...
                              X