2014-02-07 76 views
0

所以我有一個我在web應用中使用的函數列表。然而,大多數函數調用數據庫類。這裏有兩個功能,例如:爲多個函數聲明一個全局對象

function add_post($userid,$body,$cat_id,$user_link){   //This function inserts new posts into the db 

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 
$now = date("Y-m-d H:i:s"); 

$insertData = array(
    'user_id' => $userid, 
    'body' => $body, 
    'stamp' => $now, 
    'cat_id' => $cat_id, 
    'link' => $user_link 
    ); 

$db->insert('posts', $insertData); 

} 



function grab_username($userid){     //This function takes a user id, and returns the associated user_name 

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

$params = array($userid); 
$results = $db->rawQuery("SELECT username FROM users WHERE id = ?", $params); 

//print_r($results); 

foreach($results as $arrays){ 

    foreach($arrays as $name){ 
     return $name; 
    } 
    } 

} 

的問題是,我經常寫行:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

有沒有一種方法,我可以在全球聲明變量,有更多的東西是這樣的:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

function add_post($userid,$body,$cat_id,$user_link){   //This function inserts new posts into the db 

$now = date("Y-m-d H:i:s"); 

$insertData = array(
    'user_id' => $userid, 
    'body' => $body, 
    'stamp' => $now, 
    'cat_id' => $cat_id, 
    'link' => $user_link 
    ); 

    global $db->insert('posts', $insertData); 

} 

回答

0

有多種方式可以解決這個問題,但是最好的實現可以根據您的動作應用程序的結構和需求而變化。

你提到一個全局變量,它會工作,但通常被認爲是結構不佳:

someFunction(){ 
    global $db; 
    $db->insert('posts', $insertData); 
} 

另一種方法,這是稍微乾淨,但仍然沒有得到很好的組織是傳遞$db連接功能:

function myFunction($db, ...){ 
    $db->query(// etc); 
} 
myFunction($db); 

一個更好的版本,這將是組織中的一類的相關功能,然後注入數據庫:

class Posts { 
    public function listPosts($db, ...){ 
    $db->query(// etc); 
    } 
    public function getPost($db, ...){ 
    $db->query(// etc); 
    } 
} 

$posts = new Posts(); 
$posts->listPosts(); 

但是,您也可以決定製作這些static方法,您可以將$db傳遞給類構造函數並存儲它,這裏有很多選擇。

你也可以創建一個你自己的中心包裝類來返回連接。有一百萬個實現,但如果不知道更多關於應用程序結構的信息,您的類如何共享資源以及應用程序如何自動引導所有內容(如果有),就很難專門推薦一個。等

+0

我希望你是不嚴肅的。爲每個類創建一個單獨的數據庫連接? –

+0

如果他只使用這個類的單個實例,就像我個人解釋他的問題一樣,這樣可以。如果他使用多個實例,那麼明顯的依賴注入或獲取單個數據庫實例的一些中心方法會更好。 – helion3

+0

這不是他的應用程序中唯一的類。 –

-1

試試這個:

db.php中

class DB 
{ 

    public $conn; 
    private static $instance; 

    private function __construct() 
    { 
    $server = 'localhost'; 
    $user = 'root'; 
    $pass = 'root'; 
    $database = 'my_db'; 

    $this->conn = mysqli_connect($server,$user,$pass,$database); 
    } 

    public function query($sql) 
    { 
    $result = mysqli_query($this->conn,$sql); 
    return $result; 

    } 

    public static function getInstance() 
    { 
    if (!isset(self::$instance)) 
    { 
     $object = __CLASS__; 
     self::$instance = new $object; 
    } 
    return self::$instance; 
    } 
} 

現在,在任何頁面,你可以這樣做:

require("db.php"); 
$dbh = DB::getInstance(); 
$sql = "your sql query .."; 
$dbh->query($sql);