trancemission: ID automatisch mit Nullen auffüllen..

Hi,
ich bastle grad an einer Kundendatenbank mit php und mysql.. funzt bis jetz auch alles einwandfrei, hab bloß das problem des generierens einer Kundennummer.. ich würde gern eine kundennummer im format "00001" haben.. soll sich natürlich für jeden kunden erhöhen.. wenn ich ne normale id spalte nehme, kommen ja für jeden neuen kunden nur kundennummern im format 1, 2 usw..
wie krieg ich es hin, dass mysql den rest der id mit nullen auffüllt, sodass am ende ne 5-stelle kundennummer rauskommt?

Bin für jede hilfe dankbar :)
trancemission

  1. Hallo,

    ich würde die IDs in der Datenbank so lassen wie sie sind und erst in der Anwendung die Kundennummer 5-stellig machen.

    Gruß

    Stareagle

    1. Hmm, stimmt.. is vielleicht besser..
      Und wie mach ich die id in php 5-stellig? hab jetzt auf der stelle keine idee.. gibts dafür ne funktion?
      Kann ja schlecht "$id + 00000" schreiben..

      Danke

      1. yo,

        Hmm, stimmt.. is vielleicht besser..

        nein, das ist eine schlechte idee, die id der tabelle als kundennummer zu nehmen. spendiere der tabelle dafür eine extra spalte und bringe keine fachliche logik in die id der tabelle. der primary key einer tabelle sollte einzig alleine dem zwecke dienen, die datensätze eindeutig zu identifizieren. nicht mehr und nicht weniger.

        Ilja

        1. hi,

          ich glaube so müsstest du die nullen anhängen können (mit php):

          $id = "00000".$id;

          gruß
          sascha

          1. yo,

            $id = "00000".$id;

            ebenfalls keine gute idee. die funktion unter mysql heisst LPAD. aber wie gesagt, spendiere dafür eine eigene spalte und vermische sie nicht mit der id der tabelle.

            Ilja

            1. Moin!

              $id = "00000".$id;

              ebenfalls keine gute idee. die funktion unter mysql heisst LPAD. aber wie gesagt, spendiere dafür eine eigene spalte und vermische sie nicht mit der id der tabelle.

              Weder ist es eine gute Idee, die Nullen mit Stringfunktionen von PHP aufzufüllen, noch ist es eine gute Idee, sie mit Stringfunktionen von MySQL aufzufüllen.

              Die Lösung ist doch so simpel: Der ID- oder meinetwegen auch der separaten Kundennummerspalte gibt man einfach das Attribut "ZEROFILL" - und schon wird diese Spalte mit Nullen auf soviele Stellen aufgefüllt, wie man als Zahlenlänge angegeben hat.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. yo,

                Weder ist es eine gute Idee, die Nullen mit Stringfunktionen von PHP aufzufüllen, noch ist es eine gute Idee, sie mit Stringfunktionen von MySQL aufzufüllen.

                LPAD ist dafür sehr gut geeignet, weil es eine funktion ist, die auch ausserhalb mysql von den meisten dbms unterstützt wird. ich kenne dieses zerofill nicht wirklich, habe aber kurz mysql doku überflogen und wenn ich mich nicht irre, geht das nur bei zahlen-datentypen, das wäre für mich ein k.o kriterium, da ich kundennummer als string deklarieren würde. und wenn die spalte nur für die anzeige bei einer select abfrage aufgefüllt werden....

                Ilja

                1. yo,

                  Weder ist es eine gute Idee, die Nullen mit Stringfunktionen von PHP aufzufüllen, noch ist es eine gute Idee, sie mit Stringfunktionen von MySQL aufzufüllen.

                  LPAD ist dafür sehr gut geeignet, weil es eine funktion ist, die auch ausserhalb mysql von den meisten dbms unterstützt wird.

                  es geht aber um mysql und da sollte man auch das nutzen was zur verfügung steht, da ZEROFILL nunmal im system im vergleich zu LPAD höher angesiedelt und vorallem nur eine einstellung (und zwar innerhalb des DBMS) verlangt halte ich ZEROFILL eindeutig für die bessere variante, ansonsten müssten ja alle abfragen angepasst werden, was die sache nur unnötig kompilierter machen würde..

                  ich kenne dieses zerofill nicht wirklich, habe aber kurz mysql doku überflogen und wenn ich mich nicht irre, geht das nur bei zahlen-datentypen, das wäre für mich ein k.o kriterium, da ich kundennummer als string deklarieren würde.

                  das wäre ja auch wirklich panne wenn das jemand machen würde und das sollte man auch schleunigst ändern, zudem eine ID ja meistens auch inkrementell ist.

                  und wenn die spalte nur für die anzeige bei einer select abfrage aufgefüllt werden....

                  das wäre auch egal, den php wertet nunmal eine 0 auch als 0..

                  :)

                  gruss,
                  robbe

                  1. yo,

                    es geht aber um mysql und da sollte man auch das nutzen was zur verfügung steht.

                    das sehe ich anders, es geht weniger primär um mysql, sondern um die datenhaltung. und oftmals durchlaufen die daten mehrere verschiedene systeme zur haltung und pflege der daten. wenn ich dann die option habe, es "allgemeingültiger" zu lösen, ist das durchaus ein sinnvolles argument. oracle kennt zum beispiel zwei verschiedene notationen einen outer join zu bilden, einen nach ansi (ab 9i) und einen oracle eigenen weg. es gibt eigentlich somit keinen grund mehr, nicht den ansi weg zu nehmen.

                    und vorallem nur eine einstellung (und zwar innerhalb des DBMS) verlangt halte ich ZEROFILL eindeutig für die bessere variante, ansonsten müssten ja alle abfragen angepasst werden, was die sache nur unnötig kompilierter machen würde..

                    kontrollierbarkeit ist ein weiterer wichtiger aspekt. allerdings ist dies nicht nur mit zerofill zu erreichen. trigger lösen das problem ebenfalls und diese kennen auch alle dbms mit einem professionellen anspruch. dazu kenne ich firmen, welche die fachlichkeit nicht in das dbms abgeben, sondern es in einer klasse hinterlegen.

                    dazu kommt noch, dass zerofill nur funktioniert, wenn ich den datentyp so wähle, dass er die richtige länge hat. damit schaffe ich eine abhängigkeit, die ich gar nicht will, zum beiuspiel weil ich den  datentype größer wählen will.

                    aber das ko kriterium für mich ist immer noch, dass ich dann die kundennummer nicht als string verwenden könnte. unter dem strich würde ich weiterhin lpad verwenden, wenn ich es auf datenbank-ebene lösen sollte.

                    Ilja

          2. hi,

            ich glaube so müsstest du die nullen anhängen können (mit php):

            $id = "00000".$id;

            gruß
            sascha

            Hallo, Also ich glaube dass der Weg nicht zur Lösung führt, da wenn die ID 2 stellig ist es auf einmal 6 Ziffern sind.
            Als Denkansatz würde ich sagen, dass du die Ziffer als String betrachtest und per strlen($id) die Größe der Zeichenkette bestimmst. DIes kannst du dein in einer Zählschleife machen z.B:
            For($i=0;$i<5;$i++)
            If(5-$i>strlen($id))
                    {echo "<span>0 </span>";}
                  Else
                    {
                    echo "<span>$id[$temp] </span>";
                    $temp++;
                    }
                  }
            Mfg Maxim