2016-07-26 204 views
1

我在許多PHP文件中使用相同的代碼塊,有時在相同的PHP文件中(例如,當存在if/else。我知道有更好的方法,但我不太確定如何做到這一點。我想替換的東西這麼大的塊,但不知道什麼適合。require可能?減少PHP中的重複代碼

$hostname = 'localhost'; 
$database = 'dev_testing'; 
$username = 'root'; 
$password = 'XXXXXX'; 
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+12

只能連接到DB ** ONCE **。多連接沒有意義,除非你需要使用不同的憑證訪問數據庫。因此你把它放到一個函數或單獨的文件中,並且在腳本的開始處包含/需要一次。人們盲目地唾棄全局變量,但共享數據庫句柄是全球範例的理想用例。 –

回答

5

答案通過@ maalls和@TahaPaksu都很好,但@ marcB的評論甚至更好:通常你只想在每個腳本執行時連接到數據庫一次。我不想在dependency injection的方向上踢你,但作爲一箇中間解決方案,我想建議這個類,它看起來大致像一個單例,但實際上是Memoization模式實現(另請參見PHP Design Patterns其他模式示例)。

無論如何:代碼:

class Database() { 

    static private $connection = null; 

    public static function getConnection() { 
    if (static::$connection === null) { 
     $hostname = 'localhost'; 
     $database = 'dev_testing'; 
     $username = 'root'; 
     $password = 'XXXXXX'; 
     $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
     $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     static::$connection = $dbh; 
    } 

    return static::$connection; 
    } 
} 

在你的腳本,你可以把它用

$dbh = Database::getConnection(); 

您可以撥打該行經常你喜歡,但它只能連接到數據庫第一次需要該腳本。隨後的調用將只返回相同的連接。這將爲您的數據庫節省相當多的開銷。

+0

是的單身人士更好。 –

+1

你忘了讓函數getConnection也是靜態的 – DarkBee

+0

那麼我的解決方案只連接數據庫一次。 – maalls

3

創建一個單獨的文件(例如「connection.php」),把代碼它以及您需要的任何地方,在您的代碼開始時包括以下內容:

require_once('connection.php'); 
+1

這可能會破壞現有代碼而無需進行其他修改。 'require_once'被執行一次。如果您只是將問題中的代碼片段放在一個文件中,並將其包含在某處帶有'require_once'的地方,它將在調用範圍中設置一個變量'$ dbh'。如果你'require_once'在下一個地方,代碼將不會被執行,並且你將不會得到一個新的變量。 'require'可能是OP的直接替換,但'require_once'很可能會破壞事物,特別是如果OP在函數或類中使用它們的代碼。 – GolezTrol

+0

我明確表示要把require_once放在代碼的開始處...... – maalls

+0

OP說他在多個文件中有這樣的代碼,有時在同一個文件中有多次。如果代碼需要每次執行(可能是這樣,那麼爲什麼它會在那裏),那麼只需將require_once放在頂部就行不通了。這隻會在所有東西都是單一的全球範圍內起作用,但我真誠希望這不是您的PHP腳本級別。 – GolezTrol

3

,你可以使用全局函數,你在你的PHP文件的頂部包括:

require_once("db.php"); 

文件db.php

function db_connect(){ 
    $hostname = 'localhost'; 
    $database = 'dev_testing'; 
    $username = 'root'; 
    $password = 'XXXXXX'; 
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

,並在你的文件:

$dbh = db_connect(); 
... 
// don't forget to close db before you open a new connection! 
$dbh = null; 
+0

對於這個工作,功能應該返回$ dbh – maalls

+0

是的,我忘了。對不起;) –