Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Generator unikalnych ciągów.
Forum PHP.pl > Forum > Przedszkole
Mareczko
Witam
Może mi ktoś pomóc w napisaniu generatora X unikalnych ciągów o długości Y znaków ? Proszę o jakieś wskazówki.

Pozdrawiam
Adi32
  1. function generuj()
  2. {
  3.  
  4. $ciag = md5(time());
  5. $db->query("SELECT * FROM ciagi WHERE ciag='$ciag'");
  6. if (!$db->res()) {
  7. $db->query("INSERT INTO ciagi SET ciag='$ciag'");
  8. return $ciag;
  9. } else {
  10. generuj();
  11. }
  12.  
  13. }
Mareczko
@up. Dzięki za kod ale w moim przypadku nie działam na bazie. Ja te kody chce tylko wyświetlić na ekranie.
Adi32
Cytat(Mareczko @ 2.07.2011, 14:02:50 ) *
@up. Dzięki za kod ale w moim przypadku nie działam na bazie. Ja te kody chce tylko wyświetlić na ekranie.


Jeżeli mają być unikalne to musisz je gdzieś zapisywać.

  1.  
  2. function generuj()
  3. {
  4.  
  5. $plik = 'ciagi.txt';
  6.  
  7. $ciag = md5(time());
  8.  
  9. $f = fopen($plik, "r"))
  10. $dane = fread($f, filesize($plik));
  11. fclose($plik);
  12.  
  13. $f_ciagi = explode(' ',$dane);
  14.  
  15. if(!in_array($ciag,$f_ciagi)) {
  16.  
  17. $fp = fopen($plik, "a");
  18. flock($fp, 2);
  19. fwrite($fp, $ciag.' ');
  20. flock($fp, 3);
  21. fclose($fp);
  22.  
  23. return $ciag;
  24. } else {
  25. generuj();
  26. }
  27.  
  28. }
Mareczko
Aha rozumie. A nie może być to tablica ?
Adi32
Może, ale nawet sesyjna trwa tylko do końca sesji...

O co Ci dokładnie chodzi?
Mareczko
Ogólnie chcę zrobić generator kodów takich jak np. w DotPay. Opalam plik, generuje, kopiuje sobie je od razu i tyle. Więcej mi nie potrzeba, jedynie tyle żeby te kody się nie powtarzały.
Adi32
Cytat(Mareczko @ 2.07.2011, 14:17:11 ) *
Ogólnie chcę zrobić generator kodów takich jak np. w DotPay. Opalam plik, generuje, kopiuje sobie je od razu i tyle. Więcej mi nie potrzeba, jedynie tyle żeby te kody się nie powtarzały.


No to tłumacze, że aby się nie powtarzały muszą się gdzieś zapisywać.

Czy w grę wchodzi taka opcja, że dzisiaj generujesz sobie kod, i jutro też będziesz chciał wygenerować inny kod z 100% pewnością, że się nie powtórzą? To tablice zwykłe i $_SESSION się nie nadają.
Mareczko
Nie, potrzebuje jedynie żeby w danej chwili się nie powtarzały.
Adi32
  1.  
  2. function generuj()
  3. {
  4.  
  5. $ciag = md5(time());
  6. if (!in_array($ciag,$_SESSION)) {
  7. $_SESSION[] = $ciag;
  8. return $ciag;
  9. } else {
  10. generuj();
  11. }
  12.  
  13. }
Mareczko
Coś nie tak:
Warning: in_array() [function.in-array]: Wrong datatype for second argument
Adi32
Cytat(Mareczko @ 2.07.2011, 14:34:40 ) *
Coś nie tak:
Warning: in_array() [function.in-array]: Wrong datatype for second argument


Wszystko tak.
Jak używa się sesji to trzeba gdzieś na początku strony dodać:

pyro
  1. function random_tokens($count, $length) // ilość, długośc każdego
  2. {
  3. $tokens = array();
  4. $i = 1;
  5.  
  6. while($i <= $count)
  7. {
  8. if(!in_array($token = substr(sha1(microtime()),0,$length), $tokens))
  9. {
  10. $tokens[] = $token;
  11. $i++;
  12. }
  13. }
  14.  
  15. return $tokens;
  16.  
  17. }


Nie wiem po co tu były sesje, ale może czegoś nie przeczytałem w temacie.
foxbond
  1. $arr = array();
  2.  
  3.  
  4. $ile = 20;
  5. $dlugosc = 10;
  6.  
  7. for ($i=0 ; $i < $ile ; $i++)
  8. {
  9. $rand = substr(md5(time().rand().microtime()), 0, $dlugosc);
  10. while (in_array($rand, $arr))
  11. {
  12. $rand = substr(md5(time().rand().microtime()), 0, $dlugosc);
  13. }
  14.  
  15. $arr[] = $rand;
  16. }
  17.  
  18. print_r($arr);


Chyba wszystko w porządku...

@pyro był pierwszy

Już poprawiłem tongue.gif
pyro
@foxbond, kod jest niepoprawny. PHP =/= JS smile.gif
Mareczko
pyro, małe pytanie mam. W Twoim kodzie ustalam $count czyli ilość jaką chce wygenerować ale w przypadku kiedy kody się powtórzą już nie otrzymam tej ilości. Jak to zmienić ?
pyro
Cytat(Mareczko @ 2.07.2011, 14:54:05 ) *
pyro, małe pytanie mam. W Twoim kodzie ustalam $count czyli ilość jaką chce wygenerować ale w przypadku kiedy kody się powtórzą już nie otrzymam tej ilości. Jak to zmienić ?


Zmieniłem to od razu, bo też to zauważyłem. Spójrz na mój poprzedni post jeszcze raz
nospor
pyro zwiększa $i dopiero wtedy gdy kody się nie powtarzają, więc sytuacja o której mówisz nigdy nie nastąpi
Mareczko
Ok, wszystko ok:) nie zauważyłem zmiany.
Dziękuję za pomoc.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.