![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Stanąłem przed takim problemem i zbytnio nie wiem jak go rozgryźć; Chcę zrobić, by osoba dokonała wpisu, które zostanie utworzone w bazie mysql, ale do wpisu tego, będzie przydzielany numer. Numer ten tworzony będzie raz na minutę. Muszę więc zapobiec by więcej niż jeden wpis był zapisany do bazy w ciągu minuty, potrzebny jest więc jakiś mechanizm, który np. ustali kolejność wpisów (bo może być ich kilka w ciągu danej minuty), tym samym kolejne wpisy musiały by się dokonywać w dalszych minutach, lub sprawdzanie kolejnych powinno być z początkiem następnej minuty. Chcę też uniknąć sytuacji, gdy dany wpis osoby będzie czekał w "kolejce", a osoba zrezygnuje - użyje tu przycisk, który pojawi się dopiero jak będzie "wolne" miejsce na wpis. Myślałem o milisekundach, bo więcej niż 1 wpis też może wystąpić w danej sekundzie, ale może jest jakiś łatwiejszy sposób? Nie mam nawet wizji możliwego kodu, ale wyglądało by to tak; 1. Połączony z bazą 2. ... - tutaj kod sprawdzający/zapisujący 3. Dalsza część programu - jeśli zapis jest możliwy 4. Koniec połączenia Potrzebne rozwiązanie, tylko do pkt. 2. Każdy pomysł, będzie lepszy od tego, którego nie mam ![]() |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
No to dodajesz normalnie do BD wpisy oznaczone czasem i flagą np. published = 0,
co 1 min zapuszczony cron który wybiera najstarszy wpis z flagą = 0 i zmienia flagę na 1. Dodatkowo okraś to datą aktualizacji/publikacji. W ten sposób będziesz wiedział ile masz wpisów w kolejce, ile opublikowanych itd. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
Cron odpada raczej, bo klient musi być na czas dalszej procedury, zostanie przydzielony numer, a potem do wpisu o tym numerze, reszta pyt., np. o imię, czy e-mail osoby wpisującej. Gdy osoba nie dokończy całości, numer nie może być zapisany z pustymi polami.
1) 16:30:15 - sprawdzenie czy jest zajęty numer, ustalić flagę 0/1 - inne wpisy wtedy mają loadera - 16:31:00 ponowne sprawdzenie, gdyby ktoś zrezygnował z czekania na pojawienie się przycisku zakładając że flaga jest do czasu, nie osoby 2) jest więcej niż 2 wpisy w tym samym momencie - sytuacja j/w, ale 3 osoby w tym samym czasie dokonały wpisu, np. 16:30:00 wynik sprawdzenia będzie znany dopiero 16:30:01 trzeba by porównać milisekundy chyba wtedy? wziąć trzeba pod uwagę pingi, nawet kilku sek. - połączenie nie zerwane, ale czas leci dalej, wtedy osoba 1 dostaje nr., 2 podaje swoje imię, a 3 maila i mamy chaos ![]() Może zastosować "chwilowy" wpis w jakąś komórkę do bazy i ją sprawdzać/kasować/zmieniać? A może ktoś podsunie pomysł na sprawdzanie "po czasie"? Czyli dana min. minęła i porównanie ile osób się w niej zgłosiło, lub sprawdzenie, czy wcześniejsza min. jest wolna. No nie wiem, co lepsze. Mile widziany kod, ale jak nie będzie, to wystarczą metody, na ich podstawie sklepie coś. Ja i tak muszę to zrobić, napisałem z myślą że już taki problem był komuś znany. Tego typu problemów mam kilka, muszę sobie z nimi poradzić i uznałem że forum będzie dobrą opcją. Tak, czy siak, dziękuję za jakiekolwiek wpisy. Ten post edytował Biqs 28.04.2016, 15:57:25 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dobra to inaczej. Powiedz co robisz bo może zabierasz się do tego niewłaściwie.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
To może inaczej opiszę. Wyeliminujmy wpisy, czy zbieranie dalszych danych, one będą po. Powiedzmy, że przypominać to będzie zakładanie konta, ale tworzyć się może tylko 1 na min. W zwykłym koncie jest jakiś login (imię, czy mail), tu login będzie numerem który ma właśnie być przypisany. To tak bardzo upraszczając.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
No to dodaj sobie kolumnę typu Int i ustaw jako unique.
Pchaj tam czas zakładania konta (timestamp) z sekundami ustawionymi na 0. Wtedy BD zadba o unikalność, a ty dostaniesz error przy dodawaniu więcej niż 1 na min. Potem musisz sobie tylko ten błąd wyłapać i coś zrobić. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
Pewnie nie chce Ci się pisać kodu? Twoja wersja brzmi prościej
![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Myślę, że nie tyle mu się nie chce pisać kodu, co próbuje Cie po prostu nakierować na rozwiązanie. Ja na Twoim miejscu użył bym tego co Pyton napisał w pierwszej odpowiedzi + websocket. Klient się łączy - i za każdym razem jak ktoś się pojawia przed nim dostaje info o ludziach w kolejce, gdy nadchodzi jego kolej rejestruje sie, reszta dostaje info, że już jest wolny "slot" i tyle.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
Tak więc będę musiał zrobić. Użyję nowej tabeli do tego, bo mi się napaćka w starej. Zostaje jeszcze to jakoś zgrać z wyliczaniem czasu. Będzie lepiej jak ID będzie rosło i będzie się wybierać pierwszy wpis w minucie, czy jakoś zatrzymać, gdy będą chciały zapisać się następne?
Mam jeszcze pytanie z innej beczki, dotyczące relacji między 2 tabelami. Wiem że to nie ten dział, ale nie chcę zaśmiecać nowymi wpisami. Chodzi o to, że do wygenerowanych numerów, podpiąłem osoby i między nimi są relacje, coś jak kierownik, księgowy, pracownik, itp. Do każdej z tych osób przypisana jest ilość wpisów jakie dokonała. Nie mogę sobie poradzić ze zliczaniem, tak by wiadomo było ile wpisów dokonali wszyscy podwładni takiego kierownika. Każda z tych osób ma numer o którym wcześniej wspominałem, jego tu jakoś trzeba wplątać. Tego typu rozpiska, która by liczyła do 2 poziomów. Muszę uzyskać 2 wartości. Kierownik ma Księgowego ($wartosc1=1), a ludzie Księgowego razem uzyskali ($wartosc2=5) i wyświetlają się tylko linie; 1. Księgowy (1) (5) 2. Mechanik (4) (5) 3. Sekretarka (6) (0) Kierownik |-> Księgowy (1) | |-> Magazynier (2) | |-> Sprzątaczka (3) |-> Mechanik (4) | |-> Kierowca (5) |-> Sekretarka (6) W jednej tabeli mam numer osoby i jej podwładnego (np. Kierownik-Księgowy, Księgowy-Magazynier), a w drugiej spis wszystkich osób z imionami, nazwiskami i wartościami które uzyskali. Ten post edytował Biqs 4.05.2016, 17:58:25 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Wrzuć przykład tabelki - będzie łatwiej. Najlepiej tutaj + sqlfiddle.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
Jedna tabelka jest o nazwie "osoby" i ma tylko 2 komórki 'osoba1' i 'osoba2' w niej są numery osób.
Druga ma nazwę "wejscie" i składa się z 4 komórek 'numer', 'imie', 'nazwisko', 'wartosc'. Numer osoby z tabeli 1 (osoba1) i (osoba2), jest w tabeli 2 (numer). Próbowałem z pętlą w pętli while, jedna pętla - znaleźć 'osoba1', następnie szukać 'osoba2' w następnej tabeli, ale guzik z tego wychodziło. Każda osoba jest w tabeli "wejscie", a ich relacje (kto, pod kim) są w "osoby". Jeśli mogę jeszcze coś ułatwić, to chętnie to zrobię. Ten post edytował Biqs 4.05.2016, 18:46:02 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 965 Pomógł: 285 Dołączył: 19.06.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
http://sqlfiddle.com/#!9/63b70/5 coś takiego? |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 28.04.2016 Ostrzeżenie: (0%) ![]() ![]() |
U mnie wygląda to tak. Załóżmy; w momencie gdy osoba się zapisuje, generowany jest numer i zapisywany w "wejscie", wraz z imieniem nazwiskiem i 0 wpisów.
Później taka osoba ma podwładnego i on też się zapisuje, dla niego też jest robiony numer i wszystko o nim zapisywane jest jak wcześniej w "wejscie", oraz robiony jest wpis relacji w "osoby", czyli (numer_szefa - numer_nowego). Samo działanie się wykonuje elegancko. Problem jest wtedy, gdy 'kierownik' chce zobaczyć, czy jego ludzie robią wpisy i ile już zrobili. Będzie wchodził na stronę, na której wyświetli się; Imię, Nazwisko i obie te wartości za nazwiskiem (1) i (2). Nie wiem jak to zrobić w kodzie, by się wyświetlało sprawnie. Ale działania na bazie są spoko, tylko że w moim przypadku będą ciągle nowi ludzie przybywać, może być ich nawet kilkaset, przydał by się kod odczytujący te parametry. Załóżmy, że Ja to osoba 1, Ty osoba 2, a Twoi koledzy osoba 3 i 4. Odczyt wybranego numeru z bazy "osoby" w komórce 'osoba1' [Ja], pobranie wartości z komórki 'osoba2' [Ty] i przeszukanie w bazie "wejscie" osoby, która ma numer 'osoba2' [Ty], sprawdzenie ile wpisów mają wszyscy Twoi koledzy i pokazanie na ekranie. [Ja] -> [Ty]($wartosc1) -> [kolega]($wartosc2)+[kolega]($wartosc2)... Upraszczając. Sprzedaję towar i mam swoich pracowników, interesują mnie tylko moi pracownicy, a nie pracownicy pracowników - tylko za jaką sumę sprzedali. Czy mój pracownik Janek sprzedał za 200 a jego 20-stu innych pracowników sprzedało za 2500. Przepraszam, jeśli nie umiem wytłumaczć Ten post edytował Biqs 4.05.2016, 19:49:04 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 28.06.2025 - 06:24 |