Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie konta
Forum PHP.pl > Forum > Bazy danych
Biqs
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
Pyton_000
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.
Biqs
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.
Pyton_000
Dobra to inaczej. Powiedz co robisz bo może zabierasz się do tego niewłaściwie.
Biqs
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.
Pyton_000
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ć.
Biqs
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.
kapslokk
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.
Biqs
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.
kapslokk
Wrzuć przykład tabelki - będzie łatwiej. Najlepiej tutaj + sqlfiddle.
Biqs
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ę.
kapslokk
  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?
Biqs
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ć
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.