Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie konta
Biqs
post 28.04.2016, 14:06:06
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 smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 28.04.2016, 14:50:37
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.
Go to the top of the page
+Quote Post
Biqs
post 30.04.2016, 00:05:40
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 smile.gif

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
Go to the top of the page
+Quote Post
Pyton_000
post 30.04.2016, 20:49:17
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.
Go to the top of the page
+Quote Post
Biqs
post 30.04.2016, 21:14:19
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.
Go to the top of the page
+Quote Post
Pyton_000
post 30.04.2016, 21:30:53
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ć.
Go to the top of the page
+Quote Post
Biqs
post 30.04.2016, 21:44:10
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 smile.gif Ja w planie miałem przyjąć wszystkie wpisy, ile by ich nie było i po min. wybrać najstarszy, resztę skasować i ponownie zapisać pozostałe.
Go to the top of the page
+Quote Post
kapslokk
post 30.04.2016, 22:01:41
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.
Go to the top of the page
+Quote Post
Biqs
post 4.05.2016, 17:40:33
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
Go to the top of the page
+Quote Post
kapslokk
post 4.05.2016, 18:21:05
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.
Go to the top of the page
+Quote Post
Biqs
post 4.05.2016, 18:33:17
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
Go to the top of the page
+Quote Post
kapslokk
post 4.05.2016, 19:14:45
Post #12





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


  1. SELECT
  2. w.*,
  3. sum(w2.wartosc) AS wartoscPodwladnych
  4. FROM
  5. wejscie w
  6. LEFT JOIN osoby o ON o.osoba1 = w.numer
  7. LEFT JOIN wejscie w2 ON o.osoba2 = w2.numer
  8. WHERE w.numer = 1


http://sqlfiddle.com/#!9/63b70/5
coś takiego?
Go to the top of the page
+Quote Post
Biqs
post 4.05.2016, 19:40:07
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
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 Wersja Lo-Fi Aktualny czas: 28.06.2025 - 06:24