2010-11-24 5 views
0

Tous,Wrapper à Zend_Db échoue

j'ai écrit l'emballage suivant qui étend la classe Zend_Db pour fournir une connectivité db à mon application entière. La connectivité db fonctionne correctement, mais elle échoue à exécuter des requêtes lorsqu'elle est invoquée à partir d'une classe différente.

class Testapp_DB extends Zend_Db { 

     //Declare member variables. 
     public $db   = null; 
     public $db_host  = ""; 
     public $db_database = ""; 
     public $db_username = ""; 
     public $db_password = ""; 


public function __construct() 
     { 

      //Read Database Info from Config File 
      $this->db_host  = Testapp_Registry::get('config')->db->mysql->host; 
      $this->db_database = Testapp_Registry::get('config')->db->mysql->dbname; 
      $this->db_username = Testapp_Registry::get('config')->db->mysql->username; 
      $this->db_password = Testapp_Registry::get('config')->db->mysql->password; 

      $db = Zend_Db::factory('Mysqli', array(
       'host'  => $this->db_host, 
       'username' => $this->db_username, 
       'password' => $this->db_password, 
       'dbname' => $this->db_database 
      )); 

      $db->getConnection(); //Works fine 
      $this->db = $db; 
} 
} 

Essayer d'exécuter la requête dans un fichier PHP qui comprend Testapp_DB - ne ..

<?php 

$db = new Testapp_DB(); 
print_r($db); //I can see the DB object here 
$sql = 'SELECT * FROM tb_Log'; 
$result = $db->fetchAll($sql, 2); //This method fails.. Don't know why. Any ideas? 
print_r($result); 
?> 

Quelqu'un peut-il expliquer s'il vous plaît, pourquoi la méthode fetchAll échoue?

Merci

Répondre

1

* Zend_Db * ne marche pas avoir une méthode autre que usine().

Je vraiment obtenir ce que vous essayez de résoudre cette façon, mais pour autant que je peux voir que vous avez besoin d'appeler requête() cette façon

$db->db->query(); 
+0

Merci. Cela fonctionne très bien .. Comment puis-je modifier la classe Testapp_DB de telle sorte que je puisse accéder à $ db-> query() au lieu de $ db-> db-> query()? Puis-je ajouter un motif singleton? – Jake

+0

Nevermind .. Compris en créant un motif singleton – Jake

0

Peut-être au lieu d'utiliser votre emballage, essayez ceci:

// Note: change your config to have a 'params' entry 
$db = Zend_Db::factory(Testapp_Registry::get('config')->db->mysql); 
Zend_Db_Table_Abstract::setDefaultAdapter($db); 
Zend_Registry::set('database', $db); 

// in your config 
...mysql.params.host = ... 
...mysql.params.dbname = ... 
...mysql.params.username = ... 
...mysql.params.password = ... 

Ensuite, vos objets Zend_Db_Table auront la connectivité, et en plus vous pouvez saisir la connexion à l'aide Zend_Registry::get('database'). Et, vous ne créerez qu'une seule connexion à la base de données une fois par demande.

0

Essayez de créer un fichier SQL comme schema.mysql.sql, puis le tester sur phpMyAdmin et quand il est exempt de bogues exécuter ce code:

$bootstrap = $application->getBootstrap(); 
$bootstrap->bootstrap(‘db’); 
$config = $bootstrap->getResource(‘db’)->getConfig(); 
$runCommand = “mysql -h “.$config["host"].” -P “.$config["port"].” -u’”.$config["username"].”‘ -p’”.$config["password"].”‘ “.$config["dbname"].” < “.dirname(__FILE__) . ‘/schema.mysql.sql’; 
echo $runCommand; 
system($runCommand); 

Hope this helps! http://www.unexpectedit.com/zend-php/zend-db-exec-a-sql-file