Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ograniczona liczba uploadowanych zdjęć dla produktu
Forum PHP.pl > Forum > PHP
elwierka
Czy ktoś z Was mógłby mi podsunąć jakieś sensowne rozwiązanie mojego problemu?

W bazie danych mysql, utworzyłam tabelę PRODUKTY, której pola to m.in. id, nazwa, kategoria, opis, zdjecie1, zdjecie2, zdjecie3.

Z założenia ostatnie kolumny - zdjęcie 1, 2, 3, są polami typu char, w których chcę przechowywać adres obrazka na serwerze.

Napisałam sobie skrypt do uploadu plików na serwer, wszystkie pliki do jednego utworzonego katalogu.

Tworzę formularz do dodawania nowych produktów, gdzie po kolei należy podać dane produktu i ... pliki do uploadu.

Pytanie 1.
Jak ograniczyć ilość uploadowanych plików do liczby 3? Tak, aby te trzy adresy zapełniły po kolei wartości kolumn zdjęcie1, zdjecie2, zdjecie3? Nie chcę robić oddzielnej tabeli na zdjęcia, bo każde ze zdjęć będzie odpowiadało tylko określonemu produktowi

Pytanie 2.
W jaki sposób przekazać ścieżkę dostępu do pliku po uploadzie z ramki iframe do strony nadrzędnej?
Aby można było dodać plik ze strony na której znajduje się formularz, zrobiłam iframe i tu wstawiłam plik ze skryptem do uploadownaia plików na serwer. Problem w tym, że już po zapisaniu pliku na serwer i przypisaniem do zmiennej jego adresu na serwerze, nie potrafię wartości tej zmiennej przekazać do strony nadrzędnej (strony, na której znajduje się formularz do dodawania nowych produktów i iframe).
krowal
ad1.
Dajesz trzy pola w formularzu i w pliku php czytasz pliki tylko z tych pól - najprostsze ograniczenie.
Imo źle robisz zapisując zdjęcia w tej samej tabeli co produkty, z wielu powodów, pewnie niedługo się o tym przekonasz smile.gif

ad2.
Czemu w ogóle uploadujesz pliki przez iframe ? Nie lepiej dodać te trzy pola file do głównego formularza produktu ?
Jeśli jednak na prawdę nie możesz tego zrobić to zapisuj wgrane pliki w sesji a potem po zapisaniu produktu dodaj zapisane pliki do rekordu produktu.


Moim zdaniem strasznie wszystko udziwniasz i kombinujesz z jakimiś dziwnymi rozwiązaniami zamiast zrobić tak jak się robić powinno smile.gif
elwierka
ok to powiedzmy, tworzę formularz i dodatkowo 3 pola do załadowania plików

Tylko jakie zmiany wprowadzić w bazie danych?
W tabeli produkt zostawić 3 pola na zdjęcia, typu int, będące kluczem obcym do tabeli, którą utworzę (tabela obrazki)?

Chcę, aby przy zapisywaniu nowego produktu, po aktywacji skryptu do zapisywania, następowało:

1. Zapisywanie plików jpg na serwer i jednocześnie przypisanie tych ścieżek do zmiennych w polu zdjecie(1,2,3)
2. zapisanie danych do bazy danych



...a ...
I jak można by przerobić skrypt do wysyłania 3 plików jednocześnie?

