2011-08-16 133 views
1

讓我先解釋一下。 我有幾個全局數據庫連接,並有幾個簡單的函數,使用每個和執行查詢等。是否有可能使php全局在函數範圍內自動提供?

因爲我想要多次使用連接,並且爲了節省每次在每個函數中定義它們的時間,我在文檔的頂部創建了它們作爲全局變量。 但是我只是想知道的是不必編寫

global $mysql_db1, $mysql_db2, $mysql_db3, $mysql_db4, $mysql_db5; 

反正有做到這一點沒有我不必複製和粘貼每一次呢?

我知道它微不足道,但我只是想加快自己的發展,

回答

0

全局通常被認爲是不好的做法。我不會在你高談闊論一番,但看看這篇文章:http://blog.case.edu/gps10/2006/07/22/why_global_variables_in_php_is_bad_programming_practice

可以使用超全局$GLOBALS訪問已在全球範圍內(docs)中定義的任何變量。因此,在您的示例代碼中,僅使用$GLOBALS['mysql_db1']就相當於具有行global $mysql_db1;,然後使用$mysql_db1

我不能強調這個計劃有多糟糕(沒有強調)。在你開發的整個過程中,你可能都會很滿意,但可憐的可憐的Johnny Nextguy,如果你包含一個也使用全局變量的第三方腳本,可能會有代碼之神拯救你......並且存在變量衝突名。現在你在爲它而努力!

如上所述,您最好將數據庫功能封裝在一個類中。如果你使用靜態類,你仍然擁有全局變量的所有好處,沒有受到污染的範圍或覆蓋的危險。

這裏是一個示例數據庫類,隨着使用沿着:

// put this in a library file or some place that all scripts include 
require_once('database_class.php'); 
$db = new db(array(
'host'=>'localhost' 
'user'=>'db_user_name' 
'password'=>'db_password', 
'database_name'=>'my_database' 
)); 


// now anywhere in code you want to use it 
$array = db::getRows('SELECT id, name FROM users'); 
$field = db::getField('SELECT name FROM users WHERE id=10'); 


<?php 
// database_class.php 
class db { 
    static protected $resource_link = null; 

    function __construct($args=false) { 
     if ($args===false || !is_array($args)) 
      return false; 
     if (
      !isset($args['host']) || 
      !isset($args['user']) || 
      !isset($args['password']) || 
      !isset($args['database_name']) 
     ) 
      return critical_error('Missing database configuration data.'); 


     self::$resource_link = @mysql_connect($args['host'],$args['user'],$args['password']); 
     if (!self::$resource_link) 
      return critical_error('Error connecting to database 2001. MySQL said:<br>'.mysql_error()); 
     @mysql_select_db($args['database_name'], self::$resource_link); 
     return; 
    } 


