Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: uaktualnianie bazy zdjęć
Forum PHP.pl > Forum > PHP
tomekp
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. ?>
scanner
Mam jedno pytanie.. PO CO?
tomekp
To w takim razie jak ty byś to widział ?
Bo to wygląda tak, że klient ma możliwość wprowadzenia 20 zdjęć, dodaje, usuwa.
scanner
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).
shima
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.
tomekp
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 ?
kszychu
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.
tomekp
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 ?
militis
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].
shima
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.