Napisałam skrypt do wysyłania jednego pliku:

  1. <?php
  2.  
  3. if($_FILES['plik1']['error']>0)
  4. {
  5. echo 'Pojawił się problem: ';
  6. switch ($_FILES['plik1']['error'])
  7. {
  8. case 1: echo 'Rozmiar pliku przekroczył wartość upload_max_filesize'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  9. case 2: echo 'Rozmiar pliku przekroczył wartość max_file_size'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  10. case 3: echo 'Plik wysłany tylko częściowo'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  11. case 4: echo 'Nie wysłano żadnego pliku'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  12. case 6: echo 'Nie można wysłać pliku. Nie wskazano katalogu tymczasowego'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  13. case 7: echo 'Wysłanie pliku nie powiodło się. Nie zapisano pliku na dysku.'; echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>'; break;
  14. }
  15. }
  16.  
  17. // czy prawidłowy typ mime
  18.  
  19. if (($_FILES["plik1"]["type"] != "image/gif")
  20. && ($_FILES["plik1"]["type"] != "image/jpeg")
  21. && ($_FILES["plik1"]["type"] != "image/x-png")
  22. && ($_FILES["plik1"]["type"] != "image/png")
  23. && ($_FILES["plik1"]["type"] != "image/pjpeg"))
  24. {
  25. echo 'Problem: plik jest nieodpowidnim typem.';
  26. }
  27.  
  28. // umieszczenie pliku w pożądanej lokalizacji
  29.  
  30.  
  31. if (file_exists('../obrazki/' . $_FILES['plik1']['name']))
  32. {
  33. echo $_FILES["plik1"]["name"] . " już istnieje. <br /><a href=\"".$_SERVER["HTTP_REFERER"]."\">Powrót</a>";
  34. exit();
  35. }
  36. else
  37. {
  38. $target = '../obrazki/'. $_FILES['plik1']['name'];
  39.  
  40. if(is_uploaded_file($_FILES['plik1']['tmp_name']))
  41. {
  42. if(!move_uploaded_file($_FILES['plik1']['tmp_name'], $target))
  43. {
  44. echo 'Problem: Plik nie może być skopiowany do katalogu';
  45. echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>';
  46. }
  47. }
  48. else
  49. {
  50. echo 'Problem: możliwy atak podczas wysyłania pliku. Nazwa pliku: ';
  51. echo $_FILES['plik1']['name'];
  52. echo '<br /><a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>';
  53. }
  54.  
  55. echo 'Plik wysłany.<br /><br />';
  56. echo 'Plik został zapisany pod adresem: '. $target . '<br /><br />';
  57. echo '<a href="'.$_SERVER['HTTP_REFERER'].'">Powrót</a>';
  58. //ponowne sformatowanie zawartości pliku
  59. }
  60.  
  61. ?>
  62.  


Nie wiem za bardzo jak go przerobić aby jednocześnie zapisywał 3 pliki i przydzielał im ściezki dostępu, jednak biorąc pod uwagę, że :
1 - żaden plik może nie zostać przesłany (produkt może nie posiadać obrazka)
2 - może zostać wysłany jeden, dwa, lub trzy pliki, nie musi być pełen komplet
CuteOne
Dobrym nawykiem jest tworzenie tabeli dla każdego rodzaju 'obiektów'. W praktyce wyglądało by to tak:

Tabela produkty:
id_produkt
nazwa
kategoria
opis

Tabla zdjęcia:
id_produkt
zdjecie_1 //może być varchar o odp. długości, żeby zmieścić ścieżkę do pliku
zdjecie_2
zdjecie_3

Następnie pobieranie:
  1. SELECT zdjecia.*, produkty.* FROM zdjecia, produkty WHERE produkty.id_produkt = $produkt AND zdjecia.id_produkt = produkty.id_produkt


Co do formularza- przerób to co masz na jakieś ładne funkcje i sprawdzaj po kolei np. tak:
  1. for($i=1;$i<=3;$i++) {
  2.  
  3. if(!empty($_FILES['plik'.$i]['name'])) {
  4.  
  5. dodajDoBazy($i); // tutaj odwołanie do funkcji, która przeprowadzi walidacje pliku i doda nowy produkt jeżeli id_produkt
  6. nie istnieje w bazie lub UPDATE jeżeli istnieje :)
  7. }
  8. }


elwierka
hmmm ale tak bez żadnego klucza głównego w tabeli zdjęcia?
lukaskolista
w tabeli zdjecia id_produktu jest kluczem glownym i pomocniczym (2 w 1), bo przeciez dla 1 produktu bedzie tylko 1 rekord, wiec po co dodatkowe, nic nie dajace pole smile.gif
teraz pytanie ode mnie: czy te 3 zdjecia wrzuca sie za 1 razem, czy mozna np co kilka dni dodawac? Jezeli tak, to formularz z 3 polami do obrazkow nie spelni swojej roli
elwierka
chciałam zrobić tak, że wrzuci się tyle zdjęć, ile będzie podanych ścieżek...jeśli wszystkie 3 to wszystkie 3 się wrzucą, jeśli 2 lub 1 to tyle. A jeśli żadne nie będzie podane, to wiadomo. Planowałam zrobić tak, że jeśli np. za drugim razem będzie próba dodania 3 zdjęć, to te wcześniejsze zostaną nadpisane tymi nowymi.