    // return a single-dimmension array of fields as string 
    static public function getFields ($sql=false, $field=false) { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) { 
       $res = array(); 
       while ($this_row = mysql_fetch_array($query_obj)) { 
        if ($field !== false && isset($this_row[$field])) 
         $res[] = $this_row[$field]; 
        else 
         $res[] = $this_row[0]; 
       } 
      } // end :: if query object is not null 
     } // end :: if $sql is not false 
     return $res; 
    } 

    // return a single-dimmension array of fields as string with keyfield as key 
    static public function getKeyFields ($sql=false, $key_field='id', $list_field='id') { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) { 
       while ($this_row = mysql_fetch_array($query_obj)) { 
        if (isset($this_row[$key_field])) 
         $res[$this_row[$key_field]] = $this_row[$list_field]; 
       } 
      } // end :: if query object is not null 
     } // end :: if $sql is not false 
     return $res; 
    } 

    // return a single field as string from the first row of results 
    static public function getField ($sql=false) { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) { 
       $this_array = mysql_fetch_array($query_obj); 
       if (is_array($this_array)) 
        return $this_array[0]; 
      } // end :: if query object is not null 
     } // end :: if $sql is not false 
     return $res; 
    } 

    // return a single row as an array 
    static public function getRow ($sql=false) { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) 
       $res = mysql_fetch_assoc($query_obj); 
     } // end :: if $sql is not false 
     return $res; 
    } 

    // return an array of rows as arrays of strings 
    static public function getRows ($sql=false) { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      $res = array(); 
      if ($query_obj) { 
       while ($this_row = mysql_fetch_assoc($query_obj)) { 
        $res[] = $this_row; 
       } 
      } // end :: if query object is not null 
     } // end :: if $sql is not false 
     return $res; 
    } 

    // return an array of rows as arrays of strings, using specified field as main array keys 
    static public function getKeyRows ($sql=false, $key_field='id', $include_key_in_results=true) { 
     $res = null; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) { 
       $res = array(); 
       while ($this_row = mysql_fetch_assoc($query_obj)) { 
        if (isset($this_row[$key_field])) { 
         $res[$this_row[$key_field]] = $this_row; 
         if ($include_key_in_results == false) 
          unset($res[$this_row[$key_field]][$key_field]); 
        } // end :: if checking for key field in result array 
       } // end :: while looping query obj 
      } // end :: if query object is not null 
     } // end :: if $sql is not false 
     return $res; 
    } 


    // do an update query, return true if no error occurs 
    static public function update ($sql=false) { 
     $res = false; 
     if ($sql!==false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj && strlen(mysql_error()) < 1) 
       $res = true; 
     } 
     return $res; 
    } 

    // do an insert query, return the auto increment ID (if there is one) 
    static public function insert ($sql=false) { 
     $res = null; 
     if ($sql !== false) { 
      $query_obj = mysql_query($sql, self::$resource_link); 
      if ($query_obj) 
       $res = mysql_insert_id(self::$resource_link); 
     } 
     return $res; 
    }  
} 
?> 
+0

我知道這些問題,並知道第三方mod將會發生衝突。我正在努力節省時間,而我正在寫東西,並發現自己嘆了口氣,每次我忘了添加全局功能。我完全忘記了全局變量,它可以通過這種方式訪問​​。謝謝你的答案。 – PsyKzz

3

我想創建一個類的ConnectionManager存儲這些連接和使用DB使用類的一個實例,任何功能:)

如果您不想每次都放置參數,那麼使用Singleton也是一個好主意。

1

最好的辦法是以面向對象的方式聲明它們,比如單例的屬性,然後以這種方式訪問​​它們。如果你堅持以某種方式做事,會讓後來的開發人員感到難過,你可以使用$GLOBALS陣列。全局只是一個不好的的想法,坦率地說,我希望關鍵字可以從語言中觸發。

一個非常簡單的東西的版本,你可以使用:

class ConnectionHolder 
{ 
    public $mysql_db1; 

    private static $inst; 
    public static &getInstance() 
    { 
     if(!self::$inst) 
      self::$inst = new ConnectionHolder(); 
     return self::$inst; 
    } 

    private function __construct() 
    { 
     $this->mysql_db1 = // ... you may want another nameing convension. 
     // yada yada 
    } 
} 

然後,在你的函數:

$ch =& ConnectionHolder::getInstance() 
$ch->mysql_db1; 
0

在直接回答你的問題:沒有。

對你的問題的一個實際答案指出,全局並不是一個很熱的想法。請注意,我認爲那裏的大多數論點都是無效的,圍繞着其他人說「ewww,這很糟糕!」或者「你會釋放魔鬼!」。然而,他們圍繞着這個問題跳舞:如果你的程序的兩個部分爲了不同的目的嘗試使用相同的全局變量$foo(即不小心他們決定使用同一個名字),那麼就不能保證錯誤將會發生。這就是爲什麼建議使用其他存儲方法(如類)的原因,因爲名爲Foo的兩個類肯定會導致錯誤。

在你的程序的上下文中,可能會建議創建一個ConnectionManager單例,在那裏你可以通過編寫類似$conn1 = ConnectionManager::getConnection('conn1');的東西來獲取數據庫連接。

相關問題