Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql][php] PDO i uaktualnianie ilości podczas UPDATE?
luis2luis
post 27.09.2017, 11:52:24
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Witam.
Stawiam pierwsze kroki z PDO.

Posiadam taką podstawoiwą klase, któa obsługuje mi zapytania w przyjemniejszy sposób.

U mnie wygląda to tak:

  1.  
  2.  
  3. $db = new DB;
  4. $db->setParameters($dbhost, $dbname, $dbuser, $dbpass);
  5. $db->setTablePrefix($dbprefix);
  6. $db->setCharset('utf8');
  7.  
  8.  
  9. $db->addValue('ilosc', "ilosc-$odejmij_ilosc", PDO::PARAM_STR); // tutaj poytrzebuje odjąc wartość
  10. $db->addValue('pole_A', $zmienna, PDO::PARAM_INT);
  11. $db->addValue('pole_B', $zmienna, PDO::PARAM_INT);
  12. $db->addValue('ID', $zmienna_ID, PDO::PARAM_INT);
  13.  
  14. $db->update("tabela","ID"); //uaktualniamy wg pola ID


Teraz moja klasa:

  1. class DB {
  2.  
  3. private static $sqlQueryValues = array();
  4.  
  5.  
  6. public static function update($table, $kol_klucz){
  7. try {
  8. $sqlQuery = "update ".self::$dbSettings["table_prefix"].$table." set ";//aktualizacja_ceny=now(),
  9. foreach (self::$sqlQueryValues as $row){
  10. $sqlQuery .= $row["field"]." = :".$row["field"].",";
  11. }
  12. $sqlQuery = substr($sqlQuery, 0, strlen($sqlQuery)-1);
  13. $sqlQuery .= " where $kol_klucz = :$kol_klucz ";//DODALEM LIMIT limit 1
  14. $stmt = DB::getInstance()->prepare($sqlQuery);
  15. foreach (self::$sqlQueryValues as $row){
  16. $stmt->bindParam(":".$row["field"], $row["value"], (int)$row["type"]);
  17. }
  18. $stmt->execute();
  19.  
  20. $stmt = null;
  21. self::$sqlQueryValues = null;
  22.  
  23. return true;
  24.  
  25. } catch(PDOException $e){
  26. echo '<br><hr size=2 color=red><span style="color: red;">błąd update MySQL:<br><b>'.$e->getMessage().'</b> <br>MySQL: <i>'.$sqlQuery.'</i></span><hr size=1 color=red>';
  27.  
  28. $stmt = null;
  29. self::$sqlQueryValues = null;
  30.  
  31. return false;
  32. }
  33.  
  34. }
  35.  
  36.  
  37.  
  38. public static function addValue($field, $value, $type){
  39. self::$sqlQueryValues[]=array(
  40. "field" => $field,
  41. "value" => $value,
  42. "type" => $type
  43. );
  44. }
  45. }


Problmeme jest to, że zapis nie funkcjonuje: $db->addValue('ilosc', "ilosc-$odejmij_ilosc", PDO::PARAM_STR);
Jak korzystałem ze zwykłych zapytań SQL w mysqli to taki zapis funckonował. Teraz dostrzegłem też, że jest PDO::PARAM_STR . W polu tym mogą też być liczby dziesiętne, więc PDO::PARAM_INT


Jak zrobić, aby $odejmij_ilosc odejmowało się od obecnej liczby w bazie danych.

Go to the top of the page
+Quote Post
nospor
post 27.09.2017, 11:58:56
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




wyrazen matematycznych sie nie binduje

nie: ilosc = :ilosc
a: ilosc = ilosc - 5
Od biedy jak chcesz to mozesz zbindowac 5 a nie cale wyraznie "ilosc -5"


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

"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
luis2luis
post 27.09.2017, 14:01:09
Post #3





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(nospor @ 27.09.2017, 12:58:56 ) *
wyrazen matematycznych sie nie binduje

nie: ilosc = :ilosc
a: ilosc = ilosc - 5
Od biedy jak chcesz to mozesz zbindowac 5 a nie cale wyraznie "ilosc -5"



Czyli musze dorobić drugi rodzaj Parametrów definiowanych np tak:

  1. $db->addValueBezBind('ilosc', ilosc-$odejmij_ilosc);


a w kodzie
w takim przytpadku zmaiast:

  1. $stmt->bindParam(":".$row["field"], $row["value"], (int)$row["type"]);


wklejam prosto do zapytania $sqlQuery do sekcji SET ilosc = ilosc-5 ?