Tylko teraz przychodzi mi do głowy kolejne pytanie.
Jak to najlepiej rozwiązać, żeby np. po dodaniu za pierwszym razem 2 zdjęć i za drugim razem 1 zdjęcia, przez to jedno, nie zostało nadpisane np. któreś z dwóch pozostałych zdjęć, tylko żeby było wstawione w pustym miejscu.
Niby mogę sprawdzić, które z kolumn posiada wartość NULL i tam wstawić dane, ale nie wiem czy tak to się prawidłowo robi. Pytanie też co, jeśli np. wszystkie 3 są wypełnione, a chcę podmienić tylko jedno z nich. Hmmm...
lukaskolista
Zrob cos w rodzaju slotow na zdjecia. Gdy uzytkownik wrzuca zdjecie, wybiera slot (pole w bazie), do ktorego chce je dodac, powinnas jednak zrobic o tym informacje i dac mozliwosc uzytkownikowi sprawdzenia jego zdjec, ktore jest w ktorym slocie.
Z ciekawosci zapytam, czemu tylko 3 zdjecia?
elwierka
chcę żeby to były tylko przykładowe obrazki, widok z przodu, z tyłu, ewentualnie w środku (produktem mają być torby, plecaki) a aplikacja ma być dla stałych kontrahentów, którzy wiedzą, jak wygląda produkt. Zdjęcie ma tylko obrazować, czy odpowiedni produkt wybierają....aplikacja na obronę, na uczelnię smile.gif ale może się później też przyda
phpion
Cytat(CuteOne @ 22.09.2010, 02:11:42 ) *
Dobrym nawykiem jest tworzenie tabeli dla każdego rodzaju 'obiektów'. W praktyce wyglądało by to tak:

Tabela produkty:
id_produkt
nazwa
kategoria
opis

Tabla zdjęcia:
id_produkt
zdjecie_1 //może być varchar o odp. długości, żeby zmieścić ścieżkę do pliku
zdjecie_2
zdjecie_3

Nie siej herezji. Twoja struktura nie ma nic wspólnego z dobrymi nawykami...

products: [id, name...]
photos: [id, position...]
photos_products: [product_id, photo_id]

Legenda: klucz główny, klucz obcy, klucz główny + klucz obcy.
elwierka
hmm no to jak w ostatecznie będzie lepiej? zrobić oddzielną tabelę na produkty i zdjęcia + tabelę pomocniczą łączącą produkty i zdjęcia, czy tak, jak napisał CuteOne w poście?
lukaskolista
jezeli musza byc konkretnie 3 zdjecia, to tak, jak napisal CuteOne. Jezeli nie, to tak:
produkty
id
nazwa

zdjecia
id
id_produktu
nazwa_pliku
phpion
@lukaskolista:
Weź tylko pod uwagę, że różne produkty mogą mieć te same zdjęcia. Przykład: produkty danej serii różniące się jedynie parametrami technicznymi, a o takim samym wyglądzie wizualnym. W przypadku Twojej koncepcji konieczne będzie uploadowanie plików dla każdego produktu. Moja koncepcja umożliwia wykorzystanie jednego zdjęcia przy kilku produktach.

No ale faktyczne rozwiązanie zależy od konkretnych wymogów. Jeśli ~elwierka nie potrzebuje wspomnianej funkcjonalności to Twoje rozwiązanie jest OK smile.gif
lukaskolista
@phpion:
moje rozwiazanie to tylko szablon, jezeli potrzebuje rozwiazanie opisane przez Ciebie, wystarczy zrobic tabele z produktami, zdjeciami i relacje wiele do wielu miedzy nimi

produkty
id
nazwa

zdjecia
id
plik

produkty_zdjecia
id
id_produktu
id_zdjecia
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.