2012-10-02 15 views
1

我用下面的這個類連接到我的sql數據庫。一切都很好,但我認爲我沒有以正確的方式使用它。當我的網站上加載一個頁面時,會調用一些函數來顯示文本,贊助商......並且每個函數都會創建一個mysql對象。這是錯的嗎??它可以創建一個太多的連接問題?我應該創建一個對象並將它傳遞給函數的一個參數嗎?或者有沒有辦法讓這個對象成爲全局的?PHP在類之外的函數中重用MySQL對象

class clsMysql 
{ 
    var $con; 
    var $last_id; 

    function __construct($db = array()) 
    { 
     $this->con = mysql_connect($db['host'], $db['user'], $db['pass'], true, MYSQL_CLIENT_INTERACTIVE) or die ('Error connecting to MySQL'); 
     mysql_select_db($db['db'], $this->con) or die('Database ' . $db['db'] . ' does not exist!'); 
    } 

    function __destruct() { 
     mysql_close($this->con); 
    } 

    // fonction qui exécute la requête SQL 
    function fxQuery($sql) { 
     return mysql_query($sql, $this->con); 
    } 

    // fonction qui retourne la variable du résultat de la requête SQL 
    function fxGetVar($sql) { 
     return $this->fxFetchArray(0, $sql); 
    } 

    // fonction qui retourne un tableau contenant la ligne unique du résultat de la requête SQL 
    function fxGetRow($sql) { 
     return $this->fxFetchArray(1, $sql); 
    } 

    // fonction qui retourne un tableau contenant le résultat de la requête SQL 
    function fxGetResults($sql) { 
     return $this->fxFetchArray(2, $sql); 
    } 

    // fonction qui met la requête dans un tableau 
    function fxFetchArray($p, $sql) 
    { 
     $qry = $this->fxQuery($sql); 
     $nb = mysql_num_rows($qry); 
     $this->last_id = mysql_insert_id($this->con); 

     if ($nb > 0) 
     { 
      switch ($p) 
      { 
       // fxGetVar 
       case 0: 
        $rec = mysql_fetch_array($qry, MYSQL_NUM); 
        $mem_results = $rec[0]; 
        break; 

       // fxGetRow 
       case 1: 
        $rec = mysql_fetch_array($qry, MYSQL_ASSOC); 

        foreach (array_keys($rec) as $field) 
         $mem_results[$field] = $rec[$field]; 
        break; 

       // fxGetResults 
       case 2: 
        $ctr = 1; 

        while ($rec = mysql_fetch_array($qry, MYSQL_ASSOC)) 
        { 
         foreach (array_keys($rec) as $field) 
          $mem_results[$ctr][$field] = $rec[$field]; 

         $ctr++; 
        } 
      } 

      return $mem_results; 
     } 
     else 
      return null; 
    } 

    //fonction pour échapper les caractères pour les variables post ou get 
    //param: valeur 
    //retourne la valeur échappée 
    function fxEscape($values) 
    { 
     if (is_array($values)) 
      $values = array_map(array($this, 'fxEscape'), $values); 
     else 
     { 
      // Stripslashes 
      if (get_magic_quotes_gpc()) 
       $values = stripslashes($values); 

      if ((int)ini_get('magic_quotes_sybase')) 
       $values = str_replace("''", "'", $values); 

      $values = mysql_real_escape_string($values, $this->con); 
     } 

     return $values; 
    } 

    function fxGetLastId() { 
     return $this->last_id; 
    } 
} 
+0

加上'$ GLOBALS [ 'DB'] =新clsMysql();'你主要腳本的頂部,並使用'$ GLOBALS ['分貝']'在你的所有功能中。 – air4x

+0

謝謝,這解決了我的問題 – jesse94

回答

2

您應該能夠實例化對象一次並多次調用查詢方法。它應該防止它爲每個查詢建立連接。

$mysql = new clsMysql(); 

$mysql->fxQuery("select * from something"); 

$mysql->fxQuery("Another Query"); 

$mysql->fxQuery("Yet another query..."); 
0

在一個簡單的方法:

// on the top of your code 
$db = new clsMysql(); 

,然後在你的類方法或功能:

// class 
class abc { 

    public function xyz() { 
     global $db;   // make it global here 

     // use it! 
    } 
} 

以另一種方式,更OOP:

// main class 
class system { 

    // variable to the store database object 
    public $db; 

    // constructor 
    public function __constructor() { 

     include('mysql.class.php'); // your mysql class file 

     $this->db = new clsMysql(); 
    } 

} 

在其他課程上,你可以然後210級system

// sample class 
class sample extends system { 

    // sample function 
    public function sample_method() { 

     $this->db->fxQuery('SELECT * FROM table'); 

} 

和類之外:

$app = new system(); 
$result = $app->db->fxQuery('SELECT 1'); 
相關問題