Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] zmiana liczby porządkowej rekordu
mpps
post
Post #1





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


witam,
mam taki problem:
chcę zmieniać liczbę porządkową rekordu za pomocą skryptu php w trakcie uaktualniania danych w bazie.

wyglądać ma to tak:

1. stan początkowy:

position | rekord
-------------------
1 | rekord1
2 | rekord2
3 | rekord3
4 | rekord4
5 | rekord5

2. po zmianie:

position | rekord
-------------------
1 | rekord1
2 | rekord5
3 | rekord2
4 | rekord3
5 | rekord4

3. po kolejnej zmianie:

position | rekord
-------------------
1 | rekord1
2 | rekord2
3 | rekord5
4 | rekord3
5 | rekord4

  1. IF($position!=$rek[position]){
  2. mysql_query("UPDATE tabela SET position=position+1 WHERE position>=$position") OR die(mysql_error());
  3. }


powyższe rozwiązanie powoduje, że po każdym uaktualnieniu danych, czyli zmianie którejś z pozycji, te, które mają wyższą liczbę porządkową zwiększają ją o 1.
problem tkwi w tym, że jeśli po raz kolejny uaktualnię dane w tabeli, te z wyższą liczbą porządkową znowu zwiększają ją o 1.

wygląda to wtedy tak:

1. stan początkowy:

position | rekord
-------------------
1 | rekord1
2 | rekord2
3 | rekord3
4 | rekord4
5 | rekord5

2. po zmianie:

position | rekord
-------------------
1 | rekord1
2 | rekord5
3 | rekord2
4 | rekord3
5 | rekord4

3. po kolejnej zmianie:

position | rekord
-------------------
1 | rekord1
2 | rekord2
3 | rekord5
5 | rekord3
6 | rekord4

jak zastosować pętlę, żeby rekord3 miał lp 4 a rekord4 lp 5?

pozdrawiam

Ten post edytował mpps 6.02.2008, 17:52:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
-Wieviór-
post
Post #2





Goście







Cytat(nowotny @ 7.02.2008, 00:40:21 ) *


Ogólnie wygląda to dobrze chyba, tylko trzeba pamiętać, że w pierwszym if'ie else oznacza =<, a więc też gdy są sobie równe, i choć nic to nie zmieni, to warto dodać elseif < i elseif =, bo nie trzeba wtedy robić zapytania do bazy.

Inna sprawa, że proponuję lekką optymalizacje:

  1. <?php
  2. $position_doc='7';//pozycja docelowa gdzie chcemy umiescic rekord
  3. $rekord='trzy';//nazwa rekordu ktory chcemy przesunac
  4.  
  5. $query='SELECT position FROM tabela WHERE rekord="'.$rekord.'"';
  6. $result=mysql_query($query);
  7. $rekord_current_position=mysql_fetch_assoc($result);
  8.  
  9. if($rekord_current_position>$position_doc) {
  10. $direction='back';
  11. $query='SELECT position FROM `tabela` WHERE `position` BETWEEN '.$position_doc.' AND '.$rekord_current_position.';';
  12. }
  13. else {
  14. $direction='forw';
  15. $query='SELECT position FROM `tabela` WHERE `position` BETWEEN '.$rekord_current_position.' AND '.$position_doc.';';
  16. }
  17.  
  18. $result=mysql_query($query);
  19. while ($row = mysql_fetch_assoc($result)) {
  20. if($row==$rekord_current_position){
  21. $query='UPDATE tabela SET position="'.$position_doc.'" WHERE rekord="'.$row['rekord'].'"';
  22. }
  23. else{
  24. if($direction=='forw'){
  25. $query='UPDATE tabela SET position="'.($row['position']-1).'" WHERE rekord="'.$row['rekord'].'"';
  26. }
  27. else{
  28. $query='UPDATE tabela SET position="'.($row['position']+1).'" WHERE rekord="'.$row['rekord'].'"';
  29. }
  30. }
  31. mysql_query($query);
  32. }
  33. ?>


Nie potrzebne używać * i tworzyć tablicę, wyczytując całą tabelę z bazy danych, jeśli używamy tylko position ;]
Go to the top of the page
+Quote Post
mpps
post
Post #3





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


Cytat(nowotny @ 6.02.2008, 22:40:21 ) *
I mam nadzieje że nie masz pola "position" zdefiniowanego jako AUTOINCREMENT... (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

no, jak bym używał do 'position', to nie potrzebowałbym takiego rozwiązania - za które bardzo Ci dziękuję, bo po lekkich modyfikacjach działa doskonale! Modyfikacje nie wpływają na funkcjonalność, dlatego nie będę zaśmiecał nimi tutaj miejsca. jeszcze raz wielkie dzięki!!
jeśli komuś (może mi?) będzie się chciało, to może na podstawie Twojego rozwiązania rozwinąć temat i stworzyć np. skrypt do numerowania 'na nowo' danych w bazie.
spotkałem się na tym forum wielokrotnie z pytaniem o możliwość optymalizacji bazy pod kątem nadania nowego 'id' w sytuacji, kiedy używa się 'auto_increment' i wiadomo, że po wyrzuceniu jakiegoś rekordu powstają 'dziury'.
wiem, wiem, że zmiana 'id' może powodować błędy, itd, bla, bla, ale są takie sytuacje, kiedy taka zmiana jest pożądana!

Cytat(Wieviór @ 7.02.2008, 13:33:28 ) *
Inna sprawa, że proponuję lekką optymalizacje:
Nie potrzebne używać * i tworzyć tablicę, wyczytując całą tabelę z bazy danych, jeśli używamy tylko position ;]

a nie prawda!
jak zassiesz z bazy tylko 'position', to jest problem, ponieważ nie zostanie zmieniona pozycja elementu, który już taką pozycję ma (pole nie jest 'primary', bo być nie może)!
czyli, jeśli zmienisz 9->6, to 6->6 a nie 6->7
jeszcze nie wiem czemu ale właśnie to sprawdzam

od siebie dodaję zmianę w sytuacji usuwania rekordu:
  1. $result = mysql_query("SELECT * FROM tabela WHERE id=$id") OR die(mysql_error());
  2. $rek = mysql_fetch_array($result);
  3. mysql_query("DELETE FROM tabela WHERE id=$id") OR die(mysql_error());
  4.  
  5. // zmiana position dla wpisow z wyzszymi pozycjami
  6. $rekord=$id; //id rekordu, ktory usuwamy
  7. $rekord_current_position=$rek[position]; //position rekordu, ktory usuwamy
  8.  
  9. $query="SELECT * FROM tabela WHERE position>$rekord_current_position";
  10.  
  11. $result=mysql_query($query);
  12. while($row = mysql_fetch_assoc($result)){
  13. $query="UPDATE tabela SET position=($row[position]-1) WHERE id=$row[id]";
  14. mysql_query($query);
  15. }

proste ale jeśli ktoś będzie potrzebował, to ma komplet

pozdrawiam i dzięki!

Ten post edytował mpps 7.02.2008, 15:36:01
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 10:51