2009-11-13 4 views
-1

Voici ma classe de connexion DB. Le problème est que lorsque j'essaie d'accéder à la fonction CloseConnection à partir de mon code, cela donne une erreur: "Unknown MySQL localhost". J'utilise "dbconnection :: CloseConnection" à travers mes autres fichiers de code. Il ouvre avec succès la connexion, mais donne une erreur dans "$ conn".Une variable de connexion dans une classe génère une erreur lors de la fermeture de la connexion

final class dbconnection 
{ 

    private $conn; 
     //Opens connection for a MySQL DB 
     public static function OpenConnection() 
     { 
      require("../Config/dbconfig.php"); 
      $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD); 

      mysql_select_db('MyDB'); 

     } 

     //Closes connection for a MySQL DB 
     public static function CloseConnection() 
     { 
      mysql_close($conn); 

     } 
} 

Voici une méthode dans un autre fichier PHP d'où j'accéder aux fonctions ci-dessus:

public static function InsertRecord($inQuery) 
{ 
    dbconnection::OpenConnection(); 
    $resultSet = mysql_query($inQuery); 
    dbconnection::CloseConnection(); 
    return $resultSet;  
} 

Lorsque je supprime la ligne "DbConnection :: CloseConnection()", il fonctionne très bien. Je veux aussi savoir si c'est une bonne pratique de fermer immédiatement la connexion lorsque la tâche DB est terminée, ou devrais-je la garder ouverte jusqu'à ce que l'utilisation ferme le navigateur?

+0

Pourquoi n'utilisez-vous pas simplement des fonctions globales et des variables au lieu de cette classe statique? – hakre

Répondre

2

Essayez:

class dbconnection { 
    private static $conn; 

    public static function OpenConnection() { 
    require("../Config/dbconfig.php"); 
    self::$conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD); 
    mysql_select_db('MyDB'); 
    } 

    public static function CloseConnection() { 
    mysql_close(self::$conn); 
    } 
} 

Ce que vous faites tente d'accéder à la variable membre $conn mais vous le faites correctement si vous créez simplement une nouvelle variable (locale) à utiliser. Cela n'a pas d'importance sur open (la référence est simplement rejetée) mais de près vous n'avez plus affaire à une référence de ressource. Deuxièmement, vos fonctions sont statiques mais votre variable membre ne l'est pas. Ce sont les deux méthodes que vous utilisez pour accéder à des variables membres:

class A { 
    private $a; 
    private static $b; 

    public static function foo() { 
    $this->a = 3; // instance member 
    self::$b = 4; // static member 
    } 
} 

Edit: en ce qui concerne la dernière fonction, il fonctionne lorsque vous supprimez l'appel à CloseConnection() car il ne cherche plus d'accéder à une connexion de base de données via le variable locale $conn (ce qui provoquera une erreur).

Non, il n'est pas recommandé de fermer immédiatement une connexion à une base de données. La pratique la plus courante en PHP est simplement d'ouvrir une connexion en haut de votre script et de ne rien faire de plus. Lorsque le script se termine, il se ferme. Certaines personnes ouvrent des connexions à la demande, ce qui signifie qu'elles n'essaieront pas d'en créer une avant d'en avoir besoin. C'est une optimisation acceptable (du point de vue de ne pas ajouter de complexité inutile). Généralement, la connexion ne sera jamais explicitement fermée. Il sera fermé implicitement lorsque le script se termine.

Les scripts de longue durée peuvent utiliser une approche différente simplement pour ne pas maintenir inutilement les connexions ouvertes pendant des périodes prolongées.

Vous pouvez à un moment donné utiliser des connexions persistantes à la place.

La méthode ci-dessus est assez simple et suffisante pour certains sites assez grands. En règle générale, n'essayez pas d'optimiser ce genre de choses et d'introduire une complexité inutile jusqu'à ce que vous ayez réellement un problème à résoudre.

+0

@cletus: Qu'en est-il de ma dernière question? – RKh

Questions connexes