IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

UPDATE multidb [ZF 1.10]


Sujet :

Zend_Db PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut UPDATE multidb
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    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

  2. #2
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonjour POULTIER,

    Tu dis avoir un problème de mise à jour mais je ne vois aucune requête INSERT ou UPDATE dans tes fonctions.

    Ou alors tu ne récupères pas les bonnes informations dans les SELECT présentés et donc tu ne nous a pas montré ces fameuses requêtes.

    As-tu une erreur à l'exécution ?

    De ce que je vois, ta fonction getprodlibplusglobal() est celle qui gère la connexion à la bonne base de données.

    - Si tu as un param selectDb tu choisis la BD du nom de ce param
    - Sinon la base par défaut

    C'est bien ça ? Si oui, ça coince où ? Tes requêtes fonctionnent bien ?

    Ta variable $sqlLimit n'est jamais utilisée.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut suite et fin
    bonjour,

    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.

    mais je vais dans un premier temps répondre à vos questions complémentaires :

    " Tu dis avoir un problème de mise à jour mais je ne vois aucune requête INSERT ou UPDATE dans tes fonctions. "

    de ce que j'en ai compris cela ce passe dans le "credentials" au niveau de

    $ch = new KS_product(); // étant le lieu de definition du format de la table

    if ($ch->load($ids)) // étant le lieu de chargement de la donné d'origine avant changement

    "Ou alors tu ne récupères pas les bonnes informations dans les SELECT présentés et donc tu ne nous a pas montré ces fameuses requêtes."

    si sauf erreur c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->view->products = Utils_Product::getprodlibplusglobal();
    que j'ai détaillé a part et qui fonctionne en affichage de données.

    "Ta variable $sqlLimit n'est jamais utilisée. "
    en effet c'est un résidu de la partie administration du site via le site web d'origine et non depuis le site centralisateur.

    donc la solution que j'ai utilisé est la suivante :

    ajout au niveau du controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function modeconteAction() 
     
    $this->view->dbuseractive = Utils_Dbuser::getdbuseractive();
    le Utils_Dbuser::getdbuseractive(); en detail

    qui reprend les valeurs de connexion a affiché dans la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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();
    en tous état de cause, Merci à vous d'avoir pris le temps de me répondre

  4. #4
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Ok nice, bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11
  3. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo