Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dodawanie nowych projektów
Forum PHP.pl > Forum > PHP
codeine
Witajcie! Jestem w trakcie tworzenia własnego systemu do zarządzania wykonywanymi projektami.
I utknąłem...
Jak w php rozwiązać sprawę dodawania nowych projektów? Już tłumaczę o co chodzi...
PRZYKŁAD


1. Strona głowna. Klikam w "wykonane" i,
2. Chce tam przycisk/link "dodaj projekt",
3. Otwiera mi się formularz i wypełniam - "nr projektu", "nazwa" , "data" - 1033 - podnośnik - 20.10.2011 - ZAPISZ
4. Po czym klikam w 1033 i poniżej wyświetla mi się okienko ze szczegółowymi plikami projektu... Przycisk "dodaj podzespół" służy do dodawania poszczególnych podzespołow projektu PODNOŚNIK a "dodaj element" daje możliwość dodawania elementów składających się na dany podzespół...

Pytanie brzmi: Jak to w php'ie zrobić? Czy jest możliwość dodawania w tym przypadku nowego projektu, który od razu da mi możliwość kliknięcia w jego numer. I rozwinięcia kolejnego kroku do którego będę mógł dodawać podzespoły i elementy danego projektu?
Te części to są pliki które można ściągnąć (cylinder, tłok, ramię) a są przechowywane na serwerze. Wogóle bajecznie by było jak tworzyłyby mi się te katalogi w takiej samej strukturze jak na stronie. Czyli dodając nowy projekt tworzy mi się katalog o nazwie PODNOŚNIK. A w środku kolejny -> PODSTAWA i CZESC GORNA wewnątrz których mam poszczególne pliki.
W jaki sposób moża to rozwiązać jesli się w ten sposób da. Chyba, że strasznie pokomplikowałem i utrudniłem ten mam nadzieje nie aż tak bardzo skomplikowany problem...
CuteOne
Jest to dość proste do wykonania (ale strasznie czasochłonne) Poczytaj o :
- gridach w PHP
- obsłudze formularzy i żądań
- mkdir i pochodne (manual twoim przyjacielem)
- file_get_contents, file_put_contents / fopen,fwrite,fclose,file itp.
- jeżeli nie umiesz posługiwać sie bazą danych to polecam artykuły o mysql

Jeżeli to ogarniesz będziesz wiedział jak zrobić to co opisałeś smile.gif
lukaskolista
Aby uniknac przyszlych problemow dodam tez, ze wazne sa ustawienia serwera (jak maksymalny rozmiar uploadowanego pliku). Wazne jest tez odpowiednie zabezpieczenie katalogow (przez .htaccess) aby nikt nie mogl pobrac sobie Twoich projektow. Oczywiscie inne zabezpieczenia (przed SQL injection itp.) sa rownie wazne.
codeine
dziękuje za wszelkie podpowiedzi i sugestie. Spróbuję się w to wgryźć i rozwiązać problem.

/edit

1. Hmmm, a jaka w tym przypadku byłaby najsensowniejsza metoda zapisu tych informacji o plikach projektów?
Czy można utworzyć tablice PODNOŚNIK i w niej wszystkie elementy (cylinder, ramka, ramię) i drugą tablice PODNOŚNIK_PODZESPOŁY w której byłyby nazwy podzespołów? Chyba, że od razu tablice dwuwymiarową jeśli do tego była by najlepsza (nigdy nawet z czegoś takiego nie korzystałem, wiem tylko, że są...)?

2. A co do mysql.
Mam w tym projekcie już stosowaną bazę danych bo przechowuje w niej informacje o logowanych i rejestrowanych użytkownikach, ale czy do informacji o plikach (oczywiście w bazie tylko nazwy plików odnoszące się do ich miejsca w katalogu na serwerze, a nie pliki bezpośrednio w bazie) też należy ją zastosować?
Bo nie potrzebuje informacji np. o tym jaki użytkownik dodał który plik. Chyba, że czegoś tu nie widzę, albo źle interpretuje...


2.1. I od razu zadam pytanie gdyby okazało się, że baza danych informacji o dodawanych plikach jest niezbędna:
Jak zapisać informacje w bazie o danym projekcie?
Chyba najlepszym rozwiązaniem będzie tworzyć za każdym razem nową tabelę z nazwą projektu (create table...)?
Czyli miałbym tabele PODNOŚNIK która zawierałaby info na temat wszystkich części (kolumny: L.P, nr. projektu, nazwa, data, stopień zaawansowania itp). A kolejny projekt to już kolejna tabela. Tyle ile miałbym projektów tyle byłoby tworzonych tabel.

PS. Co do mojej obecnej wiedzy na temat php to nabywam ją stopniowo. Wzoruje się na książce wydawnictwa Helion - "PHP i MySQL Tworzenie stron www".
CuteOne
1. Logicznym jest nie tworzenie osobnych tabel dla każdego projektu. W tym wypadku musisz przewidzieć jakie dane będą zapisywane do bazy dla każdego nowo tworzonego projektu. Ja bym to widział w ten sposób:

projekty
id | nazwa | plik |status

podzespoly
id | nazwa | dodtkowe_info_1 | dodatkowe_info_2 | dodatkowe_info_n+1 | plik | status

projekty_podzespoly
id_projekt | id_podzespol

Dzięki temu w łatwy sposób połączysz podzespoły z danym projektem używając tylko jednego zapytania.

2. Bazy danych służą do przechowywania dynamicznych treści, więc tak składowanie nazw plików w bazie jest jak najbardziej prawidłowe

2.1. Czytaj punkt 1 wink.gif
codeine
Zaimplementowałem już część odpowiedzialną za użytkowników i dodawanie oraz edycje projektów. Jednak by kontynuować potrzebuje już tabel w bazie dotyczących podzespołów i elementów oraz odpowiednich zależności pomiędzy tymi tabelami.
(Każdy projekt zawiera wiele podzespołów. Każdy podzespół zawiera wiele elementów... - pierwszy post - obrazek)

Biorąc pod uwagę podpowiedź CuteOne utworzyłem następującą bazę danych:
  1. CREATE TABLE konstruktorzy
  2. (
  3. email varchar(40) NOT NULL PRIMARY KEY,
  4. imie char(20) NOT NULL,
  5. nazwisko char(30) NOT NULL,
  6. haslo char(30) NOT NULL
  7. ) type=InnoDB;
  8.  
  9. CREATE TABLE projekty
  10. (
  11. nr_proj int UNSIGNED NOT NULL PRIMARY KEY,
  12. nazwa_proj char(30) NOT NULL,
  13. konstruktor_proj char(80) REFERENCES konstruktorzy(email),
  14. status_proj char(4),
  15. notka_proj text,
  16. plik_proj text,
  17. d_rozp_proj date NOT NULL,
  18. d_mod_proj date NOT NULL,
  19. d_zak_proj date NOT NULL
  20. ) type=InnoDB;
  21.  
  22. CREATE TABLE podzespoly
  23. (
  24. nr_podz int UNSIGNED NOT NULL PRIMARY KEY,
  25. nazwa_podz char(30) NOT NULL,
  26. konstruktor_podz char(80) REFERENCES konstruktorzy(email),
  27. status_podz char(4),
  28. notka_podz text,
  29. plik_podz text,
  30. d_rozp_podz date NOT NULL,
  31. d_mod_podz date NOT NULL,
  32. d_zak_podz date NOT NULL
  33. ) type=InnoDB;
  34.  
  35. CREATE TABLE elementy
  36. (
  37. nr_elem int UNSIGNED NOT NULL PRIMARY KEY,
  38. nazwa_elem char(30) NOT NULL,
  39. konstruktor_elem char(80) REFERENCES konstruktorzy(email),
  40. status_elem char(4),
  41. notka_elem text,
  42. plik_elem text,
  43. d_rozp_elem date NOT NULL,
  44. d_mod_elem date NOT NULL,
  45. d_zak_elem date NOT NULL
  46. ) type=InnoDB;
  47.  
  48. CREATE TABLE ppe
  49. (
  50. nr_proj int UNSIGNED NOT NULL REFERENCES projekty(nr_proj),
  51. nr_podz int UNSIGNED NOT NULL REFERENCES podzespoly(nr_podz),
  52. nr_elem int UNSIGNED NOT NULL REFERENCES elementy(nr_elem),
  53. PRIMARY KEY(nr_proj, nr_podz, nr_elem)
  54. ) type=InnoDB;
  55.  
  56.  
  57. INSERT INTO konstruktorzy VALUES
  58. ('r@o2.pl', 'Robert', 'Małys', sha1('rrr')),
  59. ('m@o2.pl', 'Adam', 'Adamski', sha1('mmm')),
  60. ('a@o2.pl', 'Aleksander', 'Broniek', sha1('aaa')),
  61. ('b@o2.pl', 'Bartosz', 'Cieszyński', sha1('bbb')),
  62. ('c@o2.pl', 'Cyprian', 'Dromad', sha1('ccc'));
  63.  
  64. INSERT INTO projekty VALUES
  65. (1000, 'podnosnik', 'Małys', '66%', 'projekt wykonania podnośnika', NULL, '2010-01-21', '2010-01-27', '2010-02-19'),
  66. (2000, 'statecznik', 'Adamski', '10%', 'projekt wykonania statecznika', NULL, '2011-03-23', '2011-04-11', '2011-05-10'),
  67. (3000, 'silnik', 'Broniek', '12%', 'projekt wykonania silnika', NULL, '2010-02-02', '2010-02-17', '2010-02-20');
  68.  
  69. INSERT INTO podzespoly VALUES
  70. (100, 'ramie', 'Adamski', '4%', 'podzespoly wykonywane', NULL, '2001-01-21', '2001-01-18', '2001-02-20'),
  71. (200, 'cylinder', 'Broniek', '56%', 'podzespoly wykonywane', NULL, '2003-03-23', '2004-04-11', '2004-05-11'),
  72. (300, 'podstawa', 'Dromad', '78%', 'podzespoly wykonywane', NULL, '2006-02-02', '2008-02-17', '2009-02-20');
  73.  
  74. INSERT INTO elementy VALUES
  75. (10, 'śruba', 'Adamski', '4%', 'elementy wykonywane', NULL, '2001-01-21', '2001-01-13', '2001-02-20'),
  76. (20, 'pręt', 'Broniek', '56%', 'elementy wykonywane', NULL, '2003-03-23', '2004-01-11', '2004-05-11'),
  77. (30, 'oś', 'Dromad', '77%', 'elementy wykonywane', NULL, '2006-02-02', '2008-02-17', '2009-02-25'),
  78. (40, 'pierścień', 'Małys', '25%', 'elementy wykonywane', NULL, '2001-01-21', '2001-03-18', '2005-07-24'),
  79. (50, 'hak', 'Cieszyński', '13%', 'elementy wykonywane', NULL, '2005-05-11', '2004-08-11', '2004-09-13'),
  80. (60, 'kulka', 'Broniek', '67%', 'elementy wykonywane', NULL, '2007-04-02', '2008-02-17', '2009-02-20');
  81.  
  82. INSERT INTO ppe VALUES
  83. (1000, 100, 10),
  84. (1000, 100, 20),
  85. (1000, 100, 30),
  86. (1000, 100, 40),
  87. (1000, 100, 50),
  88. (1000, 100, 60),
  89. (1000, 200, 10),
  90. (1000, 200, 20),
  91. (1000, 200, 30),
  92. (1000, 300, 40),
  93. (1000, 300, 10),
  94. (2000, 200, 20),
  95. (2000, 200, 30),
  96. (3000, 100, 60),
  97. (3000, 100, 50),
  98. (3000, 200, 50),
  99. (3000, 300, 50),
  100. (3000, 300, 10);
