![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
nie wiem jak ugryźć pewien problem, tzn wiem jak mogę sobie z nim poradzić ale nie jestem pewny czy nie ma lepszych i sprawdzonych sposobów, dlatego będę wdzięczny za wszelkie opinie i wskazówki. Poniżej opiszę dwa problemy. Z pierwszym niedługo się zmierzę a drugi muszę rozwiązać. Problem 1: Wyobraźcie sobie, że piszecie aplikację, która będzie służyć do układania grafików dla pracowników (to tylko przykład). Kierownicy poszczególnych działów i inne osoby do tego wyznaczone (nie jest to jedna osoba) mogą układać i edytować grafiki. Osoba A wybiera pewnego pracownika, któremu edytuje grafik na miesiąc marzec. Po kliknięciu na link zawierający jego imię i nazwisko, wchodzi w tryb edycji grafiku tej osoby. Widzi cały miesiąc i może dokonywać zmian godzinowych dla poszczególnych dni, a po dokonaniu zmian, naciska przycisk "weryfikuj". Sprawdzane są warunki i jeśli wszystko jest ok, może zapisać zmiany. Jeśli nie są spełnione pewne zalezności, wyświetlany jest odpowiedni komunikat. Pomimo błędów osoba ta i tak może świadomie zapisać taki "błędny" grafik. Edycja takiego grafiku czy samo dodawanie nowego dla pracownika zajmuje trochę czasu. Problemem jest to, że druga osoba może chcieć w tym samym czasie edytować lub dodać grafik dla tej samej osoby. Może się trochę zdenerwować, jeśli okaże się, że układała grafik 20minut i podczas próby zapisania do bazy otrzyma komunikat, że grafik już istnieje (osoba B już go dodała) i można go tylko edytować. Pomyślałem, że dobrze byłoby blokować tabele a konkretnie użytkowników, którzy są w danym momencie dodawani albo edytowani. Ale samo blokowanie raczej nie spełni moich oczekiwań. Dlaczego? Nie jestem pewny (muszę to sprawdzić ale teraz nie mam chwilowo dostępu do bazy) ale czy z blokowaniem tabel nie jest tak, że jak skrypt php kończy się wykonywać to blokady są zdejmowane? Jeśli tak nie jest, tylko można z poziomu php ustawić blokady w bazie do odwołania, to co będzie jeśli użytkownik zamknie przeglądarkę podczas edycji i pójdzie sobie gdzieś? Nikt nie może edytować ani dodać takiego pracownika, ponieważ teoretycznie jest on edytowany/dodawany przez inną osobę.. Jak sobie poradzić z tym problemem? Problem 2: Załóżmy że w bazie istnieją jakieś produkty. Możemy z poziomu aplikacji php dodawać nowe, edytować je i usuwać. Usuwanie odbywa się w następujący sposób: - wybieramy opcję usuń produkt - z listy rozwijanej wybieramy nazwę produktu i klikamy usuń (za pomocą $_POST przesyłamy sobie id produktu do usunięcia). Osoba A wybiera z listy rozwijanej produkt do usunięcia ale nie naciska przycisku usuń, bo... np zadzwonił telefon:) W między czasie osoba B usunęła ten produkt. Osoba A skończyła rozmawiać i naciska przycisk "usuń". I... łapiemy wyjątek SQL... Ja uważam (i tak przyjąłem pisząc aplikację), że wyjątek krytyczny (myślę tu o wyjątkach sql) to coś co powinno przerwać pracę aplikacji. Problem ten mógłbym rozwiązać poprzez sprawdzanie (przed samym zapytaniem usuwającym produkt) czy ten produkt istnieje nadal. Ale... może się zdarzyć (mało prawdopodobieństwo ale jest to możliwe a muszę to uwzględnić), że od sprawdzenia czy produkt istnieje a do jego usunięcia, ktoś ten produkt zdąży usunąć. I znowu mamy wyjątek SQL. Macie jakieś pomysły? Pozdrawiam |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
Co do problemu nr 2 - ten problem istnieje tylko w twojej wyobraźni - jeśli wyślesz do bazy polecenie DELETE dla nieistniejącego rekordu to nic się nie stanie - nie wystąpi żaden wyjątek ani błąd SQL - to tak samo jak SELECT który zwraca pusty wynik dla niespełnionego warunku w WHERE...
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Co do problemu nr 2 - ten problem istnieje tylko w twojej wyobraźni - jeśli wyślesz do bazy polecenie DELETE dla nieistniejącego rekordu to nic się nie stanie - nie wystąpi żaden wyjątek ani błąd SQL - to tak samo jak SELECT który zwraca pusty wynik dla niespełnionego warunku w WHERE... Masz racje - trochę się zagalopowałem. Rozważam opcję gdzie usuwanie pewnych danych to usuwanie danych z kilku tabel (nie używam kaskadowego usuwania) więc najpierw pobieram selectem id (klucz) i usuwam np z kilu tabel. I ewentualnie dostaję warningi php że próbuję się odwołać do indeksu tablicy (brak wyniku - tablica pusta). To mogę rozwiązać dodając dodatkowego ifa. Odświeżyłem temat bo dopadł mnie podobny problem (edycji przez więcej niż jednego usera). Przykład: na stronie wyświetla się spis produktów. Każdy produkt niech posiada takie pola jak: nazwa, cena i opis. Mamy dwóch użytkowników, którzy chcą edytować ten sam produkt, który posiada wpisaną nazwę i opis ale nie ma ceny. Użytkownik A klika na edycję produktu i wyświetla się formularz. W tym samym czasie użytkownik B także klika na edycję tego samego produktu i wyświetla się formularz edycji. Użytkownik A wprowadza cenę i zapisuje dane. Użytkownik B poprawia tylko opis, więc pole cena jest puste (kliknął edytuj zanim użytkownik A dodał cenę produktu) i zapisuje dane. Wynik cena wpisana przez użytkownika A znika. W ostateczności zastosuję rozwiązanie, które podał dr_bonzo ale może macie sprawdzone sposoby (inne) radzenia sobie z takimi sytucjami? @dr_bonzo: myślę, że taki znacznik, o którym piszesz mógłby być samą godziną rozpoczęcia edycji. To chyba najrozsądniejszy sposób. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.10.2025 - 04:59 |