![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Cześć, zmagam się z pewnym zadaniem, ze z góry narzuconymi regułami. W skrócie to mały, prosty sklepik internetowy, który w całości ma powstać obiektowo. Programowanie proceduralne dozwolone jest tylko do zainicjowania klas. I jedno z wymagań mówi aby unikać konstrukcji warunkowych (if-else oraz switch) do radzenia sobie z różnicami w produktach. Jako że obiektowo programować dopiero się uczę, to nie wiem czy jest może jakieś oczywiste rozwiązanie pozwalające na nieużywanie warunków.
Załózmy, że mam w bazie tabelę PRODUKT z takimi kolumnami oraz danymi: Kod ID | name | typ| MB | ilosc_stron | szerokosc | wysokosc | glebokosc 1 | tetris | dvd | 128 | 0 | 0 | 0 | 0 2 | bilbia | ksiazka | 0 | 1256 | 0 | 0 | 0 3 | stol | mebel | 0 | 0 | 90 | 200 | 60 Jak wdać mam 3 typy produktów (DVD, ksiazka, mebel) i w zależności od tego jaki to typ to odpowiednie kolumny są wypełnione - MB dla dvd, ilosc_stron dla ksiazki i wymiary dla mebli. Zresztą w oddzielnym temacie pytam czy dobrze rozumuję, że tak właśnie powinna baza pod ten cel wyglądać. W każdym razie jak teraz rozróżnić inne akcje do działania na książce, dvd czy meblu kiedy nie mogę zastosować if-else czy switch ? Dzięki. Ten post edytował sadistic_son 15.12.2022, 10:36:08 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Co do bazy to jak pisalem w innym temacie jest zla no ale wracajac do pytania, to jak najbardziej mozna nie uzywac akruat tutaj IF czy switch. Wystarczy stworzyc tabele w php mowiaca, dla jakiego typu wypelnic jakie tabele
I teraz majac typ, pobhierasz z tablicy pola ktore cie interesuja
I juz. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Odkopuję(IMG:style_emoticons/default/smile.gif)
Ileż ja się naszukałem tego tematu - 3 strony przedszkola przeczesałem ze 4 razy, zanim sobie przypomniałem, że tutaj (PHP|OOP) jest ten post. @nospor - czyli coś w tym stylu (pisane na szybko z palca) to powinno być? O to ci chodzi? EDIT: Nie no, bez sensu. TO co dałem powyżej to jest źle. Chwila, musze pomyśleć.... Ten post edytował sadistic_son 9.01.2023, 12:42:26 |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Nie
Zdaje sie masz leciec tylko po tym co podal w select xz forma Nazewnictwo pozatym jak zwykle do 4 liter.... foreach ($types['select z forma'] as $wlasciwosci) { I tu petla po $wlasciwosci i sobie pobierasz z POST te wlasciwosci } I przenosze. Jakic cudem to na OOP siedzi jeszcze |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Dobra, a więc uaktualniając temat, to baza wygląda tak:
Kod products: id | name | type 1 | Krzyzacy | book 2 | Rambo | dvd 3 | Table | furniture property: id | type | propoerty 1 | book | weight 2 | dvd |size 3 | furniture | height 4 | furniture | width 5 | furniture | lenght product_propoerty: id | product_id | propoerty_id | value 1 | 1 | 1 | 0.5 (Krzyzacy | weight | 0.5 ) 2 | 2 | 2 | 650 (Rambo | size | 650 ) 3 | 3 | 3 | 60 (Table | height | 60) 4 | 3 | 4 | 90 (Table | width | 90) 5 | 3 | 5 | 180 (Table | lenght | 180) I teraz takie coś: Dobrze rozumuję nospor, biorąc pod uwagę twoje sugestie? Ten post edytował sadistic_son 9.01.2023, 13:25:27 |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Nie, totalnei zle.
Zapomnij o tym if (isset($_POST['size'])) $givenProperties['size'] = $_POST['size']; if (isset($_POST['weight'])) $givenProperties['weight'] = $_POST['weight']; if (isset($_POST['width'])) $givenProperties['width'] = $_POST['width']; if (isset($_POST['height'])) $givenProperties['height'] = $_POST['height']; if (isset($_POST['length'])) $givenProperties['length'] = $_POST['length']; Przeciez ty nei wiesz ze jest property height, width size czy jakakowliek inna. Te dane sa w bazie. A to $types = array('book' => 'weight', 'dvd' => 'size', 'furniture' => array('width', 'height', 'lenght')); porownaj sobie jak wygladalo zbudowane przeze mnie w pierwszym poscie. przeciez ja tam dalem wszedzie tablice, nawet na jeden element, a ty sobie radosnie tablice zamienies na teksty.... I jak juz porownasz to wowczas ta tablice $types ma byc zbudowana na podstawie danych w bazie. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Wtakim razie tak?
I jak juz porownasz to wowczas ta tablice $types ma byc zbudowana na podstawie danych w bazie. Yyyyy, muszę pomyśleć jak to zrobić.
|
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Yyyyy, muszę pomyśleć jak to zrobić. Przeciez juz to robiles przynajmniej dwa razy. GRUPOWANIE DANYCH. TO jest dokladnie to co masz zrobic by zbudowac te tablice |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Tak, na to wpadłem, po fajeczce się za to zabiorę. A czy mój powyższy kod (pomijając tworzenie tablicy) to dobra droga?
Nie ma zabezpieczenia przed sytuacją gdzie user poda typ 'dvd' a do niego wagę oraz wysokość. Ale do tego wrócę jak już w ogóle wrzucanie do bazy będzie działać. Ten post edytował sadistic_son 9.01.2023, 13:52:59 |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
No ale ciagle jest zle bo cialge nie czytasz co do ciebie pisze oraz nei raczysz przenaluizowac.
Przeciez ci mowilem, ze w types masz tablice wlasciwosci a ty ciagle FOREACH piszesz jaby tam byl jeden element nie foreach ($types[$selectedType] as $propertyIndex => $propertyValue) { a foreach ($types[$selectedType] as $propertyIndex => $PROPERTIES) { i $PROPERTIES to tablica wiec ma byc jescze jeden FOREASCH po PROPERTIES. Nie kaz mi tego pisac po raz 10ty prosze |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
No dobra, dotarło. Czyli teraz tak...
To moja funkcja zwracająca pogrupowane properties: Ona zwraca tablicę wyglądającą tak: Kod Array Ja stąd potrzebuję jedynie 'properties', czyli tablicę która będzie wyglądać tak:( [Book] => Array ( [0] => Array ( [property] => weight [label] => Weight (kg) [description] => Please provide the weight of book in kg. ) ) [DVD] => Array ( [0] => Array ( [property] => size [label] => Size (MB) [description] => Please provide size of DVD in MB. ) ) [Furniture] => Array ( [0] => Array ( [property] => width [label] => Width (cm) [description] => Please provide dimentions in WxHxL format. ) [1] => Array ( [property] => height [label] => Height (cm) [description] => Please provide dimentions in WxHxL format. ) [2] => Array ( [property] => length [label] => Length (cm) [description] => Please provide dimentions in WxHxL format. ) ) ) Wygląda nieco inaczej niż to co podałeś, ale myślę, że warto użyć już istniejącej metody zamiast pisać nową, robiącą niemalże to samo (don't repeat yourself (IMG:style_emoticons/default/wink.gif) ). Teraz kod realizujący dodawanie. Na razie bezczelnie wrzucam input od usera, bez czyszczenia POST, bez bindowania, itd. No i teraz problem jest taki, że user może wpisać dane dla innego typu, np poda typ 'dvd' ale wpisze właściwości dla mebla (wysokość, szerokość). Tak więc produkt w takim przypadku nie powinien się w ogóle dodawać (pierwszy insert). Do pętli go wrzucić nie mogę, bo nie ważne ile jest właściwości properties, to produkt musi się dodać tylko raz. Jakieś sugestie jak z tego wybrnąć? |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Dobra, widze ze chyba ja wczesniej pojechalem bez sensu..
Ale od poczatku Do tych danych [property] => width [label] => Width (cm) [description] => Please provide dimentions in WxHxL format. Dodaj jeszcze property_id Po grzyba masz potem w petli latac po to id, skoro mozesz je miec od razu A potem petla:
Zainetersuj sie BINDowaniem bo przykro sie patrzy na te inserty (IMG:style_emoticons/default/wink.gif) Cytat No i teraz problem jest taki, że user może wpisać dane dla innego typu, np poda typ 'dvd' ale wpisze właściwości dla mebla (wysokość, szerokość). Tak więc produkt w takim przypadku nie powinien się w ogóle dodawać (pierwszy insert). Do pętli go wrzucić nie mogę, bo nie ważne ile jest właściwości properties, to produkt musi się dodać tylko raz. Jakieś sugestie jak z tego wybrnąć? No i co z tego ze wypelni inne pola? Ty z post w petli bierzesz tylko pola z danego typu a nie wszystkie |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
[property] => width No racja, bez sensu SELECTy mnożyć, skoro dane są na wyciągnięcie ręki. Dodane.[label] => Width (cm) [description] => Please provide dimentions in WxHxL format. Dodaj jeszcze property_id Po grzyba masz potem w petli latac po to id, skoro mozesz je miec od razu Pętelka działa cacy. Dzięki. Zainetersuj sie BINDowaniem bo przykro sie patrzy na te inserty (IMG:style_emoticons/default/wink.gif) Tak, mam już gdzieniegdzie nawet pokomentowane bindowanie zapytań. Ale jeszcze słabo to ogarniam (choć to nie jest nic nadzwyczajnego), więc jak kod będzie działać, to wtedy dodam bindowanie.No i co z tego ze wypelni inne pola? Ty z post w petli bierzesz tylko pola z danego typu a nie wszystkie No dla product_properties tak jest jak mówisz. Ale zauważ, że najpierw trzeba dodac produkt, żeby znać jego ID. I to realizują linijki 6-8 z mojego kodu wyżej. A nie można wrzucić tego w pętlę do sprawdzenia czy typ istnieje w tablicy typów, no bo produkt ma się dodać tylko raz - wynika to z bazy, na której konstrukcję sam mnie naproawdziłeś TUTAJ. |
|
|
![]()
Post
#14
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat No dla product_properties tak jest jak mówisz. Ale zauważ, że najpierw trzeba dodac produkt, żeby znać jego ID. I to realizują linijki 6-8 z mojego kodu wyżej. A nie można wrzucić tego w pętlę do sprawdzenia czy typ istnieje w tablicy typów, no bo produkt ma się dodać tylko raz - wynika to z bazy, na której konstrukcję sam mnie naproawdziłeś TUTAJ. No bo prawidlowo najpierw sie robi walidacje wszystkiego, czy wszystko jest ok itp a dopiero potem sie robi dodawanie. Ty nie masz zadnej walidacji, to jest jak jest |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem, że walidacja jest niezbędna, tylko jak ją zrobić bez użycia konstrukcji warunkowych, bez ifów czy switchy? Jak bez tego mam sprawdzić czy to co user wysłał POSTem jest ok z tym co mam w bazie? Musiałbym na jakiejś zasadzie sprawdzić czy wartość z selecta (dvd, book, furniture) jest w tablicy wypełnionych inputów tekstowych, ale i tutaj nie mam pomysłu jak to zrobić bez warunków, czy to przy użyciu in_array, czy array_search itd.
Ten post edytował sadistic_son 9.01.2023, 22:53:36 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 73 Dołączył: 15.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
Poczytaj o klasie Validatora.
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Trochę jest tych klas w wynikach google. Np. TO mnie zainteresowało. Ale to zwaliduje poprawność wpisania danych jak sobie założymy, np. odpowiedni format. Nadal nie rozumiem jak uniknąć konstrukcji warunkowych do porównania inputu z bazą.
Ten post edytował sadistic_son 10.01.2023, 07:25:17 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 73 Dołączył: 15.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
Tutaj masz paczkę Validatora od Symfony: https://symfony.com/doc/current/components/validator.html
Jak się dobrze wczytasz w dokumentację, to trafisz w końcu na typ `Choice`: https://symfony.com/doc/current/reference/c...nts/Choice.html A teraz poskładaj klocki w całość i działaj. |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Tutaj masz paczkę Validatora od Symfony: https://symfony.com/doc/current/components/validator.html Jak się dobrze wczytasz w dokumentację, to trafisz w końcu na typ `Choice`: https://symfony.com/doc/current/reference/c...nts/Choice.html A teraz poskładaj klocki w całość i działaj. Doceniam Twoją pomoc i naprowadzenie mnie, a wręcz podanie rozwiązania niemalże na tacy. Ale niestety mam w projekcie narzucone jasno: "czyste klasy, żadnych frameworków, podejście OOP". Nie mogę użyć komponentów Symfony (IMG:style_emoticons/default/sad.gif) Ten post edytował sadistic_son 10.01.2023, 09:15:49 |
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat tylko jak ją zrobić bez użycia konstrukcji warunkowych, bez ifów czy switchy? Troche za bardzo bierzesz to co miales napisane. Bez ifow to miales znalezc wlasciwe pola z POSTa i to juz masz. A zeby zrobic walidacje to nei da sie nie uzywac IFow i tyle. Wiec nie odlatuj za bardzo (IMG:style_emoticons/default/wink.gif) Najlepiej by bylo jakbys do swoich wlasciwosci w bazie dodal jeszcze info o type danych jakie tam mozna wpisac: INT, FLOAT, TEXT i na tej podstawie mozna dokladniej walidowac dane. A jesli nie chcesz tego dodawac to sprawdzaj chociaz czy to nie jest puste Czylu majac swoja tablice properties, lecisz foreach po properties i sprawdzasz empty($_POST[$postIndex]). Jesli ktores jest empty to walisz message i nie przechodzisz do dodawania i cala walidacja. 5 minut roboty. Mozesz jeszcze dodac walidacje na nazwe produktu itp. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.09.2025 - 09:43 |