# Alpha-numerischer code erzeugen



## Marco-P (16. Juni 2008)

Hallo Leute,

ich will da so ein kleines Spiel basteln.
Und zwar kennt doch jeder diese Code aktion von CokaCola. da steht ein code im Deckel wenn man denn irgendwo eingibt dann bekommt man was geschenkt.

Ich denke mal man erzeigt eine Datenbank erstellt dort eine Tabelle mit denn Codes und hinterlegt was wer bekommt. bzw kann dann halt denn eingegebeen Code mit dem in der Tabelle abgleichen und wenn er existiert dann wird man weitergeleitet.

Aber wie zum teufel generiere ih soleh codes, dahte da an einen 10 stelligen code.

Der code darf sich halt niht wiederholen. Und sollte nicht gerade 
1
2
3
4
5
6
.
.
.
1000
1001
1002
usw


sein, das wäre ja zu einfach.

MFG Marco


----------



## Loomis (16. Juni 2008)

Einfaches Code erstellen.

```
$laenge = 10; // zehnstelliger Code

    $code = ''; // Code Variable
    
    $zeichen = range(0,9); // Array mit den Ziffern 0-9

    shuffle( $zeichen ); // Array mischen
    
    for( $i = 0; $i < $laenge; $i++ ) // Schleife 10mal durchlaufen
    {
        
        $code .= $zeichen[$i]; // Codevariable füllen.
        
    }
```
Das Datenbankfeld für den Code stellst du auf Unique. Wenn du einen Code einfügen willst, der schon in der Datenbank steht, wird ein Fehler ausgegeben.
Also musst du in der Schleife, in der du die Codes in die Datenbank schreibst prüfen, ob es einen Fehler gab (mysql_errno z.B.). Gibt es einen fehler -> neuen Code versuchen, ansonsten -> Code in Datenbank schreiben.


----------



## Marco-P (16. Juni 2008)

Danke das versuche ich gleich mal


----------



## WebRabbit (16. Juni 2008)

Hi.
Also ich würde das in etwa so machen..

```
for($i=0; $i<=10; $i++){
   $zahl = rand(0,10);
   echo $zahl;
   $code = $code.$zahl;
   }
   
   
$sql = "SELECT code FROM db WHERE code='$code'";
$anz = mysql_numrows($res);
if(mysql_query($sql)){
  for($i=0; $i<=10; $i++){
     $zahl = rand(0,10);
     echo $zahl;
     $code = $code.$zahl;
     }
  }
  else{
      echo $code;
      }
```

Also erst den Code generieren, dann mit den vorhandenen in der Datenbank abgleichen, und wenn es keinen gleichen Eintrag gibt, gibst Du den Code aus, bzw. schreibst Ihn mit Benutzerangaben etc. in die DB.

Gruß Webrabbit


----------



## Marco-P (16. Juni 2008)

Also da kommt das raus

4
47
476
4765
47653
476532
4765328
47653280
476532809
4765328091

aber ich will ganz viele 10 stellige codes.
das ist ja nicht ganz so das richtige.


----------



## Loomis (16. Juni 2008)

WebRabbit hat gesagt.:


> Hi.
> Also ich würde das in etwa so machen..
> 
> ```
> ...


Wenn man tausende Codes erstellt ist das aber sehr langsam.
Und schau dir mal die Funktionsweise von rand() an.

@Threatersteller, mein Schnipsel gibt immer einen 10stelligen Code aus, ich hab das gerade getestet.


----------



## Marco-P (16. Juni 2008)

das ist jetzt meine lösung

```
$laenge = 10; // zehnstelliger Code
	$menge = 10;
    $code = ''; // Code Variable
    
    $zeichen = range(0,9); // Array mit den Ziffern 0-9

    
    for( $k = 0; $k < $menge; $k++)
	{
    for( $i = 0; $i < $laenge; $i++ ) // Schleife 10mal durchlaufen
    {
        shuffle( $zeichen ); // Array mischen
        $code .= $zeichen[$i]; // Codevariable füllen.
        
    }  
	echo $code;
	echo "<br>";
	$code = "";
	}
```

danke nochmal.


----------



## WebRabbit (16. Juni 2008)

Naja ich sagte ja in etwa.. 
das bei Dir eine ganze Reihe zahlen rauskommen liegt daran, dass in der for-Schleife noch "echo $zahl" drin steht...
Du musst nur $code ausgeben. Wo ich Loomes recht gebe, ist mit der Datenbank und dem Unique schlüssel. Das geht schneller.


----------



## Loomis (16. Juni 2008)

Mit rand(0,10) bekommst du nicht immer 10 Ziffern zurück. Sondern auch mal 11, 12, 13...
Richtig wäre rand(0,9).


----------



## Gumbo (16. Juni 2008)

Ein Array zu mischen um dann ein fixes Element auszuwählen ist aber kostenintensiver als ein zufälliges auszuwählen.


----------



## Marco-P (16. Juni 2008)

Also GUMBO, 

nicht nur ein Satz, zeig wie es geht.


----------



## Loomis (16. Juni 2008)

Ich habe auch nicht behauptet dass mein Code der beste ist den es gibt.
So geht es natürlich auch:

```
$laenge = 10; // zehnstelliger Code

    $code = ''; // Code Variable

    for( $i = 0; $i < $laenge; $i++ ) // Schleife 10mal durchlaufen
    {

        $code .= rand(0,9); // Codevariable füllen.

    }
```


----------



## WebRabbit (16. Juni 2008)

Loomes hat gesagt.:


> Mit rand(0,10) bekommst du nicht immer 10 Ziffern zurück. Sondern auch mal 11, 12, 13...
> Richtig wäre rand(0,9).



Mein Ansatz war mehr als Denkanstoß gedacht. Hatte die Frage, eher so verstanden, dass er einen Weg sucht an die Sache ranzugehen. Aber Du hast natürlich recht, es muss 0-9 lauten.

Hatte kein Anspruch auf makellosen Code erhoben  aber werde mich in Zukunft bemühen, präziser zu sein. 


Gruß Webrabbit



Marco-P hat gesagt.:


> Also GUMBO,
> 
> nicht nur ein Satz, zeig wie es geht.



Für jemand der schon zwei Lösungsansätze erhalten hat finde ich das nicht unbedingt die feine englische. Man muss sich auch schon selber mal ein paar Gedanken machen, dann verstehst Du vielleicht auch was Gumbo meint...


----------



## Gumbo (16. Juni 2008)

Marco-P hat gesagt.:


> Also GUMBO,
> 
> nicht nur ein Satz, zeig wie es geht.


Hier fertige Implementierungen zu fordern, ist eigentlich etwas dreist. Immerhin hast du ja bereits einige sinnvolle Ansätze bekommen, die zwar verbesserungswürdig sind, aber dennoch korrekt sind. Und mein Hinweis, dass das Mischen des gesamten Arrays kostenintensiver ist als ein zufälliges Element daraus auszuwählen, war nur ein Verbesserungsvorschlag.

Du willst etwas Fertiges? Bitte: [post=1425344]Zufallsgenerator[/post].


----------

