Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: użycie klasy dodającej wartość do killku baz danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
tomek_swat
witam,
Problem jest tego typu, że w projekci, który teraz piszę muszę współpracować z kilkoma bazami danych, spróbuję opisać to na przykładzie.
Mam główną bazę danych w niej znajduję się pewna liczba sklepów (poprzez odpowiedni formularz, użytkownik może w każdej chwili dodać kolejny sklep)
Teraz na podstawie zapytania pobieramy sklepy i wyświetlamy je w postaci checkboxów użytkownikowi, który dodając produkt ma możliwość wybrania do
których sklepów ma zostać dodany dany produkt.
Problem, który nie wiem jak rozwiązać polega na tym jak w klasie produkt rozpoznać, które sklepy zostały wybrane i połączyć się z bazą danych odzielną dla
każdego sklepu by do wybranych sklepów dodać produkt?

Obecny kod klasy Product:

  1. <?php
  2.    define('DIR_MAIN', '../../');
  3.    require_once(DIR_MAIN.'common.php');
  4.    
  5.    require_once('interfaces/itemOperations.php');
  6.  
  7.    class Product extends Item implements itemOperations {
  8.        
  9.        public static function addItem(){
  10.            
  11.            global $dsn, $user, $passwd;
  12.            
  13.            if($_SERVER['REQUEST_METHOD'] == 'POST'){
  14.            try
  15.    {    
  16.                $db = new PDO($dsn,$user,$passwd);
  17.                
  18.                $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19.                
  20.                $query = $db->prepare('INSERT into `produkt` (`idjezyka`, `idkategorii`, `idprod`, `nazwap`, `kopisp`,
  21.                                        `dopisp`, `plikp`, `cena`, `popis`, `pkluczowe`, `popisid`)
  22.                                VALUES (:idjezyka, :idkategorii, :idprod, :nazwap, :kopisp, :dopisp, :plikp, :cena, :popis,
  23.                                    :pkluczowe, :popisid)');
  24.                
  25.                $query->bindValue(':idjezyka', $_POST['idjezyka'], PDO::PARAM_INT);
  26.                $query->bindValue(':idkategorii', $_POST['idkategorii'], PDO::PARAM_INT);
  27.                $query->bindValue(':idprod', $_POST['idprod'], PDO::PARAM_INT);
  28.                $query->bindValue(':nazwap', $_POST['nazwap'], PDO::PARAM_STR);
  29.                $query->bindValue(':kopisp', $_POST['kopisp'], PDO::PARAM_STR);
  30.                $query->bindValue(':dopisp', $_POST['dopisp'], PDO::PARAM_STR);
  31.                $query->bindValue(':plikp', $_POST['plikp'], PDO::PARAM_STR);
  32.                $query->bindValue(':cena', $_POST['cena'], PDO::PARAM_INT);
  33.                $query->bindValue(':popis', $_POST['popis'], PDO::PARAM_STR);
  34.                $query->bindValue(':pkluczowe', $_POST['pkluczowe'], PDO::PARAM_STR);
  35.                $query->bindValue(':popisid', $_POST['popisid'], PDO::PARAM_INT);
  36.                
  37.                $count = $query->execute();
  38.                
  39.                $idp = $db->lastInsertId();
  40.                
  41.                foreach($_POST['sklep'] as $ids){
  42.                    $ids = (int) $ids;
  43.                    
  44.                    if($ids){                
  45.                        $q = $db->prepare('INSERT into `asortyment` (`idproduktu`, `idsklepu`) VALUES ('.$idp.','.$ids.') ');
  46.                        $c = $q->execute();
  47.                    }
  48.                }
  49.                
  50.                }
  51.    catch(PDOException $e)
  52.    {
  53.        echo 'Wystąpił błąd biblioteki PDO: ' . $e->getMessage();
  54.    }
  55.                
  56.                }
  57.            else {
  58.                addProduct();
  59.            }
  60.            
  61.        }
  62.        
  63.        public static function deleteItem($idItem){
  64.            
  65.            global $dsn, $user, $passwd;
  66.            
  67.            $db = new PDO($dsn,$user,$passwd);
  68.                $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  69.                
  70.                $brand = $db -> exec('DELETE FROM produkt where idproduktu = '.$idItem.' ');
  71.                
  72.                header('Location: ../../www/secure/index.php');
  73.            
  74.        }
  75.        
  76.        
  77.    }
  78.    
  79. ?>


przy dodawaniu widoczna jest jeszcze tabela asortyment, która pełni rolę magazynu.
Skąd wiedzieć ile i z którymi bazami przyporządkowanymi do poszczególnych sklepów, nawiązać połączenie i dodać produkt?
pzdr
Mize
Hmm, czy to nie jest czasem średnio bezpieczne ? tongue.gif

  1. <?php
  2. global $dsn, $user, $passwd;
  3.        
  4. $db = new PDO($dsn,$user,$passwd);
  5. ?>


Hmm, napisałem własną klasę do obsługi bazy danych itp.
Może ten kodzik Cię naprowadzi.

  1. <?php
  2. $Config->Load('DB.ini');
  3.  
  4. $DB = $Loader->loadClass('dfDB', true, false);
  5.  
  6. $DB->createConnection('First_Connection', $Config->getProperty('DB_HOST'), $Config->getProperty('DB_PORT'), $Config->getProperty('DB_USER'), $Config->getProperty('DB_PASSWD'));
  7.  
  8. $DB->createConnection('Second_Connection', $Config->getProperty('DB_HOST'), $Config->getProperty('DB_PORT'), $Config->getProperty('DB_USER'), $Config->getProperty('DB_PASSWD'));
  9.  
  10. $DB->setActiveConnection('First_Connection');
  11.  
  12. { ...Jakies operacje... }
  13.  
  14. $DB->setActiveConnection('Second_Connection');
  15.  
  16. { ...Operacje na innej bazie... }
  17. ?>


Wrzucić to w pętle i laczysz sie pokolei z bazami.

Pozdrawiam.
tomek_swat
prosiłbym jeszcze o parę wskazówek co do w/w problemu, problem jak skorzystaszłeś z kilku konfiguracji do połączenia z bazą,
mój kod, którego używam do łączenia:
  1. <?php
  2. class Connect {
  3.        
  4.        public static $dbType = null;
  5.        public static $dbHost = null;
  6.        public static $dbPort = null;
  7.        public static $dbName = null;
  8.        public static $dbUser = null;
  9.        public static $dbPasswd = null;
  10.  
  11.        public static function getDbType(){
  12.               if(self::$dbType === null){
  13.                 self::$dbType = Config::getInstance()->getProperty("dbType");
  14.           }
  15.           return self::$dbType;
  16.     }
  17.    
  18.         public static function getDbHost(){
  19.             if(self::$dbHost === null){
  20.                 self::$dbHost = Config::getInstance()->getProperty("dbHost");
  21.             }
  22.         return self::$dbHost;
  23.         }
  24.        
  25.         public static function getDbPort(){
  26.             if(self::$dbPort === null){
  27.                 self::$dbPort = Config::getInstance()->getProperty("dbPort");
  28.             }
  29.         return self::$dbPort;
  30.         }
  31.        
  32.         public static function getDbName(){
  33.             if(self::$dbName === null){
  34.                 self::$dbName = Config::getInstance()->getProperty("dbName");
  35.             }
  36.         return self::$dbName;
  37.         }
  38.        
  39.         public static function getDbUser(){
  40.             if(self::$dbUser === null){
  41.                 self::$dbUser = Config::getInstance()->getProperty("dbUser");
  42.             }
  43.         return self::$dbUser;
  44.         }
  45.        
  46.         public static function getDbPasswd(){
  47.             if(self::$dbPasswd === null){
  48.                 self::$dbPasswd = Config::getInstance()->getProperty("dbPasswd");
  49.             }
  50.         return self::$dbPasswd;
  51.         }
  52.    }
  53. ?>


klasa Config to singleton, który parsuję podobnie jak u Ciebie pliki .ini?
pzdr
Mize
Nie korzystam z singleton'u. Wykorzystuje coś na ten wzór.

  1. <?php
  2. /*
  3. *
  4. * Loader to obiekt, który laduje pliki/klasy/widoki/controllery/modele.
  5. * Ulatwia pracę, aczkolwiek nie jestem pewien czy to najlepsze rozwiazanie.
  6. *
  7. */
  8.  
  9. $Context = $Loader->loadClass('dfContext');
  10. $Loader->setContext($Context);
  11.  
  12. $Config = $Loader->loadClass('dfConfig');
  13. $Context->setConfig($Config);
  14.  
  15. /*
  16. *
  17. * Loader ladując klase automatycznie tworzy jej instancję i constructorem przekazuje jej Context.
  18. * Metoda loadClass posiada dwa argumenty, jeden sprawdza czy ma zostac utworzona instancja, a drugi czy przekazac Context.
  19. * Wszystkie klasy poza Context, dziedzicza po klasie Component, która posiada metody setContext() i getContext().
  20. *
  21. */
  22. ?>


