Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]MySQL setters i getters
sadistic_son
post
Post #1





Grupa: Zarejestrowani
Postów: 1 495
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. }


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
sadistic_son
post
Post #2





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

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


Ok, to ProductList wkleiłem wyżej a tutaj największy burdel - ProductAdd. Zaznaczam, że jeszcze tutaj jest zupełnie przed czyszczeniem tych klas - używają $_POST wewnątrz, nie ma konstruktorów, setter/getter itd. Nie ma wszędzie typowania zmiennych czy tego co ma zwracać metoda. To wszystko do poprawienia jeszcze.
  1. namespace nameOne;
  2. use Product;
  3.  
  4. class ProductAdd extends Product
  5. {
  6. private $db;
  7.  
  8. public function __construct($db){
  9. $this->$db = $db;
  10. }
  11.  
  12. public function listProperties()
  13. {
  14. $properties = $this->getDistinctProperties();
  15. return $properties;
  16. }
  17.  
  18. private function getDistinctProperties()
  19. {
  20. // $db = new DB();
  21. $this->db->query("SELECT DISTINCT type FROM property ORDER BY type ASC");
  22. $results = $this->db->resultSet();
  23. return $results;
  24. }
  25.  
  26. public function listFullProperties()
  27. {
  28. $properties = $this->getFullProperties();
  29. return $properties;
  30. }
  31. private function getFullProperties()
  32. {
  33. // $db = new DB();
  34. $this->db->query("SELECT * FROM property ORDER BY type ASC");
  35. $results = $this->db->resultSet();
  36. return $results;
  37. }
  38.  
  39. public function groupFullProperties(): array
  40. {
  41. $properties = array();
  42. foreach ($this->getFullProperties() as $row) {
  43. $property = $row['property'];
  44.  
  45. $newProperty = $row['type'];
  46. if (!isset($properties[$newProperty])) {
  47. $properties[$newProperty] = array();
  48. }
  49. $properties[$newProperty][] = [
  50. 'id' => $row['id'],
  51. 'property' => $property,
  52. 'label' => $row['label'],
  53. 'description' => $row['description']
  54.  
  55. ];
  56.  
  57. }
  58. return $properties;
  59. }
  60.  
  61. public function checkExistingSKU(string $skuToCheck)
  62. {
  63. // $db = new DB();
  64. $this->db->query("SELECT sku FROM product WHERE sku = :sku");
  65. $this->db->bind(':sku', $skuToCheck);
  66.  
  67. if ($this->db->single()) {
  68. return true;
  69. }
  70. return false;
  71. }
  72.  
  73.  
  74. public function insertNewProduct()
  75. {
  76.  
  77. if ($this->ensureNoEmpytValues() === false)
  78. return false;
  79.  
  80. // $db = new DB();
  81.  
  82. $sku = $this->sku;
  83. $productName = $this->productName;
  84. $price = $this->price;
  85. $selectedType = $this->productType;
  86.  
  87.  
  88.  
  89. $properties = $this->groupFullProperties();
  90.  
  91.  
  92. foreach ($properties[$selectedType] as $propertyData) {
  93. $postIndex = $propertyData['property'];
  94. if (empty($_POST[$postIndex]))
  95. return false;
  96. }
  97. $queryInsertProduct = "INSERT INTO `product` (`id`, `sku`, `name`, `price`, `type`) VALUES (null, :sku, :productName , :price, :selectedType)";
  98. $this->db->query($queryInsertProduct);
  99. $this->db->bind(':sku', $sku);
  100. $this->db->bind(':productName', $productName);
  101. $this->db->bind(':price', $price);
  102. $this->db->bind(':selectedType', $selectedType);
  103.  
  104. $this->db->execute();
  105.  
  106. $lastProductId = $this->db->lastInsertId();
  107.  
  108. foreach ($properties[$selectedType] as $propertyData) {
  109.  
  110. $propertyId = (int) $propertyData['id'];
  111. $productValue = $_POST[(string) $propertyData['property']];
  112.  
  113. $queryInsertProductProperty = "INSERT INTO `product_property` (`id`, `product_id`, `property_id`, `value`) VALUES (null, $lastProductId , $propertyId, :productValue )";
  114. $this->db->query($queryInsertProductProperty);
  115. $this->db->bind(':productValue', $productValue);
  116.  
  117. $this->db->execute();
  118. }
  119.  
  120.  
  121. }
  122.  
  123. }


No i Product.php. Jednak coś tam robi. Nawet zapomniałem, że to napisałem.
  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. }




EDIT:

Cytat(nospor @ 12.01.2023, 13:14:44 ) *
Gorzej juz nie bedzie pokazuj, a potrzebuje tego by widziec co z tym $db dalej robic

No dobra, tu masz blad
$productObject = new ProductAdd($db);

przeciez nie $db a $this->db

$productObject = new ProductAdd($this->db);

zakladam ze z produktList jest podobnie

A no tak, przecież $db to ona jest w index, a wewnątrz klasy to już jest $this->db (IMG:style_emoticons/default/smile.gif)
Lecę na zakupy na obiad i za 45 minut zabieram się za porządkowanie tego bałaganu. Czy w międzyczasie byłbyś uprzejmy mi z grubsza opisać jak naprawić konstrukcję tej strony, żeby choć przypominała jakiś wzorzec projektowy? W którym miejscu najlepiej porobić setter/getter żeby wykazać że wiem o co w nich chodzi (wymóg projektu)? Jest tu jakaś klasa z której można zrobić abstrakcyjną i byloby to uzasadnione?

Ten post edytował sadistic_son 12.01.2023, 13:20:29
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 Aktualny czas: 11.10.2025 - 09:59