Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]problem z doborem petli
AniaR
post
Post #1





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 6.05.2009
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Hej,

Przy wkladaniu uzytkownika do bazy losuje 20 znakowy ciag liczb i liter i umieszczam go w komorce tabeli id_unique:

  1.  
  2. srand(time());
  3. $charset = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','w','y','z','0','1','2','3','4','5','6','7','8','9');
  4. $id_unique = "";
  5. for ($i=0; $i<20; $i++)
  6. {
  7. $random = (rand() % 33);
  8. $id_unique = $id_unique.$charset[$random];
  9. }
  10.  


ten id_unique musi byc unikalny i nie moze sie powtarzac, wiem ze jest bardzo male prawdopodobienstwo ze wylosuje taki sam ciag znakow ale jednak takie prwdopodobienstwo jest. A ja musze dac zabezpieczenie. Musze sparwdzic czy w tabeli w bazie jest juz taki id_unique ktory wlasnie zostal wylosowany i jezeli jest to wylosowac kolejny. Nie mialabym problemu gdybym miala to zrobic tylko raz. Sprawdzilabym to prosty ifem i jezeli juz taki by instnial wygenerowalbym kolejny $id_unique. Ale co gdyby po raz 2 wylosowal sie taki ktory juz istenieje w bazie. Wszytsko musialabym powtorzyc od poczatku. Chcialabym to jakas zapetlic ale nie mam juz zadnego pomyslu, probowalam roznych petli jednak ciage laduje w slepym zaulku.. prosze o podpowiedz.. bede wdzieczna smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
vermis
post
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

Ostrzeżenie: (0%)
-----


A nie lepiej użyć md5 z autoinkrementowanego id?
Jeśli nie to można dać na to pole index unique i jeśli insert zwróci błąd powtórzonego klucza to losujesz jeszcze raz i znowu próbujesz zrobić inserta. I tak aż do skutku w pętli do-while.


--------------------
Go to the top of the page
+Quote Post
AniaR
post
Post #3





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 6.05.2009
Skąd: warszawa

Ostrzeżenie: (0%)
-----


A czy moglbys mi nakreslic jak ta petla mialaby wygladac i jakie warunki uzyc, bo wlasnie z tym mam problem..
Go to the top of the page
+Quote Post
vermis
post
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

Ostrzeżenie: (0%)
-----


  1. do {
  2.  
  3. generujId();
  4.  
  5. if (mysql_query(insert...)) {
  6. break; // wychodzi z pętli jeśli poprawny zapis
  7. } else {
  8. sprawdzasz kod błędu (mysql_errno()) jeśli to powtórzony klucz nic nie robisz, pętla idzie dalej, czyli losuje raz jeszcze
  9. jeśli inny błąd wychodzisz z pętli
  10. }
  11. } while(1);


Nie pamiętam jaki to kod błędu, ale jeden z tych dwóch
http://dev.mysql.com/doc/refman/5.0/en/err...rror_er_dup_key


--------------------
Go to the top of the page
+Quote Post
AniaR
post
Post #5





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 6.05.2009
Skąd: warszawa

Ostrzeżenie: (0%)
-----


dziekuje, wyglada sensowie, zaraz to sobie dopasuje smile.gif

a jednak sobie do konca nie poradzilam, nie wiem co mam wpisac w warunku while.. jak wpisuje while (1) to petla dziala bez konca.. robie tak:
  1. do {
  2.  
  3. srand(time());
  4. $charset = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','w','y','z','0','1','2','3','4','5','6','7','8','9');
  5. $id_unique = "";
  6.  
  7. for ($i=0; $i<20; $i++)
  8. {
  9. $random = (rand() % 33);
  10. $id_unique = $id_unique.$charset[$random];
  11. }
  12.  
  13. if ($db->wykonaj("INSERT INTO uzytkownik value (null, '$id_unique', '$username', '$password', '$email', '$sex', '$name', '$surname', '$adress', 'N', null)"))
  14. {
  15.  
  16. break;
  17. }
  18. else
  19. {
  20. if (mysql_errno() == 1062)
  21. {
  22.  
  23. }
  24. }
  25. }
  26. while(1);
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 14:43