Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

4 Stron V  « < 2 3 4  
Reply to this topicStart new topic
> [PHP]MySQL setters i getters
nospor
post 13.01.2023, 15:42:28
Post #61





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




  1.  
  2. public function listGroupedProducts(): array
  3. {
  4. $products = array();
  5. foreach ($this->getProducts() as $row) {
  6.  
  7.  
  8. if (!isset($products[$row['prodId']])) {
  9. $product = new Product();
  10. $product->setProductName($row['name']);
  11. $product->setSku($row['sku']);
  12. $product->setPrice($row['price']);
  13. $product->setProductId($row['sku']);
  14. $product->setProductId($row['prodId']);
  15.  
  16. $products[$row['prodId']] = $product;
  17.  
  18. }
  19. if (!empty($row['value'])) {
  20. $products[$row['prodId']]->addProperty($row['value'], $row['label']);
  21. }
  22.  
  23. }
  24. return $products;
  25. }


I w klasie Product dopisz metode
addProperty(string $value, string $label)

ktora bedzie dodawala kolekne property do tablicy properties produktu
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post 13.01.2023, 16:05:23
Post #62





Grupa: Zarejestrowani
Postów: 1 468
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Cytat(nospor @ 13.01.2023, 15:42:28 ) *
ktora bedzie dodawala kolekne property do tablicy properties produktu
Wybacz, ale nie rozumiem jak ta metoda ma wyglądać. O tej godzinie to w ogóle już mało rozumiem sad.gif

To masz na myśli?
  1. public function addProperty(string $value, string $label)
  2. {
  3. $this->setProperties(['value' => $value, 'label' => $label]);
  4. }


Ten post edytował sadistic_son 13.01.2023, 16:10:35


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
nospor
post 13.01.2023, 16:17:05
Post #63





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




masz ddoac a nie nadpisac.


....
private array $properties = [];

...


public function addProperty(string $value, string $label): void {
$this->properties[] = [
'value' => $value,
'label' => $label
];
}


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post 13.01.2023, 16:19:06
Post #64





Grupa: Zarejestrowani
Postów: 1 468
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


No tak. Oczywiste... sad.gif
Ech, czas na dłuższą przerwę bo już nie myslę...
Dzięki za pomoc nospor. Liczę, że dziś wieczorem wyślę projekt (lub jutro rano, bo cała noc przede mnąwink.gif).


