Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]MySQL setters i getters
sadistic_son
post 10.01.2023, 14:47:37
Post #1





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

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


Cześć.
Walczę z kolejnym wymogiem projektu nad którym siedzę.
"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."
Póki co to nie użyłem setter/getter. Pokażcie proszę na przykładzie mojego poniższego kodu jak to powinno być zastosowane.

Klasa Produkt
  1. class Product
  2. {
  3.  
  4. public $productName;
  5. public $sku;
  6. public $price;
  7. public $productType;
  8. public function __construct()
  9. {
  10. $this->productName = isset($_POST['name']) ? (string) $_POST['name'] : null;
  11. $this->sku = isset($_POST['sku']) ? (string) $_POST['sku'] : null;
  12. $this->price = isset($_POST['price']) ? (float) $_POST['price'] : null;
  13. $this->productType = isset($_POST['productType']) ? (string) $_POST['productType'] : null;
  14. }
  15.  
  16. function ensureNoEmpytValues()
  17. {
  18. if (empty($this->productName) || empty($this->sku) || empty($this->price) || empty($this->productType))
  19. return false;
  20. return true;
  21. }
  22. }


Kawałek klasy ProductAdd z metodą wrzucającą do bazy:
  1. <?php
  2. class ProductAdd extends Product
  3. {
  4. public function insertNewProduct()
  5. {
  6.  
  7. if ($this->ensureNoEmpytValues() === false)
  8. return false;
  9.  
  10. $db = new DB();
  11.  
  12. $sku = $this->sku;
  13. $productName = $this->productName;
  14. $price = $this->price;
  15. $selectedType = $this->productType;
  16.  
  17.  
  18. $properties = $this->groupFullProperties();
  19.  
  20. foreach ($properties[$selectedType] as $propertyData) {
  21. $postIndex = $propertyData['property'];
  22. if (empty($_POST[$postIndex]))
  23. return false;
  24. }
  25. $queryInsertProduct = "INSERT INTO `product` (`id`, `sku`, `name`, `price`, `type`) VALUES (null, :sku, :productName , :price, :selectedType)";
  26. $db->query($queryInsertProduct);
  27. $db->bind(':sku', $sku);
  28. $db->bind(':productName', $productName);
  29. $db->bind(':price', $price);
  30. $db->bind(':selectedType', $selectedType);
  31.  
  32. $db->execute();
  33.  
  34. $lastProductId = $db->lastInsertId();
  35.  
  36. foreach ($properties[$selectedType] as $propertyData) {
  37. $propertyId = (int) $propertyData['id'];
  38. $productValue = $_POST[(string) $propertyData['property']];
  39.  
  40. $queryInsertProductProperty = "INSERT INTO `product_property` (`id`, `product_id`, `property_id`, `value`) VALUES (null, $lastProductId , $propertyId, :productValue )";
  41. $db->query($queryInsertProductProperty);
  42. $db->bind(':productValue', $productValue);
  43.  
  44. $db->execute();
  45. }
  46. }
  47. }




--------------------
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
 
Start new topic
Odpowiedzi
nospor
post 12.01.2023, 12:50:37
Post #2





Grupa: Moderatorzy
Postów: 36 482
Pomógł: 6303
Dołączył: 27.12.2004




Cytat
Teraz na początku ProductList.view.php tworze obiekt $products = new ProductList($db)

$products powinno byc przekazane do ProductList.view.php a nie tworzone w ProductList.view.php

A jak tworzysz/owierasz ProductList.view.php ?

Cytat
W config natomiast nie mam żadnej klasy, tylko mam podefiniowane stałe do DB oraz include DB.php, Product.php oraz PageDisplay.php

Czemu w config tworzysz/zaciagasz DB i Product i PageDisplay?

No i skoro PageDisplay zarzadza caloscia, to $db masz przekazac do PageDisplay, to wtedy rzeczy w PageDisplay beda widziec $db. No to sa podstawy z Zasiegu Zmiennych
https://www.php.net/manual/en/language.variables.scope.php


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

"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 12.01.2023, 13:06:46
Post #3





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

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


Cytat(nospor @ 12.01.2023, 12:50:37 ) *
Czemu w config tworzysz/zaciagasz DB i Product i PageDisplay?
Tak mi się wydawało rozsądnie na bazie tego co przerobiłem ze wspomnianej nie raz książki, której przerobienia teraz żałuję. A gdzie mam wtedy zaciągać DB i PageDisplay (Product na razie powstało ale nic jeszcze nie robi sad.gif)? W index.php ?