Coś tu chyba jest nieprawidłowo utworzone...
Być może źle zadaje pytania bazie, ale chcąc uzyskać wyniki otrzymuję nieprawidłowe informacje...
Np
  1. SELECT nazwisko, nazwa_elem, nazwa_podz, nazwa_proj FROM elementy, podzespoly, projekty, konstruktorzy WHERE nazwisko='Broniek'
Zamiast wyników: silnik, cylinder, pręt, kulka otrzymuje wypisane wszystkie elementy, podzespoły i projekty.
Albo chcąc uzyskać informacje o nazwie elementu i jego numerze gdzie nr_projektu=3000 i nr_podzespołu=300 piszę:
  1. SELECT nr_elem, nazwa_elem FROM elementy, ppe WHERE nr_proj='3000' AND nr_podz='300'
uzyskuje błędne wyniki bo wypisuje wszystkie elementy zamiast tylko: 10 śruba, 50 hak

Czy wogóle tak skonstruowana baza ma sens? Czy może powinna być zlikwidowana tabela "ppe". Wtedy nr_proj i nr_podz dałbym do tabeli elementy. A do tabeli podzespoly dałbym nr_proj i odpowiednio podpiął bym do tych wierszy klucze obce wskazujące na tabele nadrzędne.
CuteOne
Nie dziwota, że takie cuda wychodzą gdy nie ma się nawet podstawowej wiedzy na temat MySQL. Mały przykład:
  1. SELECT pod.nazwa_podzespolu, pro.nazwa_proj FROM podzespoly pod, projekty pro WHERE pro.projekt_nazwa='projekcik' AND pro.projekt_id = pod.projekt_id

W ten sposób łączysz ze sobą kilka tabel i pobierasz z nich to co chcesz
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.