Contexte: Joomla 3.8.5 Base de données MySQL Joomla = berrien_dev Base de données externe = BMP PHP 5.6.33
J'essaie d'accéder à un composant. J'écris une base de données externe située sur le même serveur MySQL que mon site Joomla. Après avoir installé et exécuté le composant côté site, je reçois ce message deux fois "La table 'berrien_dev.Estim' n'existe pas". Comme vous pouvez le voir, il essaie de trouver ma table dans la mauvaise base de données et je ne comprends pas pourquoi.
Voici mon modèle:
protected function getListQuery()
{
// Initialize variables and connect to remote MS SQL server
$option = array(); //prevent problems
$option['driver'] = 'mysqli'; // Database driver name
$option['Host'] = 'localhost'; // Database Host name
$option['user'] = 'mysqluser'; // User for database authentication
$option['password'] = 'somepassword'; // Password for database authentication
$option['database'] = 'BMP'; // Database name
$option['prefix'] = ''; // Database prefix (may be empty)
// Connect to external database
$E2db = JDatabaseDriver::getInstance( $option );
$query = $E2db->getQuery(true);
// Create the base select statement.
$query->select('a.PartNo as PartNo, a.Descrip as Descrip, a.CustCode as CustCode,
a.EntDate as EntDate, a.EntBy as EntBy, a.ModDate as ModDate, a.ModBy as Modby')
->from($E2db->quoteName('Estim', 'a'));
return $query;
}
Merci de votre aide!
Vous devez indiquer au modèle la base de données que vous souhaitez utiliser. Dans votre code, la requête est correcte mais elle sera exécutée sur le pilote de base de données par défaut.
Remplacez le __costruct du modèle de la manière suivante:
public function __construct($config = array()){
parent::__construct($config);
$option = array(); //prevent problems
$option['driver'] = 'mysql'; // Database driver name
$option['Host'] = 'localhost'; // Database Host name
$option['user'] = 'mysqluser'; // User for database authentication
$option['password'] = 'somepassword'; // Password for database authentication
$option['database'] = 'BMP'; // Database name
$option['prefix'] = ''; // Database prefix (may be empty)
$db = JDatabaseDriver::getInstance( $option );
parent::setDbo($db);
}
Où avez-vous obtenu ce code? Je ne suis pas sûr que vous puissiez faire ça.
Essayez de vous connecter $ E2db et JFactory :: getDbo () pour voir s’il s’agit du même objet et si les données de connexion ont été enregistrées.
Sinon, vous pourriez peut-être créer une nouvelle instance du dbo. Quelque chose comme
$bmpDbo=JDatabaseDriverPdomysql($options);
mais je n'ai jamais essayé, je ne suis pas sûr que ça va marcher.
Mais pourquoi ne pas vous simplifier la vie, s’ils se trouvent sur le même serveur, ajoutez les privilèges à la table de la deuxième base de données pour votre utilisateur, et simplement
$db = JFactory::getDbo();
$db->select('BMP');
... puis lancez simplement votre requête.