Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]problem z doborem petli
Forum PHP.pl > Forum > Przedszkole
AniaR
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
vermis
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.
AniaR
A czy moglbys mi nakreslic jak ta petla mialaby wygladac i jakie warunki uzyc, bo wlasnie z tym mam problem..
vermis
  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
AniaR
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);
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.