Hej, pytanie stricte z typu "co autor miał na myśli" smile.gif I tutaj chciałbym się dowiedzieć jak ty nospor uważasz - czy biorąc pod uwagę poniższe:
""Logika MySQL powinna być obsługiwana przez obiekty z właściwościami, zamiast bezpośrednich wartości kolumn. Proszę użyć setters i getters aby to osiągnąć oraz nie zapomnieć użyć ich do zapisu i wyświetlania logiki."
to można uznać, że spełniam warunek (poniżej) posługiwania sie getter/setter przy zapisie?
  1. if (isset($_POST['save']) && isset($_POST['sku']) && isset($_POST['name']) && isset($_POST['price']) && isset($_POST['productType'])) {
  2. $product = new Product();
  3. $product->setProductName($_POST['name']);
  4. $product->setSku($_POST['sku']);
  5. $product->setPrice($_POST['price']);
  6. $product->setProductType($_POST['productType']);
  7.  
  8. $productObject = new ProductAdd($this->db);
  9. if (!$productObject->checkExistingSKU($product->getSku())) {
  10. $productObject->insertNewProduct($product);
  11. }
  12.  
  13. /*
  14. oraz w innym pliku metoda insertNewProduct, a przynajmniej jej kawałek, bez większości bebechów
  15. */
  16.  
  17. public function insertNewProduct(Product $product)
  18. {
  19. if ($this->ensureNoEmpytValues($product) === false)
  20. return false;
  21.  
  22. $sku = $product->getSku();
  23. $productName = $product->getProductName();
  24. $price = $product->getPrice();
  25. $selectedType = $product->getProductType();
  26.  
  27. // tutaj pętal forach - nie ważne
  28.  
  29. $queryInsertProduct = "INSERT INTO `product` (`id`, `sku`, `name`, `price`, `type`) VALUES (null, :sku, :productName , :price, :selectedType)";
  30. $this->db->query($queryInsertProduct);
  31. $this->db->bind(':sku', $sku);
  32. $this->db->bind(':productName', $productName);
  33. $this->db->bind(':price', $price);
  34. $this->db->bind(':selectedType', $selectedType);
  35. $this->db->execute();
  36.  
  37. $lastProductId = $this->db->lastInsertId();


Przed wywołaniem metody do zapisu są settery. W ciele metody do zapisu są gettery. No to chyba spełniam to wymaganie przy zapisie, co? Jeśli też tak to rozumiesz to (chyba) skończyłem... smile.gif


Ten post edytował sadistic_son 13.01.2023, 17:52:31


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
nospor
post 13.01.2023, 18:26:36
Post #65





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




no chyba tak

Tylko ne tworz takich cudow
$sku = $product->getSku();

przeciez mozsesz od razu:
$this->db->bind(':sku', $product->getSku());


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post 23.01.2023, 11:32:36
Post #66





Grupa: Zarejestrowani
Postów: 1 468
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Cytat(nospor @ 13.01.2023, 18:26:36 ) *
Tylko ne tworz takich cudow
$sku = $product->getSku();

przeciez mozsesz od razu:
$this->db->bind(':sku', $product->getSku());
Tak, teraz będe się właśnie takich rzeczy pozbywać, wywalać moje komentarze, wszelkie echo 'dupa' i var dumpy wywalać, itp, itd. Ale to już można po kolacji przy piwku wink.gif I wysyłam. Dzięki wielkie za nieoceniona pomoc!


Hej, tak jeszcze jedna rzecz mi nie daje spokoju w moim kodzie. Metoda powinna dostać dane z POST w parametrze, a u mnie w jednym przypadku tak nie jest i metoda dostaje $_POST w ciele funkcji. Dzieje się to tutaj: if (empty($_POST[$propertyData['property']])) oraz tutaj: $this->db->bind(':productValue', $_POST[(string) $propertyData['property']]);
Nie wiem jak przekazać do parametru tą wartość POST, bo nie znam jej indeksu - jest pobierany z bazy na podstawie wypełnionych pól i wybranej wartości z SELECT. Czy powienienm poniższy fragmencik wkomponować w wywołanie metody?
  1. $properties = $this->groupFullProperties();
  2. foreach ($properties[$product->getProductType()] as $propertyData) {
  3. if (empty($_POST[$propertyData['property']]))
  4. return false;
  5. }



Metodę wywołuję tak:
  1. if (isset($_POST['save']) && isset($_POST['sku']) && isset($_POST['name']) && isset($_POST['price']) && isset($_POST['productType'])) {
  2. $product = new Product();
  3. $product->setProductName($_POST['name']);
  4. $product->setSku($_POST['sku']);
  5. $product->setPrice($_POST['price']);
  6. $product->setProductType($_POST['productType']);
  7. $productObject = new ProductAdd($this->db);
  8. if (!$productObject->checkExistingSKU($product->getSku())) {
  9. $productObject->insertNewProduct($product);
  10. }
  11. header("Location:http://" . PRODUCT_LIST_LANDING);
  12. }



Tutaj kawałek klasy z omawianą metodą:
  1. public function insertNewProduct(Product $product)
  2. {
  3. if ($this->ensureNoEmpytValues($product) === false)
  4. return false;
  5. $properties = $this->groupFullProperties();
  6. foreach ($properties[$product->getProductType()] as $propertyData) {
  7. if (empty($_POST[$propertyData['property']]))
  8. return false;
  9. }
  10. $this->db->query("INSERT INTO `product` (`id`, `sku`, `name`, `price`, `type`) VALUES (null, :sku, :productName, :price, :selectedType)");
  11. $this->db->bind(':sku', $product->getSku());
  12. $this->db->bind(':productName', $product->getProductName());
  13. $this->db->bind(':price', $product->getPrice());
  14. $this->db->bind(':selectedType', $product->getProductType());
  15. $this->db->execute();
  16. $lastProductId = (int) $this->db->lastInsertId();
  17. foreach ($properties[$product->getProductType()] as $propertyData) {
  18. $propertyId = $propertyData['id'];
  19. $this->db->query("INSERT INTO `product_property` (`id`, `product_id`, `property_id`, `value`) VALUES (null, $lastProductId, $propertyId, :productValue )");
  20. $this->db->bind(':productValue', $_POST[(string) $propertyData['property']]);
  21. $this->db->execute();
  22. }
  23.  


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
nospor
post 23.01.2023, 14:29:26
Post #67





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Oj chyba sie zgubilem. O co dokladnie pytasz?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post 23.01.2023, 15:38:19
Post #68





Grupa: Zarejestrowani
Postów: 1 468
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Chodzi mi o to, że:

W formularzu mam pole select z którego wybieram rodzaj produktu. Jak jest to np mebel to pojawiają się inputy dla wysokości, szerokości i długości. Dla dvd pojawia się rozmiar (MB), itd. Teraz wywołując metodę $productObject->insertNewProduct($product); podaję jej jako parametr obiekt $product w którym to za pomocą getterów mam ustawione wartości pozostałych inputów, ale bez tych dodawanych dynamicznie (szerokośc, wysokość, rozmiar itd - $_POST['width'] itd) bo w momencie wywoływania tej metody nie wiem jeszcze które z inputów zostały poprzez select dodane do formularza. Dowiaduję się tego dopiero wewnątrz metody, poprzez odwołanie bezpośrednio do $_POST[$propertyData['property']] tworzonego w forach (spójrz na kod powyżej). I traz moje pytanie to - jak mam przekazać w parametrze to $_POST['width'] (albo $_POST['size'] albo dowolne inne wysłane) przy wywołaniu insertNewProduct($product) zamiast wrzucać je w ciele metody?

Czy powinienem poniższy kawałek (który obecnie jest tylko w ciele medoty insertNewProduct) równierz wykonywać przy sprawdzeniu czy w ogóle wywowłać insertNewProduct?

  1. $properties = $this->groupFullProperties();
  2. foreach ($properties[$product->getProductType()] as $propertyData) {
  3. if (!empty($_POST[$propertyData['property']])) //wywołaj insertNewProduct
Oczywiście trzeba ten kawałek zmodyfikować by dodawał do obiektu $product też tablicę zawierającą $_POST[$propertyData['property']].

Ten post edytował sadistic_son 23.01.2023, 15:42:24


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
nospor
post 23.01.2023, 15:49:46
Post #69





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Poprostu do metody przekaz caly $_POST i po sprawie.
Normalnie bys przekazal obiekt Request jak cie prosilem tyle razy, ale ze nie napisales to przekazuj caly $_POST


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post 23.01.2023, 17:14:43
Post #70





Grupa: Zarejestrowani
Postów: 1 468
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


No ok, ale co w tej klasie Request miałoby być? Nie napisałem jej, bo kiedy dopytywałem o czyszczenie POST to mi doradziłeś, że wystarczy bindowanie do bazy oraz htmlspecialchars do wyświetlania POST wystarczy. Oraz pisałeś też że czyszczeni POST powinno być w oddzielnej klasie właściwie. Więc nie mam pomysłu jak ta klasa w ogóle ma wyglądać i po co być.

Coś w TYM stylu? Wiem, że to sprzed 11 lat...

Ten post edytował sadistic_son 23.01.2023, 17:17:07


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
viking
post 23.01.2023, 17:55:01
Post #71





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Dawałem ci wcześniej linki do klas na github. Nie możesz zajrzeć i zobaczyć co w nich jest? Na tym też polega programowanie. Patrzeć jak piszą lepsi.


--------------------
Go to the top of the page
+Quote Post
nospor
post 24.01.2023, 09:50:03
Post #72





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Nie napisałem jej, bo kiedy dopytywałem o czyszczenie POST to mi doradziłeś, że wystarczy bindowanie do bazy oraz htmlspecialchars do wyświetlania POST wystarczy. Oraz pisałeś też że czyszczeni POST powinno być w oddzielnej klasie właściwie.

No ale to nie moja wina ze sie zafiksowales na tym czyszczeniu i nie czytales co sie do ciebie innego pisze.

Pisalem ci wyraznie, ze w Request na poczatek masz mie getPost() getGet() getByKey() getUri
takie podstawowe metody ktore zwracaja rzeczy ktorych uzywasz z request.

Inni, jak juz viking wspomnial, tez podawali ci linki do przykladowych klas. Takze nie, nikt ci tutaj nie doradzal bys rezygnowal z klasy Request.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

4 Stron V  « < 2 3 4
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 Wersja Lo-Fi Aktualny czas: 19.04.2024 - 16:19