Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql][php] PDO i uaktualnianie ilości podczas UPDATE?
luis2luis
post
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
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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"
Go to the top of the page
+Quote Post
luis2luis
post
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
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
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");
Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
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
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
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
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
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
Post #9





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Drugi raz słyszę o raintpl, pierwszy był przy okazji innego twojego wątku (IMG:style_emoticons/default/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
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 19:38