Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Bindowanie - czy dobrze to robię?
sadistic_son
post 10.01.2023, 11:38:00
Post #1





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

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


Cześć.
Mam taką metodę bind w klasie DB:
  1. namespace nameOne;
  2.  
  3. class DB
  4. {
  5. private $dbh;
  6. private $stmt;
  7.  
  8. public function __construct()
  9. {
  10. $this->dbh = new \PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
  11. }
  12.  
  13. public function bind($param, $value, $type = null)
  14. {
  15. if (is_null($type)) {
  16. switch (true) {
  17. case is_int($value):
  18. $type = \PDO::PARAM_INT;
  19. break;
  20. case is_bool($value):
  21. $type = \PDO::PARAM_BOOL;
  22. break;
  23. case is_null($value):
  24. $type = \PDO::PARAM_NULL;
  25. break;
  26. default:
  27. $type = \PDO::PARAM_STR;
  28. }
  29. }
  30. $this->stmt->bindValue($param, $value, $type);
  31. }
  32. }

W formularzu przesyłam checkboxy, wszystkie z tej samej tablicy, powiedzmy name="boxChecked[]".

I teraz chcę usunąć te rekordy z bazy w których ID mam przesłane w $_POST['boxChecked']

Robię to tak:
  1. private function massDelete(array $recordsIds)
  2. {
  3. $db = new DB();
  4. foreach ($recordsIds as $row) {
  5. $row = (int) $row;
  6. $db->query("DELETE FROM `product_property` WHERE `product_property`.`product_id` = :id;");
  7. $db->bind(':id', $row);
  8. $db->execute();
  9.  
  10. $db->query("DELETE FROM `product` WHERE `product`.`id` = :id;");
  11. $db->bind(':id', $row);
  12. $db->execute();
  13. }
  14. }
  15.  
  16. //w innym miejscu wywołanie metody:
  17. if (isset($_POST['mass_delete_submit']) && isset($_POST['boxChecked'])) {
  18. $this->massDelete($_POST['boxChecked']);
  19. }
Ten kod działa.
Moje pytanie: Czy to jest po bożemu zrobione? Czegoś brakuje? Z tego co się orientuję to dane z POST z checkboxa to tablica stringów, więc typowanie na int by sie przydało w metodzie massDelete, tak? Czy to >>> $row = (int) $row; wystarczy?


--------------------
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
trueblue
post 10.01.2023, 12:02:38
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Nie wiem czy masz założone więzy integralności na tych dwóch tabelach, ale gdyby były to wystarczy usuwanie produktu - dzięki więzom integralności zostaną usunięte właściwości bez potrzeby usuwania ich po stronie PHP.
Zamiast pętli for zastosowałbym usuwanie z użyciem klauzuli IN i bez użycia metody bind - id i tak masz integer.


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 10.01.2023, 12:13:55
Post #3





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

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


Cytat(trueblue @ 10.01.2023, 12:02:38 ) *
Nie wiem czy masz założone więzy integralności na tych dwóch tabelach, ale gdyby były to wystarczy usuwanie produktu - dzięki więzom integralności zostaną usunięte właściwości bez potrzeby usuwania ich po stronie PHP.
Rozumiem. Nie porobiłem więzów integralności. Ale to moje niedopatrzenie. A gdyby były to wystarczy że wykonam drugie zapytanie (usuwanie z `product`) a zapytanie pierwsze wykona się samo po stronie serwera mysql?


Cytat(trueblue @ 10.01.2023, 12:02:38 ) *
bez użycia metody bind - id i tak masz integer.
No w sumie racja.

Cytat(trueblue @ 10.01.2023, 12:02:38 ) *
Zamiast pętli for zastosowałbym usuwanie z użyciem klauzuli IN
Np tak?
Kod
delete from t
where id in (1, 4, 6, 7)
O to Ci chodziło? W sumie chyba jest to bardziej wydajne niż oddzielne zapytania per iteracja pętli.

Ten post edytował sadistic_son 10.01.2023, 12:15:58


--------------------
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
trueblue
post 10.01.2023, 12:16:52
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Tak.
Tak. Sprawdź jednak czy każde id jest integer, powinno być, ale nie musi.

Ten post edytował trueblue 10.01.2023, 12:18:08


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 10.01.2023, 12:27:14
Post #5





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

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


Ok, dzięki.
Tylko jeszcze trzeba wtedy te IDki z checkboxa jakoś wyczyścić. Czy to tak może być?
  1. private function massDelete(array $recordsIds)
  2. {
  3. $db = new DB();
  4. $idsToDel = '';
  5. $i = 1;
  6. foreach ($recordsIds as $row) {
  7. $row = (int) $row;
  8. $idsToDel .= $row;
  9. if (count($recordsIds) != $i) {
  10. $idsToDel .= ',';
  11. }
  12. $i++;
  13. }
  14. $query = "DELETE FROM `product_property` WHERE `product_property`.`product_id` IN ($idsToDel)";
  15. $db->query($query);
  16. //$db->bind(':id', $row); bindowanie już zbędne, bo mamy INTy, tak?
  17. $db->execute();


--------------------
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
trueblue
post 10.01.2023, 12:36:53
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Dopisałem w poście wcześniejszym (do tego jest array_filter).
Dlaczego foreach? Od tego jest implode.


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 10.01.2023, 12:49:41
Post #7





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

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


Cytat(trueblue @ 10.01.2023, 12:36:53 ) *
Dopisałem w poście wcześniejszym (do tego jest array_filter).
Tutaj w tym temacie? Wybacz , ale nie dopisałeś wink.gif

Cytat(trueblue @ 10.01.2023, 12:36:53 ) *
Dlaczego foreach? Od tego jest implode.
A no racja. Prościej. Dzięki!

EDIT:
Ale chwila. A jak teraz ma wyglądać upewnienei się, że mam same INTy w wartościach do bazy?
  1. private function massDelete(array $recordsIds)
  2. {
  3. $db = new DB();
  4. $idsToDel = implode(',',$recordsIds);
  5.  
  6. $db->query("DELETE FROM `product_property` WHERE `product_property`.`product_id` IN ($idsToDel)");
  7. $db->execute();
  8.  
  9. $db->query("DELETE FROM `product` WHERE `product`.`id` IN ($idsToDel)");
  10. $db->execute();
  11.  
  12. }


EDIT2: myślę, że tak będzie dobrze:
  1. $idsToDel = implode(", ", array_map('intval', $recordsIds));
Zgadza się?

Ten post edytował sadistic_son 10.01.2023, 12:55:53


--------------------
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
trueblue
post 10.01.2023, 12:56:22
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Cytat(sadistic_son @ 10.01.2023, 12:49:41 ) *
Tutaj w tym temacie? Wybacz , ale nie dopisałeś wink.gif

Dopisałem w poście #4.

Cytat(sadistic_son @ 10.01.2023, 12:49:41 ) *
Ale chwila. A jak teraz ma wyglądać upewnienei się, że mam same INTy w wartościach do bazy?

A o tym w poście #6.


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 10.01.2023, 12:59:38
Post #9





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

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


Ok, wszystko jasne. Ale array_map też robi robotę smile.gif
Dzięki za pomoc.


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

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: 27.04.2024 - 17:33