Ten post edytował luis2luis 27.09.2017, 14:09:18
Go to the top of the page
+Quote Post
nospor
post 27.09.2017, 14:08:21
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Nom, cos w ten desen. Tylko miej litosc i nie mieszaj polskiego z angielskim.

No i to:
$db->addValueBezBind('ilosc', ilosc-$odejmij_ilosc);
zakladam, ze to literowka tylko? Powinno byc
$db->addValueBezBind('ilosc', "ilosc-$odejmij_ilosc");


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

"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
viking
post 27.09.2017, 14:10:23
Post #5





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

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


Tylko po co? Jak sam widzisz najprostszy niestandardowy sposób użycia i twoja "biblioteka" leży. Po co to robić skoro jest bardziej skomplikowane niż czyste PDO? Masz pełno gotowych, całkiem niezłych ORMów w których to 100x lepiej zostało zaprojektowane. Jeszcze wszędzie te static i echo w catch.

Ten post edytował viking 27.09.2017, 14:11:39


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 27.09.2017, 14:11:05
Post #6





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(nospor @ 27.09.2017, 15:08:21 ) *
Nom, cos w ten desen. Tylko miej litosc i nie mieszaj polskiego z angielskim.

No i to:
$db->addValueBezBind('ilosc', ilosc-$odejmij_ilosc);
zakladam, ze to literowka tylko? Powinno byc
$db->addValueBezBind('ilosc', "ilosc-$odejmij_ilosc");

Tak literówka, będzie w cudzysłowie.

Mma problemwłaśnie z tym rozdziąłem na Angielski, Polski. W pewnym okresie mojego programowania zacząłem wprowadząc Polskie nazwy, teraz od tego odchodze.

Dziękuje za pomoc.


Cytat
Tylko po co? Jak sam widzisz najprostszy niestandardowy sposób użycia i twoja "biblioteka" leży. Po co to robić skoro jest bardziej skomplikowane niż czyste PDO? Masz pełno gotowych, całkiem niezłych ORMów w których to 100x lepiej zostało zaprojektowane.


Rzeczywiście, nie jest to zbyt optymalna sprawa. Kiedys zakupilem od kogoś skrypt, wtedy jeszcze nie znałem PDO, zacząłem prace z PDO i wzorowąłem się na tym skrypcie. Nie jest to idealna sprawa cały czas pojawiaj się nowe ograniczenia, jednak czysty PDO wydaje mi się że za każdym razem musze powielać sporo kodu.

Jakie ORM'y masz na mysli? Bawiąłme isę kiedyśz różnymi klasami do obsługio zapytań PDO, jednak były poteżne kilkaset KB, wydawało mi się to niepotrzebne obciążanie skryptu, tybardziej ,ze to klasa, czyli wszystko wskakuje do Pamięci serwera.

Ten post edytował luis2luis 27.09.2017, 14:16:03
Go to the top of the page
+Quote Post
viking
post 27.09.2017, 14:22:19
Post #7





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

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


Propel, Doctrine, Eloquent, Adodb, Zend\Db i cała lista. Są oczywiście też proste nakładki na PDO, wystarczy poszukać na github. No i co z tego że "potężne"? Nie wysyłasz tych danych do klienta za każdym razem tylko przetwarzasz po stronie serwera.


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 27.09.2017, 14:38:14
Post #8





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(viking @ 27.09.2017, 15:22:19 ) *
Propel, Doctrine, Eloquent, Adodb, Zend\Db i cała lista. Są oczywiście też proste nakładki na PDO, wystarczy poszukać na github. No i co z tego że "potężne"? Nie wysyłasz tych danych do klienta za każdym razem tylko przetwarzasz po stronie serwera.


Troszeczke obawiam się takich rozwiązań. Kiedyś już postawiłęm na system szabonów RainTPL, który już nie jest wspierany i jest lekko mówiąc lipa.

Obawiam się, że takie jedno czy drugie rozwązanie nie bedzie wspierane, wejdą zmiany w PHP i bede w tyle, alebo znowu mase siedzenia żeby przemigrować na inne rozwiązanie.
Go to the top of the page
+Quote Post
viking
post 27.09.2017, 14:42:17
Post #9





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

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


Drugi raz słyszę o raintpl, pierwszy był przy okazji innego twojego wątku wink.gif Skoro postawiłeś na coś tak niszowego to nie ma się co dziwić. Na początek zacznij korzystać z composera. Popularny ORm to ciągłe poprawki - także w zabezpieczeniach.


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 28.09.2017, 11:04:29
Post #10





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 25.11.2015

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


Dziekuje Panowie, ża pomoc i nakierowanie do dalszego kierunku nauki smile.gif
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: 28.03.2024 - 19:41