![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie
![]() Piszę skrypt PHP / MySQL na własne potrzeby i mam taką oto sytuację oraz problem - przejdźmy zatem do konkretów: Dodaję za pomocą formularza rekord wraz z opcją wpisania ID (sort_id w bazie). Sortowanie na stronie leci za pomocą właśnie tego sort_id, więc chciałbym wprowadzić, że jeśli przykładowo mam rekordy z sort_id 1, 2, 3, 4, 5, oraz gdy wpiszę w formularzu nowego rekordu przykładowo id 3, to istniejącym już rekordom z sort_id 3, 4, 5 zostanie nadany UPDATE, gdzie zostanie dodany +1 do ich sort_id, czyli będą wynosić 4, 5, 6, a tamten doda się z sort_id 3. Zrobiłem już coś takiego:
Niestety, po zrobieniu tego wszystko się pruje, znaczy się mam wyniki, które pierwotnie były (sort_id) 1, 2, 3, 4, 5, 6, 7, zmieniły się w 1, 1, 1, 6, 6, 8, 8. Oczywiście nowy rekord został dodany prawidłowo po tym... Zatem, ma ktoś jakąś propozycję rozwiązania tego problemu? Pozdrawiam i z góry dziękuję za chęci pomocy ![]() |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Pierwsze zapytanie - podbijamy rekordy:
Drugie zapytanie - wstawiamy rekord:
Najlepiej byłoby wykonać oba zapytania w pojedynczej transakcji dla bezpieczeństwa -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Działa wyśmienicie, dziękuję bardzo
![]() Cieszę się, że mogę na was liczyć w razie bezradności. Kurczę, o transakcji nie mam zielonego pojęcia póki co, więc będę musiał sobie zarezerwować trochę czasu na poszerzenie na ten temat wiedzy. W związku z tym mam jeszcze takie pytanko - czy to może być w jakiś sposób niebezpieczne, skoro piszesz o bezpieczeństwie? Dodam (gdyby ktoś pytał), że funkcja safe_it wygląda tak:
Ten post edytował Grim90 4.08.2010, 22:47:17 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Z tym bezpieczeństwem to nie chodzi o jakieś Sql Injection tylko o zachowanie spójności. Jeśli drugie zapytanie z jakiegokolwiek powodu się nie wykona to w kluczu bazy zostaje dziura (a prawdopodobnie coś w innej tabeli się do tego klucza odwołuje), w drugiej sytuacji (pierwsze zapytanie się nie wykonuje) jest trochę lepiej bo insert też się nie wykona.
Transakcja gwarantuje ci że stan tabeli zmieni się tylko wtedy gdy oba zapytania wykonają się poprawnie. Żeby mieć obsługę transakcji to zmień silnik tej tabeli na InnoDB. -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 18.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem już,
Dziękuję bardzo za pomoc i wyjaśnienie. Pozdrawiam serdecznie ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 20.07.2025 - 02:02 |