it-swarm.com.de

Verwenden Sie eine PDO-Verbindung über mehrere Module?

Ich habe mehrere Module auf derselben Seite, die über PDO-Verbindungen einzeln eine Verbindung zu derselben externen Datenbank herstellen. Die Website wird langsamer, da ich mehr Module hinzugefügt habe. Ich vermute, dass eine mehrfache Verbindung mit derselben externen Datenbank die Verlangsamung verlangsamt.

Jetzt möchte ich mich einmal mit der externen Datenbank verbinden und diese Verbindung in allen Modulen verwenden. Wie mache ich das? Ich möchte auch, dass die Website aktualisiert werden kann, ohne meinen Code zu entfernen.

Ich verwende gerne eine normale PHP-Abfrage anstelle der Joomla-Abfrage. Deshalb habe ich mit JFactory keine neue Verbindung zur externen Datenbank hergestellt.

1
loranga

Es gibt eine Reihe von Möglichkeiten, um das zu erreichen, wonach Sie suchen - das Folgende ist nur eine Idee. Anstatt Ihren eigenen Singleton zu schreiben, können Sie ein Objekt mit Ihrer Datenbankverbindung (und möglicherweise einem Teil Ihres Datenbankcodes) an eines der verfügbaren Singletons anhängen, auf die Sie bereits über die Factory zugreifen können. Der folgende Code würde in der Eintragsdatei Ihres Moduls vorhanden sein, und die zusätzliche Klasse würde sich in einer Datei im selben Verzeichnis befinden.

// Grab a copy of the application object
$app = JFactory::getApplication();
// Check if we've already added our extra object
if(!isset($app->extraDB)){
    require_once 'ExtraDB.php'; // include the file with a class with all our stuff in it
    $app->extraDB = new ExtraDB; // Piggyback our new db object onto the application
}
// the same object is now available to all modules containing this code
echo $app->extraDB->example();
1
jamesgarrett

Eine Antwort auf diese Frage ist

Erstellen einer einzelnen Bibliothek, auf die alle Module zugreifen können.

Erstellen Sie Ihre eigenen PHP-Klassen. Fügen Sie sie in Ihrem eigenen Bibliotheksordner in/library Ihrer Joomla-Installation hinzu.

Klassen in einem Ordner, die einer Namenskonvention folgen, können gemeinsam mit der Methode JLoader :: remove () registriert werden. Die Discover-Methode überprüft die Dateinamen in einem Ordner und registriert Klassen basierend auf diesen Namen.

Dann benötigen Sie einen Loader, um Ihre Bibliotheksklassendateien zu laden. Dies kann über erfolgen

  1. Entdecken Sie Ihre Bibliothek

// Registriere alle Dateien im Ordner/library/mylib als Klassen mit einem Namen wie: MyLib JLoader :: remove ('Mylib', JPATH_LIBRARIES. '/ Mylib');

  1. Stellen Sie Ihren Klassennamen ein Präfix voran, damit sie leicht erkennbar sind.

// Weisen Sie den Auto-Loader an, in einem bestimmten Ordner nach Klassen zu suchen, die mit "Mylib" beginnen. JLoader :: registerPrefix ('Mylib', JPATH_LIBRARIES. '/ Mylib');

Für ein einzelnes Datenbankobjekt in allen Modulen sollte Ihre Datenbankklasse dem Singleton-Muster folgen.

Singletons sollen sicherstellen, dass es eine einzelne Klasseninstanz (daher der Name Singleton) gibt, und dies ist ein globaler Zugriffspunkt für diese Instanz. Zusammen mit dieser einzelnen Instanz haben wir globalen Zugriff und eine verzögerte Initialisierung.

Ein Beispiel für eine DB-Klasse mit Singleton-Muster hier:

<?php
/**
* PDO Singleton Class v.1.0
*/
class DB {
    protected static $instance;
    protected function __construct() {}
    public static function getInstance() {
        if(empty(self::$instance)) {
            $db_info = array(
                "db_Host" => "localhost",
                "db_port" => "3306",
                "db_user" => "user",
                "db_pass" => "pass",
                "db_name" => "ftonato",
                "db_charset" => "UTF-8");
            try {
                self::$instance = new PDO("mysql:Host=".$db_info['db_Host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
                self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);  
                self::$instance->query('SET NAMES utf8');
                self::$instance->query('SET CHARACTER SET utf8');
            } catch(PDOException $error) {
                echo $error->getMessage();
            }
        }
        return self::$instance;
    }
    public static function setCharsetEncoding() {
        if (self::$instance == null) {
            self::connect();
        }
        self::$instance->exec(
            "SET NAMES 'utf8';
            SET character_set_connection=utf8;
            SET character_set_client=utf8;
            SET character_set_results=utf8");
    }
}
?>

Es kann jetzt wie folgt verwendet werden:

<?php
require_once ('database.class.php');
try {
    $db = DB::getInstance();
    DB::setCharsetEncoding();
    $sqlExample = 'SELECT * FROM users WHERE _id = 1';
    $stm = $db->prepare($sqlExample);
    $stm->execute();
    return $stm->fetchAll(PDO::FETCH_ASSOC);

} catch (Exception $e) {
    print $e->getMessage();

}
0
Andy Joe