Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql][php] PDO i uaktualnianie ilości podczas UPDATE?
Forum PHP.pl > Forum > Bazy danych
luis2luis
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.

nospor
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"
luis2luis
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 ?
nospor
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");
viking
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.
luis2luis
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.
viking
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.
luis2luis
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.
viking
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.
luis2luis
Dziekuje Panowie, ża pomoc i nakierowanie do dalszego kierunku nauki smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.