Cytat(nospor @ 12.01.2023, 12:50:37 ) *
No i skoro PageDisplay zarzadza caloscia, to $db masz przekazac do PageDisplay, to wtedy rzeczy w PageDisplay beda widziec $db. No to sa podstawy z Zasiegu Zmiennych
https://www.php.net/manual/en/language.variables.scope.php
Zasięg zmiennych to jeszcze ogarniam. Chyba... :| Ale zaraz to się wyjaśnie jak opiszę moją strukturę.

Tak więc w index.php mam niewiele:
  1. use nameOne\PageDisplay;
  2. use nameOne\DB;
  3.  
  4.  
  5. require('pagefiles/config.php');
  6. $displayPage = new PageDisplay($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $db);
  7. $displayPage->decideOnContent();

w configu definuję stałe do DB (to dobre miejsce na to , tak?) oraz zaciągam DB.php oraz PageDisplay.php.


Teraz PageDisplay wg mojego założenia miała sprawdzać którą z dwóch podstron wybrano (liste produktów lub dodawanie produktu). W index.php ją wywołuję i przekazuję w parametrach $request oraz $db. Jeszcze nie zabrałem się za jej porządkowanie, więc wiem że idzie zwymiotować jak się na nią patrzy. Tak - zaciąga stałe a nie powinna, ma w sobie $_POST a powinna go dostać w parametrze. Wiem to wszystko już, i zamierzam ją oczyścić. A zacząłem od $db.
Wygląda ona tak:
  1. namespace nameOne;
  2.  
  3. class PageDisplay
  4. {
  5. private $request;
  6. private array $recordsIds;
  7. private $db;
  8.  
  9. public function __construct($request, $db)
  10. {
  11. $this->db = $db;
  12. $requestString = explode("?", $request);
  13. $this->request = $requestString[0];
  14. }
  15. public function decideOnContent()
  16. {
  17.  
  18. if (!$this->request) {
  19. return;
  20. }
  21.  
  22. switch ($this->request) {
  23. case PRODUCT_LIST_LANDING . '/':
  24. $title = 'Product List';
  25. $pageContent = "ProductList";
  26. include("ProductList.php");
  27. if (isset($_POST['mass_delete']) && isset($_POST['product_check'])) {
  28. $this->massDelete($_POST['product_check']);
  29. }
  30. break;
  31. case PRODUCT_ADD_LANDING:
  32. $title = 'Product Add';
  33. $pageContent = "ProductAdd";
  34. include("ProductAdd.php");
  35. if (isset($_POST['save']) && isset($_POST['sku'])) {
  36. $productObject = new ProductAdd($db);
  37. if (!$productObject->checkExistingSKU($_POST['sku'])) {
  38. $productObject->insertNewProduct();
  39. }
  40. header("Location:http://" . PRODUCT_LIST_LANDING);
  41. }
  42. break;
  43. default:
  44. $title = 'Product List';
  45. $pageContent = "ProductList";
  46. include("ProductList.php");
  47. break;
  48.  
  49. }
  50. $this->displayHeader($title);
  51. require('views/' . $pageContent . '.view.php');
  52. $this->displayFooter();
  53. }
  54.  
  55. public static function displayHeader($title)
  56. {
  57. require_once("views/html/header.html");
  58. }
  59.  
  60. public static function displayFooter()
  61. {
  62. require_once("views/html/footer.html");
  63.  
  64. }
  65.  
  66. //nie miałem pomysłu gdzie ta metoda ma być, czy jako oddzielna klasa, czy jak...
  67. private function massDelete(array $recordsIds)
  68. {
  69. $idsToDel = implode(", ", array_map('intval', $recordsIds));
  70.  
  71. $this->db->query("DELETE FROM `product_property` WHERE `product_property`.`product_id` IN ($idsToDel)");
  72. $this->db->execute();
  73.  
  74. $this->db->query("DELETE FROM `product` WHERE `product`.`id` IN ($idsToDel)");
  75. $this->db->execute();
  76.  
  77. }
  78.  
  79. }


Teraz jak widać switch decyduje o tym (poprzez include) która strona ma się wyświetlić. Nie wiem czy chcę się tutaj dzielić ProductAdd.php i ProductList.php bo tam to już jest kompletny p1erdolnik i mi wstyd :|


