Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zwiększenie wszystktim rekordom `sort_id` o jeden
Grim90
post 4.08.2010, 22:05:26
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 18.11.2008

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


Witam serdecznie smile.gif
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:
  1. $name = safe_it($_POST["name"]);
  2. $description = safe_it($_POST["description"]);
  3. $category = safe_it($_POST["category"]);
  4. $id = safe_it($_POST["id"]);
  5. $get = mysql_query("SELECT * FROM `server_boards` WHERE `sort_id` >= '$id' ORDER BY `sort_id`");
  6. while($board = mysql_fetch_assoc($get))
  7. {
  8. $getSort = $board["sort_id"];
  9. mysql_query("UPDATE `server_boards` SET `sort_id` = '" .($getSort + 1). "' WHERE `sort_id` = '$getSort'");
  10. }
  11.  
  12. mysql_query("INSERT INTO `server_boards` VALUES(NULL, '$name', '$description', '$category', '$id')");
  13. header("Location: ?goto=forum&action=boards");


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 smile.gif
Go to the top of the page
+Quote Post
everth
post 4.08.2010, 22:25:21
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Pierwsze zapytanie - podbijamy rekordy:
  1. UPDATE `server_boards` SET `sort_id` = `sort_id`+1 WHERE `sort_id` >= '$id';

Drugie zapytanie - wstawiamy rekord:
  1. INSERT INTO `server_boards` VALUES('$id', '$name', '$description', '$category', '$id'); /* przy założeniu że sort_id to twój klucz główny i jest na pierwszym miejscu

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]!
Go to the top of the page
+Quote Post
Grim90
post 4.08.2010, 22:46:41
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 smile.gif

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:

  1. function safe_it($str)
  2. {
  3. }


Ten post edytował Grim90 4.08.2010, 22:47:17
Go to the top of the page
+Quote Post
everth
post 4.08.2010, 23:00:43
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]!
Go to the top of the page
+Quote Post
Grim90
post 4.08.2010, 23:03:18
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 smile.gif
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: 20.07.2025 - 02:02