Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ograniczona liczba uploadowanych zdjęć dla produktu, oraz przekazywanie adresu zdjęcia z iframe do strony nadrzędnej
elwierka
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


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).
Go to the top of the page
+Quote Post
krowal
post
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

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


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


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
elwierka
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


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
Go to the top of the page
+Quote Post
CuteOne
post
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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. }


Go to the top of the page
+Quote Post
elwierka
post
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


hmmm ale tak bez żadnego klucza głównego w tabeli zdjęcia?
Go to the top of the page
+Quote Post
lukaskolista
post
Post #6





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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
Go to the top of the page
+Quote Post
elwierka
post
Post #7





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


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...
Go to the top of the page
+Quote Post
lukaskolista
post
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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?
Go to the top of the page
+Quote Post
elwierka
post
Post #9





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


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
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
elwierka
post
Post #11





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 26.12.2007

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


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?
Go to the top of the page
+Quote Post
lukaskolista
post
Post #12





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


jezeli musza byc konkretnie 3 zdjecia, to tak, jak napisal CuteOne. Jezeli nie, to tak:
produkty
id
nazwa

zdjecia
id
id_produktu
nazwa_pliku
Go to the top of the page
+Quote Post
phpion
post
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@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
Go to the top of the page
+Quote Post
lukaskolista
post
Post #14





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


@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

Ten post edytował lukaskolista 24.09.2010, 07:56:11
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: 21.08.2025 - 13:18