EDIT:
to moje ProductList.php
Chyba nie wygląda jeszcze, aż tak źle, żeby mnie postawić przed ścianą egzekucyjną.
  1. namespace nameOne;
  2.  
  3. class ProductList
  4. {
  5. private $db;
  6.  
  7. public function __construct($db){
  8. $this->db = $db;
  9. }
  10. public function listProducts()
  11. {
  12. $products = $this->getProducts();
  13.  
  14. return $products;
  15. }
  16.  
  17. private function getProducts(): array
  18. {
  19. // $db = new DB();
  20. $this->db->query("SELECT product.id prodId, product.sku, product.name, product.price, property.id, property.type, property.property, property.label, product_property.id, product_property.value FROM product_property INNER JOIN property ON product_property.property_id = property.id INNER JOIN product ON product_property.product_id = product.id ORDER BY product.id DESC
  21. ");
  22. $results = $this->db->resultSet();
  23. return $results;
  24. }
  25.  
  26. public function listGroupedProducts(): array
  27. {
  28. $products = array();
  29. foreach ($this->listProducts() as $row) {
  30.  
  31. $pid = $row['sku'];
  32. if (!isset($products[$pid])) {
  33. $products[$pid] = array('name' => $row['name'], 'price' => $row['price'], 'id' => $row['prodId'], 'properties' => array());
  34. }
  35. if (!empty($row['value'])) {
  36. $products[$pid]['properties'][] = array('value' => $row['value'], 'label' => $row['label']);
  37. }
  38. }
  39. return $products;
  40. }


Ten post edytował sadistic_son 12.01.2023, 13:13:47


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

Posty w temacie
- sadistic_son   [PHP]MySQL setters i getters   10.01.2023, 14:47:37
- - nospor   Ja nie wiem na kiedy masz to zrobic, ale warto by ...   10.01.2023, 15:29:26
|- - sadistic_son   Cytat(nospor @ 10.01.2023, 15:29:26 )...   10.01.2023, 16:52:15
- - nospor   No dobra, nie pozostalo w takim razie nic innego j...   10.01.2023, 16:55:20
|- - sadistic_son   Cytat(nospor @ 10.01.2023, 16:55:20 )...   12.01.2023, 12:18:56
- - nospor   CytatCzy jednak da się na to przymknąć oko u kogoś...   12.01.2023, 12:27:05
- - sadistic_son   W chwili obecnej moja klasa DB wygląda tak: [PHP] ...   12.01.2023, 12:46:01
- - nospor   CytatTeraz na początku ProductList.view.php tworze...   12.01.2023, 12:50:37
|- - sadistic_son   Cytat(nospor @ 12.01.2023, 12:50:37 )...   12.01.2023, 13:06:46
- - nospor   CytatNie wiem czy chcę się tutaj dzielić ProductAd...   12.01.2023, 13:14:44
- - sadistic_son   Ok, to ProductList wkleiłem wyżej a tutaj najwięks...   12.01.2023, 13:18:36
- - nospor   Jak pisalem wczesniej: nie $productObject = n...   12.01.2023, 13:27:24
|- - sadistic_son   Cytat(nospor @ 12.01.2023, 13:27:24 )...   12.01.2023, 14:05:55
- - nospor   napisz te setter dla Product tylko. CytatSerio je...   12.01.2023, 14:19:11
|- - sadistic_son   Cytat(nospor @ 12.01.2023, 14:19:11 )...   12.01.2023, 14:53:00
- - nospor   CytatCoś gdzieś po drodze spieprzyłem i nie potraf...   12.01.2023, 14:55:21
- - sadistic_son   Nic jeszcze nie zrobiłem, bo od godziny (odkąd pop...   12.01.2023, 15:07:40
- - nospor   Kurcze, ale ty nadal dziedziczysz po Produkt. A p...   12.01.2023, 15:08:48
|- - sadistic_son   Cytat(nospor @ 12.01.2023, 15:08:48 )...   12.01.2023, 15:14:03
- - nospor   Pokaz jak wyglada teraz ProductAdd i Product   12.01.2023, 15:17:59
- - sadistic_son   Product:[PHP] pobierz, plaintext <?php cla...   12.01.2023, 15:21:31
- - nospor   zmien private string $productName; na protec...   12.01.2023, 15:25:20
- - sadistic_son   Niestety to samo co wczesniej -Fatal error: Uncaug...   12.01.2023, 15:29:47
- - nospor   Cannot assign null to property Product::$prod...   12.01.2023, 15:32:11
- - sadistic_son   No tak, przypisywałem null do stringa, to jasne że...   12.01.2023, 15:56:05
- - nospor   Klase Produkt zostala ci zaproponowana wczesniej j...   12.01.2023, 16:01:51
- - sadistic_son   Ok, zaczynam chwytać. Nigdzie w żadnych artykułach...   12.01.2023, 16:05:54
- - nospor   Na te chwile moze.   12.01.2023, 16:08:24
- - sadistic_son   ok. To klasa Product nie ma mieć właściwie żadnych...   12.01.2023, 16:11:43
- - nospor   tak I jesli to juz bedzie oddzielna klasa i Produ...   12.01.2023, 16:14:00
- - sadistic_son   Ok, to to mi sporo wyjaśnia. Tego elementu mi chyb...   13.01.2023, 09:59:43
- - nospor   No obiekt, ale konkretnie obiekt PDO wiec pri...   13.01.2023, 10:04:00
|- - sadistic_son   Cytat(nospor @ 13.01.2023, 10:04:00 )...   13.01.2023, 10:15:34
- - nospor   Starasz sie o te nowa robote, ona wymaga samodziel...   13.01.2023, 10:20:17
|- - sadistic_son   Cytat(nospor @ 13.01.2023, 10:20:17 )...   13.01.2023, 10:33:15
- - viking   Poczytaj sobie https://prophp.pl/advice/show/14/ja...   13.01.2023, 10:20:55
- - nospor   $this->db->bind(':sku', $s...   13.01.2023, 10:44:30
- - sadistic_son   To z sku to tylko przykład wywołania metody bind. ...   13.01.2023, 10:49:29
- - nospor   W przykladach tutaj co podales zawsze jest NULL. A...   13.01.2023, 10:51:44
- - sadistic_son   O, i teraz się zrozumieliśmy. Dzięki za odpowiedź ...   13.01.2023, 10:59:04
- - nospor   Generalnie dobrze, ale nie tu $sku = $p...   13.01.2023, 11:00:53
- - sadistic_son   Tak tak, to dopisałem w poprzednim poście już jako...   13.01.2023, 11:29:25
- - nospor   Nie, konstruktor to przypadek szczegolny   13.01.2023, 11:31:13
- - sadistic_son   A co ma wskazywać typ zwracanych danych w przypadk...   13.01.2023, 11:34:10
- - viking   Jeszcze to sobie poczytaj: https://designpatternsp...   13.01.2023, 11:34:34
- - nospor   CytatA co ma wskazywać typ zwracanych danych w prz...   13.01.2023, 11:41:18
|- - Salvation   Cytat(nospor @ 13.01.2023, 11:41:18 )...   13.01.2023, 11:49:04
- - nospor   Jeszcze ani razu nie uzylem UNION w moich projekta...   13.01.2023, 11:59:36
- - sadistic_son   Dobra, rozumiem. ale w takim razie czemu np TUTA...   13.01.2023, 12:09:50
- - nospor   Metody PHP istnieja od wiekow, kiedy byla jeszcze ...   13.01.2023, 12:32:29
- - sadistic_son   Czyli bezczelnie przerabiamy string z PDO na int. ...   13.01.2023, 12:36:25
- - nospor   lastInsertId z PDO to metoda uniwersalna. Rozne si...   13.01.2023, 12:47:48
- - sadistic_son   Rozumiem. Dzięki. A wracając do setter/getter.....   13.01.2023, 12:58:57
- - nospor   listProducts wydaje sie zbedne, tak. Zas z ta log...   13.01.2023, 13:35:46
- - viking   W sumie zwracał CI już na to uwagę ale po co wprow...   13.01.2023, 13:52:53
|- - sadistic_son   Cytat(viking @ 13.01.2023, 13:52:53 )...   13.01.2023, 14:06:16
- - nospor   No pewnie listGroupedProducts powinna juz zwracac ...   13.01.2023, 14:27:13
- - sadistic_son   No dobra, to rozszerzyłem klasę Product o $pr...   13.01.2023, 15:10:55
- - nospor   array('name' => $productObject-...   13.01.2023, 15:21:00
- - sadistic_son   RE: [PHP]MySQL setters i getters   13.01.2023, 15:34:58
- - nospor   [PHP] pobierz, plaintext   public func...   13.01.2023, 15:42:28
|- - sadistic_son   Cytat(nospor @ 13.01.2023, 15:42:28 )...   13.01.2023, 16:05:23
- - nospor   masz ddoac a nie nadpisac. .... private array ...   13.01.2023, 16:17:05
- - sadistic_son   No tak. Oczywiste... Ech, czas na dłuższą przerwę...   13.01.2023, 16:19:06
- - nospor   no chyba tak Tylko ne tworz takich cudow ...   13.01.2023, 18:26:36
|- - sadistic_son   Cytat(nospor @ 13.01.2023, 18:26:36 )...   23.01.2023, 11:32:36
- - nospor   Oj chyba sie zgubilem. O co dokladnie pytasz?   23.01.2023, 14:29:26
- - sadistic_son   Chodzi mi o to, że: W formularzu mam pole select ...   23.01.2023, 15:38:19
- - nospor   Poprostu do metody przekaz caly $_POST i po s...   23.01.2023, 15:49:46
- - sadistic_son   No ok, ale co w tej klasie Request miałoby być? Ni...   23.01.2023, 17:14:43
- - viking   Dawałem ci wcześniej linki do klas na github. Nie ...   23.01.2023, 17:55:01
- - nospor   CytatNie napisałem jej, bo kiedy dopytywałem o czy...   24.01.2023, 09:50:03


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: 13.06.2024 - 23:52