Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> uaktualnianie bazy zdjęć
tomekp
post
Post #1





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Chciałbym zrobić tak, że zdjęcie które było następne po usuniętym, wskakuje na miejsce tego usuniętego, i tak wszystkie zdjęcia zmieniają swój numerek.

Załóżmy, że mamy 4 zdjęcia.
- 1,2,3,4
Usuwam 3
- 1,2,4
Przeładowanie zdjęć
- 1,2,3

Zacząłem coś pisać, ale nie mogę sobie z tym poradzić, mój smieszny kod.
  1. <?php
  2. $kod_klienta = $_SESSION['kod_klienta'];
  3. $id = $_POST['id'];
  4. $photo = $_POST['photo'];
  5.  
  6. unlink($cfg['oitia']['photos_path'].&#092;"/\".$id.\"/\".\"$photo.jpg\");
  7. sql(&#092;"UPDATE oitia SET zdjecie_$photo = '0' WHERE id = '$id' AND kod_klienta = '$kod_klienta'\");
  8.  
  9. $query = sql(&#092;"SELECT * FROM oitia WHERE kod_klienta = '$kod_klienta' AND id = '$id'\");
  10. $wpis = mysql_fetch_array($query);
  11.  
  12. for ($a = 1;$a <= 20;$a++) {
  13. $zdjecia[&#092;"zdjecie_\".$a] = $wpis[\"zdjecie_\".$a];
  14. }
  15. $zdjecia[&#092;"zdjecie_\".$photo] = '0';
  16.  
  17. for ($a = 1;$a <= 20;$a++) {
  18. $previous = ($a-1);
  19. if (($zdjecia[&#092;"zdjecie_\".$a] == 1) && ($zdjecia[\"zdjecie_\".$previous] == 0)) {
  20. $new = ($a-1);
  21. rename($cfg['oitia']['photos_path'].&#092;"/\".$id.\"/\".\"$a.jpg\", $cfg['oitia']['photos_path'].\"/\".$id.\"/\".\"$new.jpg\");
  22. $zdjecia[&#092;"zdjecie_\".$a] = 0;
  23. }
  24. }
  25. ?>


Ten post edytował tomekp 24.11.2004, 13:15:02


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Mam jedno pytanie.. PO CO?


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
tomekp
post
Post #3





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


To w takim razie jak ty byś to widział ?
Bo to wygląda tak, że klient ma możliwość wprowadzenia 20 zdjęć, dodaje, usuwa.


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
scanner
post
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




zapisuję na dysku zdjęcie o nazwie
  1. <?php
  2. $sFileName = md5_file( 'nazwapliku' ).'rozszerzenie_pliku';
  3. ?>
Dzięki czemu moge w ułamek sekundy sprawdzić, czy identyczne zdjęcie nie jest już zapisane.

Zapisuję do bazy ID zdjęcia, ID usera, nazwę oryginalną, $sFilename.
Usuwając zdjęcie usuwam odpowiednie ID z bazy, usuwam odpowiedni plik z dysku.

Przypominam, ze ID się nie przenumerowywuje, bo.. po prostu NIE. Ma byc unikalne zawsze. (jak uważasz, ze INT to za mało, zawsze masz BIGINT).


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
shima
post
Post #5





Grupa: Zarejestrowani
Postów: 245
Pomógł: 0
Dołączył: 9.09.2002

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


Cytat(scanner @ 2004-11-24 14:47:53)
Przypominam, ze ID się nie przenumerowywuje, bo.. po prostu NIE. Ma byc unikalne zawsze. (jak uważasz, ze INT to za mało, zawsze masz BIGINT).

To lubię party.gif ( bez złośliwosci)
Oczywiście argument scanner-a ma bardziej racjonalne przesłanki niż NIE, BO NIE. Wyobraź sobie sytuację w której Twoja baza zawiera relację pomiędzy ID Twojego obrazka a ID w 125 tabelach, które informacje nt. tej fotki zawierają. Musisz zatroszczyć się o "przenumerowanie" wszystkich relacji, bo inaczej zapytanie (nieważny kod) zwróci fałszywe wyniki. Poza tym dodanie czegokolwiek co ma być unikalne najlepiej wykonać przy użyciu
Kod
auto_increment
Sprawdzanie, czy w 17849 elementowej bazie miejsce 345 nie jest akurat wolne, żeby tam coś dodać to komplikacja, której nie tłumaczą ewentualne zyski.


--------------------
Nie ma nic stałego prócz zmiany...
Go to the top of the page
+Quote Post
tomekp
post
Post #6





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


A jak to rozwiązać gdy mam 250 użytkowników z tego każdy może mieć 20 zdjęć dodanych. A co się dzieje w przypadku gdy skonczą się wolne miejsca w polu id przy auto_increment ?


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
kszychu
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


Zmien typ pola na BIGINT UNSIGNED. Masz wtedy możliwość zapisania liczb od 0 do 18446744073709551615. Styknie to Twoim userom na zapisanie 73786976294838206 zdjęć przez każdego z nich.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
tomekp
post
Post #8





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Nie no aż tyle rekordów to miał nie będe.
Ale chyba zamiast auto_increment wykorzystam moją funkcje, do wyszukiwania pierwszego wolnego rekordu. To chyba będzie lepsze rozwiązanie. Jak uważacie ?

Funkcja wygląda w ten sposób :

  1. <?php
  2.  
  3. function get_first_free_record($table,$field) {
  4.  
  5. $last = &#092;"65534\";
  6.  
  7. $query = sql(&#092;"SELECT $field FROM $table ORDER BY $field ASC\");
  8.  
  9. $tab[] = array(&#092;"0\" => \"\");
  10.  
  11. while ($a = mysql_fetch_array($query)) {
  12. $tab[] = $a;
  13. }
  14.  
  15. for ($b = 1;$b < $last;$b++) {
  16. $id = $tab[$b];
  17. if ($id[$field] != $b) {
  18. $first = $b;
  19. break;
  20. }
  21. }
  22. return $first;
  23. }
  24.  
  25. ?>


Co sądzicie ?


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
militis
post
Post #9





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 17.08.2004
Skąd: Olsztyn

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


Głupota do kwadratu.

Od tego jest auto_increment w mysql zeby sobie radzic z takimi rzeczami. Jezeli pole jest 'auto-increment' i 'unique', masz pewnosc ze beda unikalne wpisy, i nie musisz sie bawic skryptem. 20 zdjec dla usera? Zadnen problem. Suma wszystkich rekordow dla danego usera musi byc mniejsza/rowna 20 i tyle. Klopoty z listowaniem pokolei? Zadnego. Polecam dla odmiany teraz manuala mysql poczytac [LIMIT itp].


--------------------
Artur Wasilewski
Go to the top of the page
+Quote Post
shima
post
Post #10





Grupa: Zarejestrowani
Postów: 245
Pomógł: 0
Dołączył: 9.09.2002

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


Cytat(tomekp @ 2004-11-24 20:05:45)
Nie no aż tyle rekordów to miał nie będe.
Ale chyba zamiast auto_increment wykorzystam moją funkcje, do wyszukiwania pierwszego wolnego rekordu. To chyba będzie lepsze rozwiązanie. Jak uważacie ?

Jeżeli robisz to dla treningu, to rób, ale jeżeli to ma być użyteczny skrypt, to , jak już wielkorotnie padło w tym wątku: PO CO?
Poza tym uczysz się złych schematów i będziesz później generował skrypty 100-linijkowe zamiast 5-linijkowych robiących dokładnie to samo, tylko dużo szybciej.


--------------------
Nie ma nic stałego prócz zmiany...
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 Aktualny czas: 20.08.2025 - 15:11