Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Generowanie kodu
Forum PHP.pl > Forum > Przedszkole
Kinia
Glowie sie od kilku godzin, niby prosty kod do napisania a niby cos zle robie.

Mam baze danych w ktorej sa np. produkty i kazdy produkt ma kod swoj (ida po kolei) np. aa-0001, aa-0002, aa-0003, ... aa-0123

i teraz wlasnie chce zrobic generator takiego kodu (czyli by znalazl kolejny wolny) - zapewne ktos mysli - a nie latwiej zrobic zeby policzyl wszystkie i dodal kolejny - NIE

koniecznie musi byc kolejny - przedstawie moj tok myslenia - moze robie cos zle no ale ...

1. LACZENIE SIE Z BAZA DANYCH (host, login, passwor) - wiadomo

2. zmienne na poczatku

$a = "aa-"

$b = "0000";

$ab = $a.$b;

3. Wyszukaj $ab w bazie danych w kolumnie kod

4. Policz wynik (mysql_num_rows)

5. Jesli wynik 0 - czyli aa-0000 JEST WOLNY

6. Ale jesli nie - I TU NIE WIEM CZY MOGE TAK ZROBIC - ZASTOSOWAC WHILE

$nowy_b = 2;

$istnienie = 1


i tu zaczyna sie while

policz z ilu znakow sklada sie $nowy_b (z uzyciem strlen() )

to nam powie czy nowy_b sklada jest o 2-9 czy od 10 do 99 czy od 100 do 999 czy od 1000 do 9999 - to nam potrzebne do tego zebysmy wiedzieli ile wstawic zer przed kodem do wyszukania

tutaj switcha albo if do wygenerowania calego kodu czyli np (jak $new_b = 3 czyli ma jeden znak: $nowy_kod = $a."000".$new_b czyli na wyjsciu mamy np. aa-0003

tu select - czyli sprawdz w kolumnie kod czy jest taki aa-0003

policz znalezienie

i powtarza petle az znalezienie bedzie 0 smile.gif

MAM NADZIEJE ZE ROZUMIECIE cos z tego i bedzie Wam sie chcial to przenalizowac


NIBY LATWE ALE JEDNAK COS NIE TAK :/
nospor
Po pierwsze:
tak jak to tu przedstawiłeś, to jest to totalnie bezsensu. Skoro zawsze to ma być aa-ITUKOLEJNE, to zrób poprostu pole ID autoincrement, które samo automatycznie będzie się zwiększać o 1 i będziesz miał to co chcesz.
Jak ci będzie zależało na aa-.... to poprostu potem na podstawie ID będziesz te aa-.... budował

Po drugie:
e, tu napiszę, jak ustosunkujesz się do po pierwsze wink.gif
Kinia
No jest troche namieszane, w kazdym razie chodzi o to ze jest kilka kategorii tych produktow i rozne kilka kategorii oznaczen np: as-0001 albo az-0032

czyli chce zeby sprawdzilo (np w przypadku az-...) czyli zeby sprawdzil az-0001,az-0002,az-0003,az-0004,az-0005,az-0006,az-0007,az-0008,az-0009,az-0010 ...

i zeby sprawdzal az bedzie wolne bo np. moze byc tez przerwa: az-0001, az-0002 az-0004 - I W TYM PRZYPADKU ZEBY WYGENEROWAL az-0003
wNogachSpisz
Takie identyfikatory źle się indeksują.
Lepiej stwórz tabele gdzie będziesz miał kategorie (AA, AB, ... ZZ) przetłumaczone na cyferki (10, 11, ... 99), doczep je do identyfikatora produktu z przodu..
Otrzymasz identyfikator produktu w stylu 990001.
Potem chcąc dodać kolejny element:

1. otwierasz transakcje na tabeli (lub calej bazie zalezy od silnika)
2. szukasz idntyfikatora produktu wiekszego od 990000 lecz mniejszego od 999999 sortujesz od najwiekszego, limit 1 (zaindeksowane wykona się błyskawicznie)
3. do wyniku dodajesz 1 i tworzysz kolejny rekord w tabli produktow
4. zamykasz transakcje

Auto-icrement też działa poniekąd na transakcjach tyle że lepiej zoptymalizowanych, więc whatever ;p

To co opisałem jest z pewnością krokiem w dobrym kierunku.
Da się dużo, dużo lepiej, niestety podałeś zbyt mało informacji żeby dobrać idelne rozwiązanie ;p
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.