Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-08-2013 16:01:22

poultier
Nouveau membre
Date d'inscription: 14-01-2012
Messages: 3

[ZF 1.10] UPDATE multidb [résolu]

Bonjour,

mon problème est le suivant :

je suis dans un environnement multi-base

toto.fr a un base de donnée toto
titi.fr à un base de donnée titi
etc...

aujourd'hui sur chaque site j'ai un module d' "administration" ou je mets à jours les tables base par base
taches longue car je dois me connecte sur chaque site pour allez faire la mise a jours


je profite donc des vacances pour faire une administration centralisé sur un site centralisateur

toutes mes bases ayant la même architecture.

ma logique de travail est la suivante :

--- Création d'une vue avec un select pour avoir la base de travail.

exemple de mon controler

    public function modeconteAction() {
        // generation de la vue dans le controller
        $this->checkLogin();
        if (!$this->isAdmin()) $this->_redirect('/');
        $this->view->dbusers = Utils_Dbuser::getdbuserdifautre();
        $this->view->products = Utils_Product::getprodlibplusglobal();
        if ($this->getRequest()->isPost()) return $this->modeconteProcess();
    }



    public function modeconteProcess() {
        // pour la selcetion de la base de travail
        $type = $this->getRequest()->getParam('type');
        if (!in_array($type, array('Credentials', 'Selection'))) return;
        $method = 'modeconte'.ucfirst($type).'Process';
        return $this->$method();
    }

    public function modeconteSelectionProcess() {
    // la base est selectionne pour avoir la vue correct avec la base désiré
    }   

--- le detail de ma requete pour la vue

    static
    public function getprodlibplusglobal($limit = 0) {
        $sqlLimit = $limit > 0 ? "LIMIT $limit" : '';
       
        $selectdb = Zend_Db_Table::getDefaultAdapter();
            if(isset($_POST['selectdb'])) {
            $leselectdb = $_POST['selectdb'] ;
           
            $db = Zend_Db_Table::getDefaultAdapter();
            $res = $db->query("SELECT * FROM dbuser WHERE dbname=:dbmane", array('dbmane' => $leselectdb));
                foreach ($res->fetchAll() as $row) {
                $password = $row['password'];
                $dbname = $row['dbname'];
                $host = $row['host'];
                $username = $row['username'];
                }
           
            $selectdb = Zend_Db::factory('Pdo_Mysql', array(
            'host'             => $host,
            'username'         => $username,
            'password'         => $password,
            'dbname'           => $dbname
            ));   
            }
            else $selectdb = Zend_Db_Table::getDefaultAdapter();
       
        $res = $selectdb->query("SELECT * FROM product
        INNER JOIN account ON product.owner=account.email
        WHERE 1 AND (product.libplus='' OR product.name='') ORDER BY product.ctime DESC  limit 10");
        return $res->fetchAll();
    }

   
--- Mise à jours de la base selectionné LORSQUE JE SUIS EN MODE SITE PAR SITE

exemple de mon controler    
   
    public function modeconteCredentialsProcess() {
    // mise a jours de la base
    ini_set ('display_errors', 'on');
    $params = $this->getRequest()->getParams();
    $errs = '';
    $clefs = array(
        'id' => 'id',
        'name' => 'name',
        'libplus' => 'libplus',
        'category_id' => 'category_id',
        'hidden' => 'hidden',
        );
    foreach ($params as $k => $v) {
        $f = explode(':', $k, 2);
        if (count($f) != 2) continue;
        $ids = $f[0];
        $key = $f[1];
        if ($key == 'id') $v = stripslashes($v);
        if ($key == 'name') $v = stripslashes($v);
        if ($key == 'libplus') $v = nl2br(stripslashes($v));
        if ($key == 'category_id') $v = stripslashes($v);
        if ($key == 'hidden') $v = $v == 'on' ? 1 : 0;
        require_once 'KS/Product.php';
        // Ensure library/ is on include_path
        set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH.'/httpdocs/library/'),
        get_include_path(),
        )));
        $ch = new KS_product();
        if ($ch->load($ids)) {
        $ch->$key = $v;
        $ch->save();
        } else {
        $clef = $clefs[$key];
        $errs .= "N'a pas pu traité $ids:$clef de value $v<br/>\n";
        }
        }
        if ($errs == '') {
        $this->_redirect('dbuser/modeconte');
        } else {
        $this->view->errors = $errs;
        }
    }   