Przykład użycia...

  1. <?php
  2. ...
  3.  
  4. public function Dispatch() {
  5.  
  6.   ...
  7.  
  8.   $Loader = $this->getContext()->getLoader();
  9.  
  10.   ...
  11.  
  12. }
  13.  
  14. ...
  15. ?>


A co to ładowania configuracji.
Klasa Config ma metody, które ładuja pliki .ini, .php oraz dynamiczną konfigurację z bazy danych.
Ładując plik .ini automatycznie nadpisuje wartości, którę już sie pojawiły.
Może to wada, ale na razie mi nie przeszkadza.

Kiedyś korzystałem z klasy Registry, która była singleton'em, ale zrezygnowałem z tego, ponieważ burzy to szczelność całego programu.
Rejestr był dostępny w wielu miejscach, w których nie powinien.

Pozdrawiam.
tomek_swat
ok wymyśliłem sobie coś takiego tylko mi nie chce działać nie wiedzieć czemu?
  1. <?php
  2.  
  3.    define('DIR_MAIN', '../../');
  4.    define('DIR_SETTINGS', DIR_MAIN.'data/');
  5.    
  6.    require_once(DIR_MAIN.'common.php');
  7.    
  8.    class ChooseDB {
  9.        
  10.        private $dbConfigFile;
  11.        private $data = array();
  12.        
  13.        public __construct($dbConfigFile){
  14.            $this->dbConfigFile = $dbConfigFile;
  15.        }
  16.        
  17.        public function getProperty($name){
  18.            
  19.            $this->data = parse_ini_file(DIR_SETTINGS.'DB.sklep'.$this->dbConfigFile.'.php');
  20.            
  21.            if(!isset($this->data[$name])){
  22.                echo 'błąd!';
  23.            }
  24.            
  25.            return $this->data[$name];
  26.        }
  27.                
  28.    }
  29.    
  30. ?>


następnie sprawdzam, tablicę pochodzącą z checkboxów i na jej podstawie wywołuje ChooseDB, tworzę obiekt PDO i wrzucam,
tyle tylko, że nie pojawia się nic w tej drugiej bazie

  1. <?php
  2. foreach($_POST['sklep'] as $ids){
  3.                    $ids = (int) $ids;
  4.                    
  5.                    if($ids){                
  6.                        $q = $db->prepare('INSERT into `asortyment` (`idproduktu`, `idsklepu`) VALUES ('.$idp.','.$ids.') ');
  7.                        $c = $q->execute();
  8.                        
  9.                        $db = new ChooseDB($ids);
  10.                        $dbType = $db->getProperty("dbType");
  11.                        $dbHost = $db->getProperty("dbHost");
  12.                        $dbPort = $db->getProperty("dbPort");
  13.                        $dbName = $db->getProperty("dbName");
  14.                        $dbUser = $db->getProperty("dbUser");
  15.                        $dbPasswd = $db->getProperty("dbPasswd");
  16.                        
  17.                        $dbDsn = $dbType.':'.'host='.$dbHost.';'.'dbname='.$dbName.';'.$dbPort;
  18.                                                
  19.                        $pdo = new PDO($dbDsn,$dbUser,$dbPasswd);
  20.                        
  21.                        $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  22.                
  23.                $q = $pdo->prepare('INSERT into `produkt` (`idjezyka`, `idkategorii`, `idprod`, `nazwap`, `kopisp`,
  24.                                        `dopisp`, `plikp`, `cena`, `popis`, `pkluczowe`, `popisid`)
  25.                                VALUES (:idjezyka, :idkategorii, :idprod, :nazwap, :kopisp, :dopisp, :plikp, :cena, :popis,
  26.                                    :pkluczowe, :popisid)');
  27.                
  28.                $q->bindValue(':idjezyka', $_POST['idjezyka'], PDO::PARAM_INT);
  29. .....
  30. ?>
Mize
Pierwsze co się rzuca w oczy to, że za każdym wywołaniem metody getPorperty() parsujesz na nowo plik.
Po drugie Twoj pliki .ini musi mieć opowiednie rozszerzenie.
tomek_swat
tak wiem jak parsować pliki *.ini i jaką one powinny mieć budowę, już działa ta moja klasa, może nie najlepsza ale na chwilę obecną
na tyle mnie stać, może jakieś sugestie jak ją poprowadzić?
mam jeszcze tylko jeden problem ponieważ tablica POST['sklep'] jest wypełniona ale produkt i tak dodaje się tylko do pierwszej bazi tylko raz do tabeli asortyment?
pzdr
Mize
Na pewno jest wypełniona ?

Spróbuj tak...

  1. <?php
  2. var_dump($_POST['sklep']);
  3. ?>


I zobacz co zwraca.
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.