Anus_increment

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

  • Anus_increment

    Hallo,
    ich hätt da n Problem …..

    Ich habe ein Formular zum erstellen eines „Projekts“ wo man Projektdaten eingibt und Projektbilder upgeloadet werden sollen. Das soll in ne MySql Datenbank eingetragen werden mit insert into …
    Das Problem ist, ich will das der Ordner (der automatisch erstellt wird für jedes Projekt) die ID des Datensatzes bekommen soll. Auch die Bildernamen sollen die ProjektID enthalten.
    Dazu brauche ich aber den nächsten AUTO_INCREMENT Wert für die Tabelle, weil mein Datensatz erst in die Datenbank am Ende eingetragen (beim Anklicken des Submitbuttons) wird, also zum jetzigen Zeitpunkt noch nicht existiert.

    Ich brauche eine Funktion die mir den nächsten auto_increment RESERVIERT und zurückgibt und den auto_increment danach erhöht.

    Einige von euch werden bestimmt an LAST_INSERT_ID() bzw. mysql_insert_id() denken aber das hilft mir nicht denn dafür muss ich vorher ein insert oder update statement abgesetzt haben.
    Ich könnte zwar vorher ein „dummyinsert“ machen aber wenn der user die Eingabe nicht abschliesst (ich gehe hier vom dümmsten anzunehmenden user aus), hab ich sehr viele leere Datensätze in der DB. Das kann ja wohl net der Sinn der Sache sein.

    Mit „SHOW TABLE STATUS LIKE 'Projekte';“ bekomme ich zwar den nächsten auto_increment Wert und ich könnte mit „alter table … “ den auto_increment verändern aber genauso gut kann ich auch Harakiri begehen.
    Das nützt mir nix, weil sich der Wert zwischenzeitlich ändern kann.

    Z.B. Opa Olaf will sein Projekt eintragen und füllt die Felder gaaaanz langsam aus, inzwischen will auch der Junge Johannes sein Projekt von seinem PC eintragen füllt die Felder aus und ist vor Opa fertig, schickt es ab und danach hat der Opa gelitten weil er den alten auto_increment Wert hat und beim abschicken kriegt er die Fehlermeldung dass ein Datensatz mit der ID schon vorhanden ist. Und das ist nur das kleinste Übel von vielen.

    Also ich kann zusammengefasst nix anfangen mit:
    - mysql_insert_id() bzw. LAST_INSERT_ID()
    - SHOW TABLE STATUS LIKE 'Projekte' und Alter TABLE Projekte auto_increment = $irgendwas;
    - Tabelle zwischenzeitlich zu sperren kommt auch nicht in Frage ... bis Opa fertig ist sind 100 user genervt

    Ihr habt bestimmt auch schon das Problem gehabt. Ich denke es gibt da bestimmt eine elegantere Lösung nur fällt die mir nicht ein.



    Ich bedanke mich schon mal in Voraus !

  • #2
    Kommen alle Daten aus ein und demselben Formular, das auch genau einmal abgeschickt wird?

    Wenn ja, kannst du ja alle Daten pürüfen und im Erfolgsfall den Eintrag in die DB machenund danach die Ordner und Dateien anlegen.

    Wenn nein, überleg dir mal, ob du nicht vielleicht eventuell hochgeladene Dateien in ein dem benutzer zuordenbares Verzeichnis schreiben willst. Dort hättest du dann alle Dateien und musst sie nur noch verschieben. Als Suchbegriffe seien dir mal session_start und session_id ans herz gelegt.
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Wenn ja, kannst du ja alle Daten pürüfen und im Erfolgsfall den Eintrag in die DB machenund danach die Ordner und Dateien anlegen.
      Das heisst also erstma alle Felder ausfüllen und in die DB machen, danach dann Projekt "bearbeiten" und die Bilder hinzufügen.
      Die Idee hatte ich zwar auch, aber der User wird wohl damit überfordert sein, er will ja seine Bilder zum Projekt bei der Erstellung uploaden. So muss er erstma Projekt anlegen und dann noch extra bearbeiten um die Bilder upzuloaden.

      Hm, das Projekt über mehrere Formulare, in verschiedenen Schritten zu erstellen wäre auch ne Möglichkeit muss leider dann mein komplettes Design ändern.

      Wenn nein, überleg dir mal, ob du nicht vielleicht eventuell hochgeladene Dateien in ein dem benutzer zuordenbares Verzeichnis schreiben willst. Dort hättest du dann alle Dateien und musst sie nur noch verschieben.
      Selbst wenn ich das in dem Ordner für den User reinschiebe, will ich jeweils einen eindeutigen Ordner für das Projekt indem die Projektbilder sind. Das gleiche Problem wie vorher nur halt im Ordner des Users.


      Als Suchbegriffe seien dir mal session_start und session_id ans herz gelegt.
      LOL ich glaub Sessions werden wohl das Problem nicht lösen zumal ich Sessions schon benutze.
      Zuletzt geändert von PHPhans; 15.08.2006, 17:16.

      Kommentar


      • #4
        Was soll denn der besch...eidene Thread-Titel?

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Original geschrieben von ghostgambler
          Was soll denn der besch...eidene Thread-Titel?
          bin bloss verbittert dass ich mit mysql und nicht mit oracle arbeite dort gibt es schon einiges an Möglichkeiten.
          Bin dafür dass man es ab jetz so nennt

          Kommentar


          • #6
            Auch ne Lösung die ich eben gefunden habe:

            Let's say you have a table CUSTOMERS with a unique CUST_ID which is an auto_increment integer.
            Change this to be a unique integer (no auto_increment) and create a second helper table CUSTOMER_IDS.
            This second table has only the purpose to deliver a new unique number. In order for this to work, you'll always have to use this helper table whenever a row is inserted into your main table CUSTOMERS.
            When you want to find out what the next number will be, you can use LAST_INSERT_ID() on that helper table. For more details read the documentation on this function.

            Kommentar


            • #7
              Original geschrieben von PHPhans
              Selbst wenn ich das in dem Ordner für den User reinschiebe, will ich jeweils einen eindeutigen Ordner für das Projekt indem die Projektbilder sind. Das gleiche Problem wie vorher nur halt im Ordner des Users.



              LOL ich glaub Sessions werden wohl das Problem nicht lösen zumal ich Sessions schon benutze.
              Naja...

              Du kannst in der Session Daten zu einem Projekt speichern, dazu gehört ja wohl auch der Name eines Ordners im Dateisystem.
              Wenn du dir diesen Namen automatisch eindeutig generieren lässt, hast du doch keine Probleme mehr.

              Bevor ich dir dazu jetzt eine Funktion empfehle und du dann wieder anfängst zu lachen, lasse ich es einfach bleiben. Spaß haben können wir schließlich woanders
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Hey hey nicht gleich beleidigt sein, bin Dir für Deine Hilfe dankbar.
                Ihr seid wohl etwas empfindlich hier, wusste net dass es verboten ist zu "Lachen".
                Aber ich muss Dir zustimmen beim Coden hat man nach ner Weile kein Spass mehr, man wills nur noch irgendwie fertig bekommen.

                Tschöö !

                Kommentar


                • #9
                  hmm das die Bildernamen abhängig von der ID sind macht absolut sinn, aber stellt doch nicht wirklich ein problem dar?

                  Beim FILE_upload steht das Bild doch erstmal nur als $_FILES['bild']['tmp_name'] zur Verfügung.

                  Kannst also ruihg erst mal DB-Eintrag schreiben, und anschließend mit move_uploaded_file($_FILES['bild']['tmp_name'], mysql_insert_id() ); arbeiten...

                  Das jeder Kunde einen eigenen Ordner bekommt macht zwar nicht unbedingt Sinn, (zumindest keinen auf anhieb nachvollziehbaren) aber da schließ ich mich meinen Vorrednern an... Erstelle einen temporären Ordner den du nach der z.b. SESSION_ID benennst (damit er eindeutig ist) , und ihn dann ganz zum schluss, wenn du alles hast wieder mit mysql_insert_id() umbenennst.

                  PS: PHPhans, jeder hilft hier freiwillig, also einfach mal bischen vom Gas runter und mal selber an einer Problemlösung arbeiten und Tips annehmen, und nicht gleich verbittert sein, wenn man keinen komplett fertig codeschnippsel bekommt.

                  lg, dani

                  Kommentar


                  • #10
                    Hab noch was cooles gefunden:

                    Ich denk es funktioniert nur mit InnoDB, aber glücklicherweise nutze ich schon InnoDB.

                    START TRANSACTION; //Leitet die Transaktion ein

                    Insert into ......

                    COMMIT; // Der insert wird abgeschlossen wenn ein commit abgegeben wurde.



                    Ok das sind schon einige Lösungen dabei, aaaaaber beim Anlegen des Projekts wird auch der Ordner erstellt und falls
                    der User das Anlegen des Projekts nicht abschliesst, entstehen nach ner Weile jedemenge Ordner die zu keinem Projekt gehören. Ich werd wahnsinnig
                    Ok müsst dann ne Funktion schrieben die alle Ordnernamen = IDs in der DB sucht, falls keins da ist wird der Ordner gelöscht.

                    Irgendwie ist mir das alles zu blöd ich glaub das ganze Konzept stimmt nicht, also scheint mir nicht richtig zu sein.

                    Original geschrieben von PHPhans
                    PS: PHPhans, jeder hilft hier freiwillig, also einfach mal bischen vom Gas runter und mal selber an einer Problemlösung arbeiten und Tips annehmen, und nicht gleich verbittert sein, wenn man keinen komplett fertig codeschnippsel bekommt.
                    Hehe habs gar net so gemeint wie es rübergekommen ist. Manchmal wird das was man schreibt anders intepretiert als man es gemeint hat. Das ist wohl der Nachteil beim Schreiben.

                    Ich möchte mich ganz herzlich bei euch allen bedanken !
                    Zuletzt geändert von PHPhans; 16.08.2006, 14:10.

                    Kommentar


                    • #11
                      falls der User das Anlegen des Projekts nicht abschliesst, entstehen nach ner Weile jedemenge Ordner die zu
                      quatsch, tmp ordner wird erst angelegt wenn deine "transaktion" abgeschlossen ist. Dein Problem war ja nur, das umbenennen der Ordner ganz zum schluss.

                      Irgendwie ist mir das alles zu blöd ich glaub das ganze Konzept stimmt nicht, also scheint mir nicht richtig zu sein.
                      da könntest recht haben, du solltest die zugehörigkeit bestimmter daten nicht anhand der Ordnerstruktur abhängig machen.

                      lg, dani

                      Kommentar


                      • #12
                        Original geschrieben von Daniela
                        quatsch, tmp ordner wird erst angelegt wenn deine "transaktion" abgeschlossen ist. Dein Problem war ja nur, das umbenennen der Ordner ganz zum schluss.
                        Ne eigentlich brauche ich den Projektordner beim Aufruf des Skriptes denn ich will vom Skript aus die Daten hochladen in den Ordner. Ob temp oder nicht, falls der User vorher abbricht entstehen dadurch Ordner zu denen kein Projekt in der DB existiert.

                        Ich kann nicht erst nachher den Ordner erstellen weil ich jetz in diesem Moment meine Daten hochlade.

                        Das Transaktionsmanagement bezieht sich nur auf die mysql Datenbank nicht auf den PHP Code, das ist rein SQL.

                        Kommentar


                        • #13
                          wieso um himmels willen willst du einen Ordner anlegen BEVOR jemand auf "User anlegen" klickt ??? Überleg nochmal ganz genau was du da sagst ^^

                          ...du dann wieder anfängst zu lachen, lasse ich es einfach bleiben
                          sry aber 100% /agree

                          Kommentar


                          • #14
                            Original geschrieben von Daniela
                            wieso um himmels willen willst du einen Ordner anlegen BEVOR jemand auf "User anlegen" klickt ??? Überleg nochmal ganz genau was du da sagst ^^
                            Den User gibts schon! Bevor der Projekt erstellen kann muss er eingeloggt sein.
                            Ach vergiss es hab schon so gelöst wie ich es haben will.

                            Kommentar

                            Lädt...
                            X