Le problème ai que la mise a jours ne se faire pas car le controler ne se connecte pas a la BONNE base

avez vous une piste de solution que je puisse exploiter
type conservation de la "factory" du bout en bout

Pour information mes bases sont parfois hebergé à distance donc la solution d'une base commune a tous les site n'est pas envisagable

merci de votre aide

Marc

Dernière modification par poultier (23-08-2013 01:33:46)

Hors ligne

 

#2 23-08-2013 01:28:14

poultier
Nouveau membre
Date d'inscription: 14-01-2012
Messages: 3

Re: [ZF 1.10] UPDATE multidb [résolu]

bonjour,
j'ai obtenu la réponse sur un autre forum mais je vous fait partagé la solution "ma" solution au cas ou.

cela coincé a niveau de la mise a jours car je restais sur la connexion par défaut.

en effet, étant novice sur zend je n'en maitrise pas tous les usages,

donc ma réponse risque d'être longue, je m'en excuse par avance.

J'ai contacté en parallèle le développeur originel du site qui m'a apporté une solution.


ajout au niveau du controller
public function modeconteAction()

if(isset($_POST['selectdb'])) {
$this->view->dbuseractive = Utils_Dbuser::getdbuseractive();
}
----------------------

le Utils_Dbuser::getdbuseractive(); en detail

qui reprend les valeurs de connexion a affiché dans la vue (qui plante avant avant de faire le select je vais encore travailler ce point pour eviter les erreurs inutiles )

public function getdbuseractive () {
$paramdba = new stdClass ;
$paramdba->site = '';
$paramdba->password = '';
$paramdba->dbname = '';
$paramdba->host = '';
$paramdba->username = '';

$leselectdb ='root';

if(isset($_POST['selectdb'])) {
$leselectdb = $_POST['selectdb'] ;

$db = Zend_Db_Table::getDefaultAdapter();

$res = $db->query("SELECT * FROM dbuser WHERE dbname=:dbmane", array('dbmane' => $leselectdb));
foreach ($res->fetchAll() as $row) {
//if ($row = $res->fetch()) {
$paramdba->site = $row['site'];
$paramdba->password = $row['password'];
$paramdba->dbname = $row['dbname'];
$paramdba->host = $row['host'];
$paramdba->username = $row['username'];
}
return $paramdba;
}
return $paramdba;
}

-------------------------------------------------
enfin, dans le controleur au niveau du credential

public function modeconteCredentialsProcess() {
// mise a jours de la base
ini_set ('display_errors', 'on');

/* */
$dbname = $this->getRequest()->getParam('dbname');
$host = $this->getRequest()->getParam('host');
$username = $this->getRequest()->getParam('username');
$password = $this->getRequest()->getParam('password');

$selectdbmaj = Zend_Db::factory('Pdo_Mysql', array(
'host' => $host,
'username' => $username,
'password' => $password,
'dbname' => $dbname
));

Zend_Db_Table_Abstract::setDefaultAdapter($selectdbmaj);

$params = $this->getRequest()->getParams();

voila.

Hors ligne

 

#3 23-02-2014 23:05:59

Wikio41
Nouveau membre
Date d'inscription: 23-02-2014
Messages: 1

Re: [ZF 1.10] UPDATE multidb [résolu]

Merci smile

Hors ligne

 

#4 23-02-2014 23:11:20

poultier
Nouveau membre
Date d'inscription: 14-01-2012
Messages: 3

Re: [ZF 1.10] UPDATE multidb [résolu]

Pas de quoi, ca fait parti du jeux

tu m'aides
je t'aide

bon dev ))

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages